关于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 相关文章推荐
isArray()函数(JavaScript中对象类型判断的几种方法)
Nov 26 Javascript
dreamweaver 安装Jquery智能提示
Apr 02 Javascript
jquery数组过滤筛选方法grep()简介
Jun 06 Javascript
Express作者TJ告别Node.js奔向Go
Jul 14 Javascript
JS实现从网页顶部掉下弹出层效果的方法
Aug 06 Javascript
通过设置CSS中的position属性来固定层的位置
Dec 14 Javascript
简单的网页广告特效实例
Aug 19 Javascript
JS实现生成由字母与数字组合的随机字符串功能详解
May 25 Javascript
vue2.0自定义指令示例代码详解
Apr 25 Javascript
深度了解vue.js中hooks的相关知识
Jun 14 Javascript
ES6扩展运算符和rest运算符用法实例分析
May 23 Javascript
微信小程序中的列表切换功能实例代码详解
Jun 09 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
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
一个简单安全的PHP验证码类 附调用方法
2016/06/24 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
Aster vs KG BO3 第二场2.19
2021/03/10 DOTA
javascript一些实用技巧小结
2011/03/18 Javascript
最常用的12种设计模式小结
2011/08/09 Javascript
js识别uc浏览器的代码
2015/11/06 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
ES6的新特性概览
2016/03/10 Javascript
全面理解JavaScript中的闭包
2016/05/12 Javascript
jQuery中deferred对象使用方法详解
2016/07/14 Javascript
如何使用Vuex+Vue.js构建单页应用
2016/10/27 Javascript
vue-router 导航钩子的具体使用方法
2017/08/31 Javascript
在Vue.js中使用Mixins的方法
2017/09/12 Javascript
JavaScript中的高级函数
2018/01/04 Javascript
React优化子组件render的使用
2019/05/12 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
python实现爬虫统计学校BBS男女比例之多线程爬虫(二)
2015/12/31 Python
Python之Web框架Django项目搭建全过程
2017/05/02 Python
Python和C/C++交互的几种方法总结
2017/05/11 Python
python在每个字符后添加空格的实例
2018/05/07 Python
python实现远程控制电脑
2019/05/23 Python
pygame实现打字游戏
2021/02/19 Python
pygame实现俄罗斯方块游戏(基础篇2)
2019/10/29 Python
整理的15个非常有用的 HTML5 开发教程和速查手册
2011/10/18 HTML / CSS
Shein英国:女性时尚网上商店
2019/04/10 全球购物
美国最大和最受信任的二手轮胎商店:Bestusedtires.com
2020/06/02 全球购物
Java的基础面试题附答案
2016/01/10 面试题
C++面试题目
2013/06/25 面试题
JSF的标签库有哪些
2012/04/27 面试题
机电职业生涯规划书范文
2014/03/08 职场文书
实习生矿工检讨书
2014/10/13 职场文书
刑事附带民事代理词
2015/05/25 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
vue中的可拖拽宽度div的实现示例
2022/04/08 Vue.js
JavaScript圣杯布局与双飞翼布局实现案例详解
2022/08/05 Javascript