关于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 相关文章推荐
一组JS创建和操作表格的函数集合
May 07 Javascript
jquery简单图片切换显示效果实现方法
Jan 14 Javascript
jQuery中DOM操作实例分析
Jan 23 Javascript
CSS3实现动态背景登录框的代码
Jul 28 Javascript
js实现鼠标点击文本框自动选中内容的方法
Aug 20 Javascript
jquery自动补齐功能插件flexselect用法示例
Aug 06 Javascript
JavaScript实现图片瀑布流和底部刷新
Jan 02 Javascript
浅析JavaScript中的平稳退化(graceful degradation)
Jul 24 Javascript
微信小程序授权登录及解密unionId出错的方法
Sep 26 Javascript
JavaScript设计模式--简单工厂模式定义与应用案例详解
May 23 Javascript
jquery+ajax实现异步上传文件显示进度条
Aug 17 jQuery
jQuery实现鼠标拖拽登录框移动效果
Sep 13 jQuery
如何使用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爆绝对路径方法收集整理
2012/09/17 PHP
php返回当前日期或者指定日期是周几
2015/05/21 PHP
PHP自动补全表单的两种方法
2017/03/06 PHP
Yii2框架redis基本应用示例
2018/07/13 PHP
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
JavaScript 基础篇之对象、数组使用介绍(三)
2012/04/07 Javascript
JavaScript中的作用域链和闭包
2012/06/30 Javascript
jquery.boxy弹出框(后隔N秒后自动隐藏/自动跳转)
2013/01/15 Javascript
javascript根据像素点取位置示例
2014/01/27 Javascript
淘宝网提供的国内NPM镜像简介和使用方法
2014/04/17 Javascript
Ext4.2的Ext.grid.plugin.RowExpander无法触发事件解决办法
2014/08/15 Javascript
情人节单身的我是如何在敲完代码之后收到12束玫瑰的(javascript)
2015/08/21 Javascript
JS延时提示框实现方法详解
2015/11/26 Javascript
JavaScript动态插入CSS的方法
2015/12/10 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
Vue声明式渲染详解
2017/05/17 Javascript
微信小程序实现锚点定位楼层跳跃的实例
2017/05/18 Javascript
详解基于 Nuxt 的 Vue.js 服务端渲染实践
2017/10/24 Javascript
Node错误处理笔记之挖坑系列教程
2018/06/05 Javascript
JS代码触发事件代码实例
2020/01/02 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
2020/02/16 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
python基础教程之lambda表达式使用方法
2014/02/12 Python
Python lambda和Python def区别分析
2014/11/30 Python
Python 使用os.remove删除文件夹时报错的解决方法
2017/01/13 Python
django 捕获异常和日志系统过程详解
2019/07/18 Python
对python中arange()和linspace()的区别说明
2020/05/03 Python
PyInstaller运行原理及常用操作详解
2020/06/13 Python
详解Open Folder as PyCharm Project怎么添加的方法
2020/12/29 Python
2013年研究生毕业感言
2014/02/06 职场文书
四风问题对照检查整改措施思想报告
2014/10/05 职场文书
教师节座谈会主持词
2015/07/03 职场文书
vue前端工程的搭建
2021/03/31 Vue.js
nginx限制并发连接请求数的方法
2021/04/01 Servers
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript