关于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 相关文章推荐
xml文档转换工具,附图表例子(hta)
Nov 17 Javascript
jquery lazyload延迟加载技术的实现原理分析
Jan 24 Javascript
利用jquery操作Radio方法小结
Oct 20 Javascript
jQuery学习心得总结(必看篇)
Jun 10 Javascript
Ionic + Angular.js实现验证码倒计时功能的方法
Jun 12 Javascript
JavaScript基本语法_动力节点Java学院整理
Jun 26 Javascript
javascript将list转换成树状结构的实例
Sep 08 Javascript
vue移动UI框架滑动加载数据的方法
Mar 12 Javascript
security.js实现的RSA加密功能示例
Jun 06 Javascript
vue-cli 3 全局过滤器的实例代码详解
Jun 03 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
May 22 jQuery
微信小程序实现modal弹出框遮罩层组件(可带文本框)
Dec 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
用函数读出数据表内容放入二维数组
2006/10/09 PHP
php+mysql实现无限级分类 | 树型显示分类关系
2006/11/19 PHP
如何使用“PHP” 彩蛋进行敏感信息获取
2013/08/07 PHP
php多进程模拟并发事务产生的问题小结
2018/12/07 PHP
PHP strripos函数用法总结
2019/02/11 PHP
tp5框架基于ajax实现异步删除图片的方法示例
2020/02/10 PHP
php数值计算num类简单操作示例
2020/05/15 PHP
Javascript条件判断使用小技巧总结
2008/09/08 Javascript
原生Js页面滚动延迟加载图片实现原理及过程
2013/06/24 Javascript
解析Jquery中如何把一段html代码动态写入到DIV中(实例说明)
2013/07/09 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
jQuery头像裁剪工具jcrop用法实例(附演示与demo源码下载)
2016/01/22 Javascript
使用jQuery或者原生js实现鼠标滚动加载页面新数据
2016/03/06 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
Vue写一个简单的倒计时按钮功能
2018/04/20 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
JavaScript中使用Spread运算符的八种方法总结
2020/06/18 Javascript
如何基于jQuery实现五角星评分
2020/09/02 jQuery
python解决网站的反爬虫策略总结
2016/10/26 Python
Python 快速实现CLI 应用程序的脚手架
2017/12/05 Python
python爬取m3u8连接的视频
2018/02/28 Python
H5 video poster属性设置视频封面的方法
2020/05/25 HTML / CSS
俄罗斯香水和化妆品在线商店:Aroma-butik
2020/02/28 全球购物
校班主任推荐信范文
2013/12/03 职场文书
给女儿的表扬信
2014/01/18 职场文书
小学毕业演讲稿
2014/04/25 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
争做文明公民倡议书
2014/08/29 职场文书
银行领导班子四风对照检查材料
2014/09/27 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL