关于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实现手把手教你月入万刀(转贴)
Nov 07 Javascript
js 创建书签小工具之理论
Feb 25 Javascript
js+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
Mar 10 Javascript
弹出窗口并且此窗口带有半透明的遮罩层效果
Mar 13 Javascript
5个书写JavaScript代码的坏习惯,看看你中枪了没?
Nov 06 Javascript
javascript实现复选框选中属性
Mar 25 Javascript
Javascript对象Clone实例分析
Jun 09 Javascript
jquery插件EasyUI中form表单提交实例分享
Jan 11 Javascript
jquery编写Tab选项卡滚动导航切换特效
Jul 17 Javascript
如何判断Javascript对象是否存在的简单实例
May 18 Javascript
浅谈用Webpack路径压缩图片上传尺寸获取的问题
Feb 22 Javascript
vue中 this.$set的用法详解
Sep 06 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 404错误页面实现代码
2009/06/22 PHP
php自动获取字符串编码函数mb_detect_encoding
2011/05/31 PHP
PHP生成随机密码类分享
2014/06/25 PHP
php常见的魔术方法详解
2014/12/25 PHP
深入浅析PHP7.0新特征(五大新特征)
2015/10/29 PHP
PHP实现的限制IP投票程序IP来源分析
2016/05/04 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
2019/12/18 PHP
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
2009/03/21 Javascript
url 特殊字符 传递参数解决方法
2010/01/01 Javascript
JS 无限级 Select效果实现代码(json格式)
2011/08/30 Javascript
JS代码同步文本框内容的实例方法
2013/07/12 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
触屏中的JavaScript事件分析
2015/02/06 Javascript
BootStrap点击下拉菜单项后显示一个新的输入框实现代码
2016/05/16 Javascript
微信小程序 开发经验整理
2017/02/15 Javascript
jQuery实现frame之间互通的方法
2017/06/26 jQuery
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
Jquery+javascript实现支付网页数字键盘
2020/12/21 jQuery
Python自定义函数的创建、调用和函数的参数详解
2014/03/11 Python
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
Python统计一个字符串中每个字符出现了多少次的方法【字符串转换为列表再统计】
2019/05/05 Python
python元组的概念知识点
2019/11/19 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
最新的小工具和卓越的产品设计:Oh That Tech!
2019/08/07 全球购物
研究生求职推荐信范文
2013/11/30 职场文书
卫生巾广告词
2014/03/18 职场文书
空气的环保标语
2014/06/12 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
代领学位证书毕业证书委托书
2014/09/30 职场文书
电工实训报告总结
2014/11/05 职场文书