关于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 基础学习笔记
May 29 Javascript
jQuery实现的超酷苹果风格图标滑出菜单效果代码
Sep 16 Javascript
Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
Jul 14 Javascript
js从外部获取图片的实现方法
Aug 05 Javascript
JQuery和HTML5 Canvas实现弹幕效果
Jan 04 Javascript
js实现图片360度旋转
Jan 22 Javascript
详解如何优雅地在React项目中使用Redux
Dec 28 Javascript
Vue.js中对css的操作(修改)具体方式详解
Oct 30 Javascript
Vue从TodoList中学父子组件通信
Feb 05 Javascript
vue-cli的build的文件夹下没有dev-server.js文件配置mock数据的方法
Apr 17 Javascript
实用的Vue开发技巧
May 30 Javascript
SpringBoot在yml配置文件中配置druid的操作
Nov 16 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
Protoss魔法科技
2020/03/14 星际争霸
php array_intersect()函数使用代码
2009/01/14 PHP
使用PHP接受文件并获得其后缀名的方法
2015/08/05 PHP
pjblog中的UBBCode.js
2007/04/25 Javascript
定义select的边框颜色
2008/04/28 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
jQuery制作简洁的多级联动Select下拉框
2014/12/23 Javascript
简述Jquery与DOM对象
2015/07/10 Javascript
javascript cookie的简单应用
2016/02/24 Javascript
基于 Node.js 实现前后端分离
2016/04/23 Javascript
浅谈JavaScript对象与继承
2016/07/10 Javascript
AngularJs concepts详解及示例代码
2016/09/01 Javascript
js带闹铃功能的倒计时代码
2016/09/29 Javascript
js中string和number类型互转换技巧(分享)
2016/11/28 Javascript
jQuery设置和获取select、checkbox、radio的选中值方法
2017/01/01 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
React+react-dropzone+node.js实现图片上传的示例代码
2017/08/23 Javascript
JS 中document.write()的用法和清空的原因浅析
2017/12/04 Javascript
javascript实现前端成语点击验证优化
2020/06/24 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
Python 返回汉字的汉语拼音
2009/02/27 Python
编写Python CGI脚本的教程
2015/06/29 Python
python实现数独游戏 java简单实现数独游戏
2018/03/30 Python
python列表的逆序遍历实现
2020/04/20 Python
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
navabi英国:设计师大码女装
2019/06/25 全球购物
德国帽子专家:Hutshopping
2019/11/03 全球购物
介绍一下SQL Server的全文索引
2013/08/15 面试题
工业设计专业推荐信
2013/10/29 职场文书
单位在职证明书
2014/09/11 职场文书
2019年朋友圈经典励志语录50条
2019/07/05 职场文书
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android
JavaScript声明变量和数据类型的转换
2022/04/12 Javascript
Java版 单机五子棋
2022/05/04 Java/Android
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL