SCRIPT5: 拒绝访问
IE下因设置document.domain而无法和Iframe通信的解决方法
posted by 疯狂小强 at 二月 10, 2012 所属分类 开发经验 1,297次阅读 发表评论»
最近在开发SDK的过程中发现IE下有个很怪异的问题:在同一域下,因在父页面上设置了document.domain,而导致无法正常和Iframe(也是同域下)进行通信,IE下抛出的错误是:SCRIPT5: 拒绝访问,导致无法操作iframe中的内容。
经过查阅了很多资料后发现IE下,在父页面或在iframe页面中,只要设置了document.domain,无论是和当前域名相同还是根域名,均视为跨域,所以才会出现拒绝访问的错误,即使你这样写document.domain=document.domain;虽然好像没人这么干。
那么如何才能解决这个问题,让父页面和iframe页面正常通信呢,根据同源策略,让双方均设置同样的domain就可以达到目的。
比如页面A是http://www.a.com/a.html ,页面B是http://www.a.com/b.html, 这时候两个页面中都写上document.domain=”aaa.com”,这样两个页面就可以交互了。
但是,上面的情况只适用于嵌入的页面是事先已经已<iframe src=”http://www.a.com/b.html”></iframe>的形式在页面中写好了,而如果是在页面中动态创建的iframe标签再指定其src为http://www.a.com/b.html,上面的方法就不适用 了。
此种情况及解决方法请直接参考原著:IE下Iframe的 document.domain的怪异问题
上面的这种情况是当Iframe的src不为空,即存在实际的引用页面的解决方法。但如果需要创建一个空白的iframe(即src不指定),还要想拿到iframe里的document对象呢?看个例子:
//访问地址:http://www.a.com/a.html
<html>
<head>
<title>Iframe</title>
</head>
<body>
<script type=
"text/javascript"
>
document.domain =
'a.com'
;
var
iframe = document.createElement(
"iframe"
);
document.body.appendChild(iframe);
iframe.onload =
function
() {
console.log(iframe.contentWindow.document.location)
}
</script>
</body>
</html>
有人想到设置iframe里面的domain,思路正确,但由于父页面已经设置了domain,在父页面中根本无法获取到空白iframe的document对象,也就无法设置iframe的domain。
后来经过了很多尝试,也研究了twitter的SDK的代码,找到了解决方案:
通过设置iframe的src来执行一段JS代码,如下,
1
iframe.src =
"javascript:void((function(){document.open();document.domain='"
+ document.domain +
"';document.close()})())"
;
通过这种方式就可以改写iframe里面的domain了,这和在浏览器地址栏里输入这段代码的功效一样,这种方式像是旁门左道,但是这确实奏效了。
于是上面的代码更改为:
//访问地址:http://www.a.com/a.html
<html>
<head>
<title>Iframe</title>
</head>
<body>
<script type=
"text/javascript"
>
document.domain =
'a.com'
;
var
iframe = document.createElement(
"iframe"
);
document.body.appendChild(iframe);
try
{
iframe.contentWindow.document;
}
catch
(e) {
iframe.src =
"javascript:void((function(){document.open();document.domain='"
+ document.domain +
"';document.close()})())"
;
console.log(iframe.contentWindow.document.location)
}
</script>
</body>
</html>
在IE9下测试顺利通过,运行结果:http://www.a.com/a.html,至此,问题看似已经解决。
于是在其他版本的IE浏览器下做测试,结果出人意料,IE6-IE8均仍报错“拒绝访问”,头疼,经过反复尝试,后来无意间在设置iframe.src后,使用了setTimeout来获取iframe里的内容,靠,居然不报错了。看来是设置iframe的domain和获取iframe里面的内容这两个操作存在异步问题。
然后将上面方法改进:
//访问地址:http://www.a.com/a.html
<html>
<head>
<title>Iframe</title>
</head>
<body>
<script type=
"text/javascript"
>
document.domain =
'a.com'
;
var
iframe = document.createElement(
"iframe"
);
document.body.appendChild(iframe);
if
(/msie/i.test(navigator.userAgent)){
try
{
iframe.contentWindow.document;
}
catch
(e) {
iframe.onload =
function
() {
console.log(iframe.contentWindow.document.location);
iframe.onload =
null
;
}
iframe.src =
"javascript:void((function(){document.open();document.domain='"
+ document.domain +
"';document.close()})())"
;
}
}
</script>
</body>
</html>
再次在各IE下做测试,顺利通过!至此父页面因设置了document.domain而导致无法正常和同域下用js动态创建的iframe正常通信的问题彻底得到解决!如果你在开发过程中遇到类似问题,不妨尝试下这种方法,如果你有更好的解决方案,希望能公开出来供大家一起学习,讨论。Demo地址。
跑运输论坛,跑跑运输,搞活经济!!! (还等什么!!!赶快猛点进入!!!) 跑运输站长博客,跑运输,搞活经济!!! (还等什么!!!赶快猛点进入!!!)
聚划算淘宝客外推精选商品、 集结聚划算外推高转化商品 品牌卖家折扣商品推广 天天疯狂购,低至3折,还等 神马 打造第一母婴达人馆,网罗更多母婴商品,为你打造属于你的温馨小屋! 淘宝优秀店铺精选,集合了高佣金高转换率的优秀店铺。 秒杀满立减 齐集淘宝疯狂促销食品、让你买得省心、吃得放心、而且还有高额佣金哦! 淘宝皇冠店铺精选,集合了高佣金高转换率的皇冠 店铺。 淘宝网-亚洲最大、最安全的网上交易平台,提供机票、票务服务,方便您的出行 想看宝岛台湾的时尚动态吗,想观宝岛台湾的潮流前沿吗,一切尽在台湾馆频道,高佣金、高转化,精彩不容错过 淘宝最权威的女装风向标,集合了淘宝最热卖的优质商品,给买家带来全新的购物体验。 淘宝商城,亚洲最大最全最专业的网上购物网站——淘宝网打造的在线B2C购物平台。 淘宝商城频道集合了全球最知名的品牌包括联想、惠普、迪士尼、Kappa、乐扣乐扣、JackJones等,给买家带来全新的一站式购物体验 正品行货保证!精选电器城最优品牌商品,让您有亲临商城的优良购物体验。 引领淘宝数码时尚,为你带来淘宝最受追捧的新潮数码产品,让你追随时尚永不out! 淘宝最权威的鞋包配饰风向标,集合了淘宝最热卖的优质商品,让买家了解每季最时尚的配饰。 淘宝客男人频道,精选淘宝网热销男装,高成交、高佣金、高转化,让您收益节节高! 集结淘宝最丰富的强势类目,精选最优质的卖家和商品,达到最广泛的买家覆盖率 淘宝美容馆,我的美容管家。精选商品、高额佣金、疯狂畅销、打造买家自己的美容小馆。 打造第一居家达人馆,网罗更多创意极品和居家商品,为你共同打造属于你的浪漫满屋!
![](http://img02.taobaocdn.com/tps/i2/T1nP2dXeJiXXaCwpjX.png)
![](http://img02.taobaocdn.com/tps/i2/T1nqWGXhdBXXbwqofS-300-250.jpg)
![](http://img03.taobaocdn.com/tps/i3/T18rGuXb40XXbwqofS-300-250.jpg)
![](http://img02.taobaocdn.com/tps/i2/T1nqWGXhdBXXbwqofS-300-250.jpg)
网购从这里开始
![](http://v.t.qq.com/sign/suizhikuo/7c97266e7fa31455ed85751ba7e375907be6b1ca/5.jpg)
![](http://service.t.sina.com.cn/widget/qmd/2517898177/e07b84bc/1.png)
![](http://service.t.sina.com.cn/widget/qmd/2622466271/bc29cd04/1.png)