关于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:地址栏载入脚本代码
Oct 13 Javascript
jQuery函数map()和each()介绍及异同点分析
Nov 08 Javascript
JS获取及设置TextArea或input文本框选择文本位置的方法
Mar 24 Javascript
JavaScript设置、获取、清除单值和多值cookie的方法
Nov 17 Javascript
Node.js对MongoDB数据库实现模糊查询的方法
May 03 Javascript
JS奇技之利用scroll来监听resize详解
Jun 15 Javascript
AngularJS select设置默认值的实现方法
Aug 25 Javascript
VUE实现一个分页组件的示例
Sep 13 Javascript
JavaScript框架Angular和React深度对比
Nov 20 Javascript
详解在React项目中安装并使用Less(用法总结)
Mar 18 Javascript
详解js加减乘除精确计算
Mar 19 Javascript
使用node-media-server搭建一个简易的流媒体服务器
Jan 20 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
[原创]解决wincache不支持64位PHP5.5/5.6的问题(提供64位wincache下载)
2016/06/22 PHP
php利用header函数下载各种文件
2016/08/24 PHP
PHP文件管理之实现网盘及压缩包的功能操作
2017/09/20 PHP
Javascript 日期对象Date扩展方法
2009/05/30 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
node.js中使用node-schedule实现定时任务实例
2014/06/03 Javascript
jQuery学习笔记之基础中的基础
2015/01/19 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
jQuery的事件委托实例分析
2015/07/15 Javascript
JS实现表单多文件上传样式美化支持选中文件后删除相关项
2016/09/30 Javascript
vue.js指令v-for使用及索引获取
2016/11/03 Javascript
基于AngularJS实现表单验证功能
2017/07/28 Javascript
Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件的方法
2017/09/20 Javascript
jQuery简单判断值是否存在于数组中的方法示例
2018/04/17 jQuery
2种在vue项目中使用百度地图的简单方法
2018/09/28 Javascript
Vue源码中要const _toStr = Object.prototype.toString的原因分析
2018/12/09 Javascript
Vue最新防抖方案(必看篇)
2019/10/30 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
基于leaflet.js实现修改地图主题样式的流程分析
2020/05/15 Javascript
vue的hash值原理也是table切换实例代码
2020/12/14 Vue.js
VUE实现吸底按钮
2021/03/04 Vue.js
[29:23]2014 DOTA2国际邀请赛中国区预选赛 LGD-GAMING VS CIS 第一场1
2014/05/23 DOTA
python BeautifulSoup使用方法详解
2013/11/21 Python
Python实现购物系统(示例讲解)
2017/09/13 Python
Python数据分析之获取双色球历史信息的方法示例
2018/02/03 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
python实现AES加密与解密
2019/03/28 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
html5 offlline 缓存使用示例
2013/06/24 HTML / CSS
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
女士时装鞋:Chinese Laundry
2018/08/29 全球购物
颇特女士:NET-A-PORTER(直邮中国)
2020/07/11 全球购物
灵泰克Java笔试题
2016/01/09 面试题
自我鉴定标准格式
2014/03/19 职场文书
个人查摆问题整改措施
2014/10/04 职场文书