IE下使用location物件有時會出現“沒有許可權”的錯誤
阿新 • • 發佈:2019-02-08
發生錯誤都是一個原因:沒有許可權(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.getElementsBy
TagName('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.getElementsBy
TagName('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.getElementsBy
TagName('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,這樣應該也能解決(是根據上面的理論得出,
沒有經過測試
)