跨域的时候报“没有权限”错误

转http://blog.csdn.net/wolfcyl/article/details/6612089

try{
//报错代码
}catch(e){}

try{
//报错代码
}catch(e){
setTimeout(arguments.callee,0);
}

引用
 IE下使用location对象有时会出现“没有权限”的错误
分类: Javascript 2011-07-17 13:50 32人阅读 评论(0) 收藏 举报
发生错误都是一个原因:没有权限(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,这样应该也能解决(是根据上面的理论得出,没有经过测试)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值