2012-02-11 12 views
5

So che secondo le specifiche, il href di base dovrebbe essere un URI assoluto.Come consentire a IE di supportare il tag base html con href relativo? come: `<base href =" ../ "></base>`

Ma firefox e chrome supportano URI relativi, ad es. ../../, che è molto importante per il mio progetto attuale. Non trovo una soluzione migliore oltre a "base relativa href" per il mio progetto.

Esistono hack o aree di lavoro per consentire a IE di supportare gli URI relativi? Le mie pagine web ora funzionano bene con Firefox e Chrome, ma devono supportare IE.

+0

Ho trovato per IE che href di base funziona bene fino a quando non si tenta di salire di un livello. – Joshua

+0

Ma ho bisogno che salga per diversi livelli – Freewind

+0

Vengono generate pagine html statiche. Ho bisogno che funzionino su un normale server http, ma l'url non può essere predeterminato. – Freewind

risposta

5

Usare questa funzione per convertire l'URL della assoluta:

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

Si potrebbe utilizzare

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

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

parte il fatto che si deve rilevare il browser, anche, e eseguirlo solo per IE. Altri browser otterranno window.location aggiornato automaticamente dall'href del tag base e questo frammento di codice lo cambierà di nuovo. Quindi scrivere come

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

ps: <base /> è un singolo tag, non richiede la chiusura di uno.

Aggiornamento per includere il numero di porta se è impostato.

+0

grazie, funziona bene. Supporta un URL con porta? come: 'http: //aaa.com: 8080/bbb'? – Freewind

+0

@Freewind No, ma sostituire 'h = l.protocol + '//' + l.host;' con 'h = l.protocol + '//' + l.host + ':' + l.port;' e sosterrà. Ho aggiornato il codice. – Cheery

+0

La sceneggiatura è buona. Peccato che tu non abbia usato variabili significative però ... –

Problemi correlati