通过伪协议解决父页面与iframe页面通信的问题

 更新时间:2015年04月05日 23:14:58   投稿:mdxy-dxy  
这篇文章主要介绍了通过伪协议解决父页面与iframe页面通信的问题,需要的朋友可以参考下

我们经常会有父页面与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

这样就解决了此问题。

虽然伪协议可以解决此问题,但也有些风险,如果不到万不得已,也别随便用这种方式。

相关文章

  • js去字符串前后空格的实现方法

    js去字符串前后空格的实现方法

    这篇文章主要介绍了js去字符串前后空格的实现方法,重点推荐使用正则的方式,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Js利用正则表达式去除字符串的中括号

    Js利用正则表达式去除字符串的中括号

    这篇文章主要给大家介绍了关于Js利用正则表达式去除字符串的中括号的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • JavaScript中的ajax功能的概念和示例详解

    JavaScript中的ajax功能的概念和示例详解

    AJAX即“Asynchronous Javascript And XML”(异步JavaScript和XML)。这篇文章主要给大家介绍了JavaScript中的ajax功能的概念和示例详解,感兴趣的朋友一起看看吧
    2016-10-10
  • js实现微博发布小功能

    js实现微博发布小功能

    本篇文章主要介绍了javascript实现微博发布小功能的示例代码,具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • javascript设计模式 – 桥接模式原理与应用实例分析

    javascript设计模式 – 桥接模式原理与应用实例分析

    这篇文章主要介绍了javascript设计模式 – 桥接模式,结合实例形式分析了javascript桥接模式基本概念、原理、用法及操作注意事项,需要的朋友可以参考下
    2020-04-04
  • JS实现鼠标滑过链接改变网页背景颜色的方法

    JS实现鼠标滑过链接改变网页背景颜色的方法

    这篇文章主要介绍了JS实现鼠标滑过链接改变网页背景颜色的方法,涉及js响应鼠标事件动态修改页面元素属性的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • 扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路

    扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路

    js的扩展方法是基于原型的,如Array.prototype.XXXX就是给Array扩展XXX方法,然后数组都能使用这个方法了,在对象数组里面经常有根据属性来进行排序的,升序,降序的,下面与大家分享自己写的一个
    2013-05-05
  • JavaScript实现给对象添加一个只读属性

    JavaScript实现给对象添加一个只读属性

    这篇文章主要为大家介绍了JavaScript如何给对象加一个只读属性,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-06-06
  • JavaScript中发出HTTP请求最常用的方法

    JavaScript中发出HTTP请求最常用的方法

    JavaScript具有很好的模块和方法来发送可用于从服务器端资源发送或接收数据的HTTP请求。这篇文章主要介绍了JavaScript中发出HTTP请求最常用的方法,需要的朋友可以参考下
    2018-07-07
  • 22种JavaScript中数组常用API总结

    22种JavaScript中数组常用API总结

    在前端开发中,数组是一种常见且重要的数据结构,本文主要介绍了前端中数组常用的API,包括添加、删除、截取、合并、转换等操作,希望对大家有所帮助
    2023-05-05

最新评论