1. 程式人生 > >IE下使用location物件有時會出現“沒有許可權”的錯誤

IE下使用location物件有時會出現“沒有許可權”的錯誤

發生錯誤都是一個原因:沒有許可權(Permission denied)。從網上查了一下,沒有許可權實在是一個太常見的提示,微軟自己都提供了很多更新來解決本不應該出現的“沒有許可權”問題。很難講那些10%的使用者是沒有安裝哪個補丁導致的問題。

    PV程式碼很簡單,如下:

(function() {
    
var a = [], n = document.createElement('script');
    a.push('url=' + encodeURIComponent(location.href));
    a.push('referrer=' + encodeURIComponent(document.referrer));
    n.src = '....pv.gif';
    document.getElementsByTagName('head')[0].appendChild(n);
})();
    最有可能沒有許可權的程式碼就是location,因為之前也遇到過跨域時使用location提示沒有許可權的問題,因此縮小了範圍,把程式碼改成了:
(function() {
    
var a = [], n = document.createElement('script');
    try {
    a.push('url=' + encodeURIComponent(location.href));
    } catch (e) {
    setTimeout(arguments.callee, 0);
    return;
    }
    a.push('referrer=' + encodeURIComponent(document.referrer));
    n.src = '....pv.gif';
    document.getElementsByTagName('head')[0].appendChild(n);
})();
    這樣修改,資料正常了,問題解決了,但缺沒有合理的解釋,為啥這樣使用location會提示沒有許可權。可能我們的程式碼有些特殊,上面這段js是放在一個script標籤上,這個標籤的最開始還有一段別的程式碼(當然也很簡單),其中會設定一下document.domain,但是設定的document.domain就是當前的這個域,
而且這個標籤放在head標籤的最開始,沒有什麼iframe和 script標籤,因此也不會出現多重設定域的問題,理論上也不會出錯。現在的整個片段是這樣的:
<head>
<script type="text/javascript">
    document.domain = 'bai.sohu.com';
    ...  //  簡單程式碼

(function() {
    
var a = [], n = document.createElement('script');
    try {
    a.push('url=' + encodeURIComponent(location.href));
    } catch (e) {
    setTimeout(arguments.callee, 0);
    return;
    }
    a.push('referrer=' + encodeURIComponent(document.referrer));
    n.src = '....pv.gif';
    document.getElementsByTagName('head')[0].appendChild(n);
})();
</script>

    這是啥問題?只能說這是ie的bug,成因為:
    1. 程式碼都在一個script中,並且在一個佇列中執行
    2. 之前會設定document.domain,並且等於當前的域
    3. 後面的程式碼會使用location物件
    如果具備這些條件,那在某些ie下,會報“沒有許可權”的錯誤。

    有兩個解決方法:
    1. 使用location時進行try catch,如果發現是沒有許可權的問題,可以把程式碼放到下一個執行佇列中(setTimeout)

    2. 直接放到兩個獨立的script標籤上,一個上設定document.domain,一個是使用location,這樣應該也能解決(是根據上面的理論得出,沒有經過測試