2012-02-11 10 views
5

Sé de acuerdo con la especificación, el href de base debe ser un URI absoluto.¿Cómo permitir que IE admita la etiqueta base html con href relativo? como: `<base href =" ../ "></base>`

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

Pero Firefox y Chrome admiten URI relativos, p. Ej. ../../, que es muy importante en mi proyecto actual. No encuentro una solución mejor que no sea "href de base relativa" para mi proyecto.

¿Hay algún truco o lugar de trabajo para que IE permita que sea compatible con los URI relativos? Mis páginas web funcionan bien en Firefox y Chrome ahora, pero tienen que ser compatibles con IE.

+0

Encontré para IE que href base funciona bien siempre y cuando no intentes subir un nivel. – Joshua

+0

Pero necesito que suba varios niveles – Freewind

+0

Se generan páginas html estáticas. Necesito que funcionen en un servidor http normal, pero la URL no puede predeterminarse. – Freewind

Respuesta

5

Utilice esta función para convertir su URL a la absoluta:

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; 
    } 

Usted podría utilizar

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

Ejemplo http://jsfiddle.net/tEpkx/1/

Salvo que usted tiene que detectar el navegador, también, y ejecutarlo solo para IE. Otros navegadores obtendrán window.location actualizado por el href de la etiqueta base automáticamente y este fragmento de código lo cambiará de nuevo. Por lo tanto escribir como

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

ps: <base /> es una sola etiqueta, que no requiere el cierre.

Actualizado para incluir el número de puerto si está configurado.

+0

gracias, funciona bien. ¿Admite una url con puerto? como: 'http: //aaa.com: 8080/bbb'? – Freewind

+0

@Freewind No, pero reemplace 'h = l.protocol + '//' + l.host;' con 'h = l.protocol + '//' + l.host + ':' + l.port;' y apoyará. He actualizado el código. – Cheery

+0

El script es bueno. Lástima que no usaste variables significativas, aunque ... –

Cuestiones relacionadas