关于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的时间段实现代码
Aug 02 Javascript
jQuery实现响应浏览器缩放大小并改变背景颜色
Oct 31 Javascript
如何实现JavaScript动态加载CSS和JS文件
Dec 28 Javascript
jquery中的常见问题及快速解决方法小结
Jun 14 Javascript
jquery 中toggle的2种用法详解(推荐)
Sep 02 Javascript
Vue.js基础知识小结
Jan 13 Javascript
Bootstrap警告框(Alert)插件使用方法
Mar 21 Javascript
Vue.js学习笔记之常用模板语法详解
Jul 25 Javascript
Vue2 配置 Axios api 接口调用文件的方法
Nov 13 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
May 18 Javascript
实用Javascript调试技巧分享(小结)
Jun 18 Javascript
Vue过渡效果之CSS过渡详解(结合transition,animation,animate.css)
Feb 05 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
PHP中在数据库中保存Checkbox数据(1)
2006/10/09 PHP
用ADODB来让PHP操作ACCESS数据库的方法
2006/12/31 PHP
php源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
php flv视频时间获取函数
2010/06/29 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
php中smarty模板条件判断用法实例
2015/06/11 PHP
PHP时间戳格式全部汇总 (获取时间、时间戳)
2016/06/13 PHP
php设计模式之正面模式实例分析【星际争霸游戏案例】
2020/03/24 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
用JS实现一个TreeMenu效果分享
2011/08/28 Javascript
使用js如何实现全选与全不选
2013/12/30 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
深入浅出理解javaScript原型链
2015/05/09 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
js模拟淘宝网的多级选择菜单实现方法
2015/08/18 Javascript
javascript对象的相关操作小结
2016/05/16 Javascript
javascript弹出带文字信息的提示框效果
2016/07/19 Javascript
Vue中使用ElementUI使用第三方图标库iconfont的示例
2018/10/11 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
python3 与python2 异常处理的区别与联系
2016/06/19 Python
Python基于回溯法子集树模板解决取物搭配问题实例
2017/09/02 Python
python测试mysql写入性能完整实例
2018/01/18 Python
Python基于多线程操作数据库相关问题分析
2018/07/11 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
python 调用pyautogui 实时获取鼠标的位置、移动鼠标的方法
2019/08/27 Python
Python partial函数原理及用法解析
2019/12/11 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
html5 标签
2009/07/16 HTML / CSS
用HTML5制作一个简单的桌球游戏的教程
2015/05/12 HTML / CSS
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
速卖通欧盟:Aliexpress EU
2020/08/19 全球购物
《雨点》教学反思
2014/02/12 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
消防演习通知
2015/04/25 职场文书
2015最新婚礼司仪主持词
2015/06/30 职场文书