Как позволить IE поддерживать базовый тег html с относительным href?как: `</base> ` - PullRequest
5 голосов
/ 11 февраля 2012

Я знаю, согласно спецификации, href из base должно быть абсолютным URI.

href = uri [CT]
This attribute specifies an absolute URI that acts as the base URI for resolving relative URIs.

Но Firefox и Chrome поддерживают относительные URI, например, ../../, что очень важномоего текущего проекта.Я не нашел лучшего решения, кроме «относительный базовый href» для моего проекта.

Есть ли какие-либо хаки или рабочие площадки для IE, чтобы позволить ему поддерживать относительные URI?Мои веб-страницы теперь хорошо работают в Firefox и Chrome, но они должны поддерживать IE.

1 Ответ

7 голосов
/ 11 февраля 2012

Используйте эту функцию для преобразования вашего URL в абсолютное значение:

function toAbsURL(s) { 
     var l = location, h, p, f, i; 
     if (/^\w+:/.test(s)) { 
       return s; 
     } 
     h = l.protocol + '//' + l.host + (l.port!=''?(':' + l.port):''); 
     if (s.indexOf('/') == 0) { 
       return h + s; 
     } 
     p = l.pathname.replace(/\/[^\/]*$/, ''); 
     f = s.match(/\.\.\//g); 
     if (f) { 
       s = s.substring(f.length * 3); 
       for (i = f.length; i--;) { 
         p = p.substring(0, p.lastIndexOf('/')); 
       } 
     } 
     return h + p + '/' + s; 
   }

Вы можете использовать

var base = document.getElementsByTagName('base')[0];
base.href = toAbsURL(base.href);

Пример http://jsfiddle.net/tEpkx/1/

За исключением того, что вы должныОпределите браузер и запустите его только для IE.Другие браузеры будут автоматически обновлять window.location с помощью href тега base, и этот фрагмент кода снова изменит его.Поэтому запишите его как

<!--[if IE]>
<script type="text/javascript">
var base = document.getElementsByTagName('base')[0];
base.href = toAbsURL(base.href);
</script>
<![endif]-->

ps: <base /> - это один тег, для которого не требуется закрывающий тег.

Обновлен , чтобы включить номер порта, еслиустановлено.

...