通过伪协议解决 父页面与iframe页面通信的问题
来源:互联网 发布:数据线头很紧会拔坏吗 编辑:程序博客网 时间:2024/06/05 16:10
本文原始链接:http://www.cnblogs.com/fang9159/archive/2012/09/12/iframe.html
感谢作者的这篇文章,解决了我的一个非常棘手的问题。该问题是在一个改变了主页面域的情况下,通过js动态创建的iframe加载动态html内容时,无法显示的问题。下面是作者的原文:
我们经常会有父页面与iframe页面的操作,比如
<iframe id = "iframe"></iframe>
这个iframe里面的内容是js写的。如以下代码
var iframe = document.getElementById("iframe"), doc = iframe.contentWindow.document;doc.open();doc.write("---------something------");doc.close();
以上代码在大多数情况下是对的。但有种情况,即父页面显式的写了document.domain = "xxx";
在ie系列(IE10没试过)会出现没权限的错误。 而在firefox, chrome都没问题.
这是为什么呢?这是ie的一个bug, 即父页没有显式的设置document.domain时,iframe会默认document.domain与父页面一致,即都是
location.host,父子页面是可以进行通信,即文章头的例子, 但当父页面显式的设置了document.domain="", iframe里面的页面必须也显式的设置document.domain="xxx",否则是
没有权限得到iframe.contentWindow.document的, 即也没办法去动态写内容,其实也可以让iframe指向一个特定的页面,这个页面显式的设置document.domain="xxx",再通过文章开头的方
的方式来写,但问题是我的父页面有很多这样的iframe,个数是未知的(都是广告位),所以也不能通过特定页面。
这样问题就来了,在这种情况下,我们貌似没有办法
1. 父页面设置了并且必须会显式的设置document.domain
2.iframe页面的内容需要js动态生成。
3.没有机会为iframe设置src。
但上面3个条件都满足时,我们可以通过伪协议来解决此类的问题。
iframe.src="javascript:void((function(){var d=document;d.open();d.domain='xxx;d.write('---something');d.close();})())";
通过这种方式可以显式的设置iframe的document.domain与父页面一致。
这样写了后,的确实现了动态写iframe内容的需求,但这个页面会单独弹出来,像window.open();
这是为什么呢? 这也是ie系列的bug ,即父页面有<base target="_blank"></base>, 通过iframe的伪协议所写的内容会类似window.open一样弹出新页面,
但父页面的<base>又必须是_self, 所以只能在调用iframe.src之前将base的target设置为_self, 内容写完后,再将base的target设为_blank
这样就解决了此问题。
虽然伪协议可以解决此问题,但也有些风险,如果不到万不得已,也别随便用这种方式。
文章有点长,大家如有疑问请给我留言, 谢谢。
- 通过伪协议解决 父页面与iframe页面通信的问题
- iframe 子页面与父页面通信
- 嵌入式iframe子页面与父页面js通信方式
- iframe子页面与父页面js通信方式
- 嵌入式iframe子页面与父页面js通信方式 .
- js之iframe子页面与父页面通信
- js iframe子页面与父页面通信
- js之iframe子页面与父页面通信
- js之iframe子页面与父页面通信
- iframe子页面与父页面js通信
- js之iframe子页面与父页面通信
- js之iframe子页面与父页面通信
- js之iframe子页面与父页面通信
- js之iframe子页面与父页面通信
- js之iframe子页面与父页面通信
- js之iframe子页面与父页面通信
- html5 postMessage跨域通信 1.解决页面与嵌套的iframe消息传递
- 利用iframe进行父页面和子页面的通信
- jquery采用attr修改form表单enctype不起作用的问题
- web前端工程师入门须知
- 关于library cache pin和lock等待事件的理解
- XAML实例教程系列 - 事件(Event)
- 若要再次显示该网页,Web浏览器需要重新发送您以前提交的信息解决办法
- 通过伪协议解决 父页面与iframe页面通信的问题
- css border制作三角箭头
- 如果防止IE出现“要再次显示该网页internet exploer 需要重新发送您以前提交的信息.
- FastReport.Net 和fastreport
- oracle闪回
- #define用法集锦
- 38、定义一个自己的IO流
- 使用交换排序法,利用指针和数组对学生成绩进行升序排序
- nginx ssl 107 (net::ERR_SSL_PROTOCOL_ERROR) 无法与服务器建立安全连接 解决方法