关于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 相关文章推荐
模仿JQuery sortable效果 代码有错但值得看看
Nov 05 Javascript
jQuery学习笔记之jQuery的动画
Dec 22 Javascript
Node.js开源应用框架HapiJS介绍
Jan 14 Javascript
原创jQuery弹出层插件分享
Apr 02 Javascript
javascript基于DOM实现省市级联下拉框的方法
May 14 Javascript
jQuery解决input超多的表单提交
Aug 10 Javascript
探析浏览器执行JavaScript脚本加载与代码执行顺序
Jan 12 Javascript
JS简单设置下拉选择框默认值的方法
Aug 20 Javascript
Javascript中return的使用与闭包详解
Jan 11 Javascript
OkHttp踩坑随笔为何 response.body().string() 只能调用一次
Jan 08 Javascript
AngularJs分页插件使用详解
Jun 30 Javascript
js实现拖拽与碰撞检测
Sep 18 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
用session做客户验证时的注意事项
2006/10/09 PHP
PHP 输出简单动态WAP页面
2009/06/09 PHP
php.ini中date.timezone设置分析
2011/07/29 PHP
typecho插件编写教程(五):核心代码
2015/05/28 PHP
PHP网站建设的流程与步骤分享
2015/09/25 PHP
mysql查找删除重复数据并只保留一条实例详解
2016/09/24 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
jquery 与NVelocity 产生冲突的解决方法
2011/06/13 Javascript
JavaScript实现打字效果的方法
2015/07/10 Javascript
js实现类似菜单风格的TAB选项卡效果代码
2015/08/28 Javascript
Bootstrap Modal对话框如何在关闭时触发事件
2016/12/02 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
nuxt框架中路由鉴权之Koa和Session的用法
2018/05/09 Javascript
详解js中Array的方法及技巧
2018/09/12 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
详解Angular Forms中自定义ngModel绑定值的方式
2018/12/10 Javascript
Vue实现一个图片懒加载插件
2019/03/11 Javascript
python计算圆周长、面积、球体体积并画出圆
2014/04/08 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
Python爬虫设置代理IP的方法(爬虫技巧)
2018/03/04 Python
浅谈Python里面None True False之间的区别
2020/07/09 Python
python 常见的反爬虫策略
2020/09/27 Python
python 数据类型强制转换的总结
2021/01/25 Python
BCBG官网:BCBGMAXAZRIA
2017/12/29 全球购物
绿色美容,有机护肤品和化妆品:Safe & Chic
2018/10/29 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
高中三年学习生活的自我评价
2013/10/10 职场文书
优秀中学生事迹材料
2014/01/31 职场文书
大学校运会广播稿
2014/02/03 职场文书
企业宣传口号
2014/06/12 职场文书
机关干部三严三实心得体会
2014/10/13 职场文书
师德师风自查材料
2014/10/14 职场文书
市场部经理岗位职责
2015/02/02 职场文书
MySQL实战记录之如何快速定位慢SQL
2022/03/23 MySQL