2012-02-11 60 views
5

我知道根據規範,hrefbase應該是一個絕對的URI。如何讓IE支持html基礎標記與相對href?如:<base href =「../」></base>`

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。

+0

我發現IE瀏覽器的基礎href工作得很好,只要你不嘗試去一個級別。 – Joshua 2012-02-11 03:52:11

+0

但我需要它去幾個級別 – Freewind 2012-02-11 03:55:31

+0

他們生成靜態html頁面。我需要他們在普通的http服務器上工作,但url無法預先確定。 – Freewind 2012-02-11 04:07:35

回答

5

使用此功能,您的網址轉換爲絕對:

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瀏覽器運行它。其他瀏覽器將自動獲取由base標記的href更新的window.location,並且此代碼段將再次更改它。因此,它寫成

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

PS:<base />是一個標籤,它不需要關閉一個。

更新如果它被設置包括端口號。

+0

謝謝,它運作良好。它支持帶端口的網址嗎?如:'http://aaa.com:8080/bbb'? – Freewind 2012-02-11 04:40:15

+0

@Freewind Nope,但用'h = l.protocol +'//'+ l.host +'替換'h = l.protocol +'//'+ l.host;':'+ l.port;'它會支持。我更新了代碼。 – Cheery 2012-02-11 04:43:04

+0

腳本很好。可惜你沒有使用有意義的變量...... – 2013-09-06 06:29:39