关于Javascript与iframe的那些事儿


Posted in Javascript onJuly 04, 2013

嵌入 iframe 的页面,父页面与子页面均可以很轻松的在同域或跨子域的情况下进行读写操作;在完全不同域的情况下,也可以通过更改 hash 的方式进行通信。下面我在九个不同(版本的)浏览器中对此进行数据传输与更改的兼容性测试。
同域或跨子域读写操作 iframe 里的内容
父页面读写操作子页面:

<iframe id="test-iframe" name="test-iframe" src="child.html" scrolling="no" frameborder="0"></iframe>
<script>
window.onload = function () {
  /*
   *  下面两种获取节点内容的方式都可以。
   *  由于 IE6, IE7 不支持 contentDocument 属性,所以此处用了通用的
   *  window.frames["iframe Name"] or window.frames[index]
   */
  var d = window.frames["test-iframe"].document;
  d.getElementsByTagName('h1')[0].innerHTML = 'pp';
  alert(d.getElementsByTagName('h1')[0].firstChild.data);
}
</script>

注:在请务必通过 window.onload 方法访问 iframe 中的节点,否则浏览器会提示错误-拒绝访问。在 IE8, Firefox3.6, Opera11 下在DOMReady 时也可以访问 iframe 中的节点。
子页面读写操作父页面:
<script>
  parent.document.getElementsByTagName('h1')[0].innerHTML = 'pp';
  alert(parent.document.getElementsByTagName('h1')[0].firstChild.data);
</script>

小结:
•1 测试通过 IE6, IE7, IE8, Firefox2.0, Firefox3.0, Firefox3.6, Chrome8, Opera11, Safari5.
•2 查阅资料得出 document.getElementById(‘id name').contentDocument 全等于 window.frames["iframe Name"].document.
•3 跨子域时,需要在父页面和子页面 JS 中分别加上 document.domain = 'xxx.com';
跨域操作 iframe 里内容
当两个网页所在域不同时,要实现数据的互相调用,只能通过 JS 改变 location 对象的 hash 属性的值来做到互相通信。
父页面:
<iframe id="test-iframe" src="http://www.yyy.com/child.html" scrolling="no" frameborder="0"></iframe>
<input type="button" value="send" onclick="sendRequest()" />
<script>
function sendRequest() {
  document.getElementById('test-iframe').src += '#a';
}
var interval = window.setInterval(function(){
  if(location.hash) {
    alert(location.hash);
    window.clearInterval(interval);
  }
},1000);
</script>

子页面:
<h1>RRRRRR</h1>
<script>
var url = 'http://www.xxx.com/father.html';
    oldHash = self.location.hash,
    newHash,
    interval = window.setInterval(function(){
        newHash = self.location.hash;
        if(oldHash != self.location.hash) {
        document.getElementsByTagName('h1')[0].innerHTML = 'pp';
        //alert(parent.location.href); //去掉这个注释,浏览器会提示无权限
        parent.location.href = url + '#b';
          window.clearInterval(interval);
        }
    },500);
</script>

小结:
•1 经测试 IE6, IE7, IE8, Firefox2.0, Firefox3.0, Firefox3.6, Chrome8, Opera11, Safari5, 除 IE6, IE7 外只要改变hash 就会记录在浏览器 history 中。
•2 我有试图在子页面用 parent.location.replace 的方法来避免父页面向服务器发送请求而进行跳转,这样理论上浏览器就不会记录历史,但未能奏效。
•2 子页面无权读取父页面的 url, 但可以对父页面的 url 进行写操作,所以跨域操作时,要提前得知父页面的url
由于前端解决跨域问题的局限性比较大,所以最好用服务器端解决方案
Javascript 相关文章推荐
jquery获取ASP.NET服务器端控件dropdownlist和radiobuttonlist生成客户端HTML标签后的value和text值
Jun 28 Javascript
jQuery实现密保互斥问题解决方案
Aug 16 Javascript
解析jQuery的三种bind/One/Live事件绑定使用方法
Dec 30 Javascript
JavaScript通过prototype给对象定义属性用法实例
Mar 23 Javascript
JavaScript获取当前网页标题(title)的方法
Apr 03 Javascript
Node.js 异步异常的处理与domain模块解析
May 10 Javascript
springmvc接收jquery提交的数组数据代码分享
Oct 28 jQuery
一个因@click.stop引发的bug的解决
Jan 08 Javascript
使用post方法实现json往返传输数据的方法
Mar 30 Javascript
详解Nuxt.js中使用Element-UI填坑
Sep 06 Javascript
简述Vue中容易被忽视的知识点
Dec 09 Javascript
如何在 ant 的table中实现图片的渲染操作
Oct 28 Javascript
如何使用Javascript正则表达式来格式化XML内容
Jul 04 #Javascript
解析Jquery取得iframe中元素的几种方法
Jul 04 #Javascript
jQuery动态设置form表单的enctype值(实现代码)
Jul 04 #Javascript
浅析jQuery中常用的元素查找方法总结
Jul 04 #Javascript
浅析jQuery对select操作小结(遍历option,操作option)
Jul 04 #Javascript
解析jQuery与其它js(Prototype)库兼容共存
Jul 04 #Javascript
JQuery-tableDnD 拖拽的基本使用介绍
Jul 04 #Javascript
You might like
Yii框架form表单用法实例
2014/12/04 PHP
PHP设计模式之适配器模式代码实例
2015/05/11 PHP
php接口隔离原则实例分析
2019/11/11 PHP
JavaScript对象模型-执行模型
2008/04/28 Javascript
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
JQuery选择器特辑 详细小结
2012/05/14 Javascript
Node.js开源应用框架HapiJS介绍
2015/01/14 Javascript
初识Javascript小结
2015/07/16 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
Javascript实现前端简单的路由实例
2016/09/11 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
浅谈jquery拼接字符串效率比较高的方法
2017/02/22 Javascript
js+canvas实现动态吃豆人效果
2017/03/22 Javascript
jQuery插件Echarts实现的渐变色柱状图
2017/03/23 jQuery
微信小程序中使用ECharts 异步加载数据的方法
2018/06/27 Javascript
使用puppeteer爬取网站并抓出404无效链接
2018/12/20 Javascript
vue组件创建的三种方式小结
2020/02/03 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
Python的gevent框架的入门教程
2015/04/29 Python
python数据类型_字符串常用操作(详解)
2017/05/30 Python
基于python 字符编码的理解
2017/09/02 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
pyqt5 键盘监听按下enter 就登陆的实例
2019/06/25 Python
python 缺失值处理的方法(Imputation)
2019/07/02 Python
Python集合操作方法详解
2020/02/09 Python
python和php哪个更适合写爬虫
2020/06/22 Python
5款实用的python 工具推荐
2020/10/13 Python
最新版 Windows10上安装Python 3.8.5的步骤详解
2020/11/28 Python
css3实现平移效果(transfrom:translate)的示例
2020/11/13 HTML / CSS
将世界上最美丽的摄影作品转化为艺术作品:Photos.com
2017/11/28 全球购物
小区推广策划方案
2014/06/06 职场文书
法学自荐信
2014/06/20 职场文书
2014年医院十一国庆节活动方案
2014/09/15 职场文书
承租经营合作者协议书
2014/10/01 职场文书
Spring Boot 底层原理基础深度解析
2022/04/03 Java/Android