关于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 相关文章推荐
从JavaScript 到 JQuery (1)学习小结
Feb 12 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
Dec 04 Javascript
如何编写高质量JS代码
Dec 28 Javascript
在Javascript中处理数组之toSource()方法的使用
Jun 09 Javascript
使用JQuery实现的分页插件分享
Nov 05 Javascript
学习JavaScript设计模式(多态)
Nov 25 Javascript
Angularjs全局变量被作用域监听的正确姿势
Feb 06 Javascript
jQuery插件扩展测试实例
Jun 21 Javascript
jQuery实现的购物车物品数量加减功能代码
Nov 16 Javascript
Three.js基础部分学习
Jan 08 Javascript
原生JS实现的轮播图功能详解
Aug 06 Javascript
详解vue中的父子传值双向绑定及数据更新问题
Jun 13 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
用php+javascript实现二级级联菜单的制作
2008/05/06 PHP
PHP开发的一些注意点总结
2010/10/12 PHP
记录mysql性能查询过程的使用方法
2013/05/02 PHP
php截取指定2个字符之间字符串的方法
2015/04/15 PHP
PHP引用的调用方法分析
2016/04/25 PHP
php分页查询的简单实现代码
2017/03/14 PHP
javascript 冒号 使用说明
2009/06/06 Javascript
关于JavaScript中的关联数组分析
2013/04/09 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
jquery+json实现数据二级联动的方法
2015/11/28 Javascript
JavaScript iframe数据共享接口实现方法
2016/01/06 Javascript
javascript鼠标右键菜单自定义效果
2020/12/08 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
使用CSS+JavaScript或纯js实现半透明遮罩效果的实例分享
2016/05/09 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
vue项目开发中setTimeout等定时器的管理问题
2018/09/13 Javascript
antd Upload 文件上传的示例代码
2018/12/14 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
JavaScript实现动态留言板
2020/03/16 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
Pyhton中防止SQL注入的方法
2015/02/05 Python
Python的bit_length函数来二进制的位数方法
2019/08/27 Python
wxpython布局的实现方法
2019/11/01 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
css3 中translate和transition的使用方法
2020/03/26 HTML / CSS
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
Kendra Scott官网:美国领先的时尚配饰品牌
2020/10/22 全球购物
幼儿园元旦家长感言
2014/02/27 职场文书
上班迟到检讨书
2014/09/15 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
html5调用摄像头实例代码
2021/06/28 HTML / CSS
MySQL数据库如何使用Shell进行连接
2022/04/12 MySQL