js操作iframe兼容各种主流浏览器示例代码


Posted in Javascript onJuly 22, 2013

在做项目时,遇到了操作iframe的相关问题。业务很简单,其实就是在操作iframe内部某个窗体时,调用父窗体的一个函数。于是就写了两个很简单的htm页面用来测试,使用网上流行的方法在谷歌浏览器中始终报错,不能通过。
父页面parent.html的代码如下

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 
</title> 
<script src="jquery-1.10.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
function ParentFunction() { 
alert('ParentFunction'); 
} 
</script></head> 
<body> 
<input type="button" id="btnCancel" class="button" value="测试" /> 
<iframe id="FRMdetail" name="FRMdetail" frameborder="0" src='child.html' style="width:100%;height:100%;" ></iframe> 
</body> 
</html>

子页面child.html的代码如下
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 
</title> 
<script src="jquery-1.10.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function () { 
$("#btnTest").click(function (e) { 
var t=window.parent; 
t.ParentFunction(); 
}); 
}) 
</script></head> 
<body> 
<input type="button" id="btnTest" class="button" value="应该获取的值" />rrr 
</body> 
</html>

网络上流行的方法 var t=window.parent; t.ParentFunction();在IE中能调用,可是在谷歌浏览器中总是提示如下错误,
Blocked a frame with origin "null" from accessing a frame with origin "null". Protocols, domains, and ports must match.
网上找了很长时间都没法发现方法,有的也是很早以前的版本,基本上没用了,而且人云亦云,基本上没有测试过。于是自己摸索,后来才发现,谷歌浏览器其实那种方法其实也可以,只是很奇怪,必须发布后才可以,在文件系统中调用,就会出现上边的错误。
其实还有一种html5的方法postMessage,于是就根据着进行了改写,最终代码如下:
父页面parent.html的代码如下
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 
</title> 
<script src="jquery-1.10.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
this.ParentFunction= function() {//和注释掉的方法是一样的,也就是说加不加this都是一样的,因为此处的this就是windows 
alert('ParentFunction'); 
} 
// function ParentFunction() { 
// alert('ParentFunction'); 
// } 
function receiveMessage(e) { 
var data = e.data; 
if(data=="ParentFunction") 
{ 
ParentFunction() ; 
} 
} 
if (typeof window.addEventListener != 'undefined') {//使用html5 的postMessage必须处理的 
window.addEventListener('message', receiveMessage, false); 
} else if (typeof window.attachEvent != 'undefined') { 
window.attachEvent('onmessage', receiveMessage); 
} 
</script></head> 
<body> 
<input type="button" id="btnCancel" class="button" value="测试" /> 
<iframe id="FRMdetail" name="FRMdetail" frameborder="0" src='child.html' style="width:100%;height:100%;" ></iframe> 
</body> 
</html>

子页面child.html的代码如下
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head><title> 
</title> 
<script src="jquery-1.10.1.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(document).ready(function () { 
$("#btnTest").click(function (e) { 
var t=window.parent; 
if(!t.ParentFunction)//在不支持时,使用html5 的postMessage方法 
{ 
t.postMessage("ParentFunction", '*'); 
} 
else 
{ 
t.ParentFunction(); 
} 
}); 
}) 
</script></head> 
<body> 
<input type="button" id="btnTest" class="button" value="应该获取的值" />rrr 
</body> 
</html>

经过改写后,在文件系统中虽然也会出现那个错误,但需要调用的方法确实调用了,目的确实达到了,不影响使用了。
Javascript 相关文章推荐
js给dropdownlist添加选项的小例子
Mar 04 Javascript
JavaScript中setInterval的用法总结
Nov 20 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
Aug 04 Javascript
jQuery中parents()方法用法实例
Jan 07 Javascript
js实现滚动条滚动到页面底部继续加载
Dec 19 Javascript
购物车前端开发(jQuery和bootstrap3)
Aug 27 Javascript
Bootstrap基本插件学习笔记之轮播幻灯片(23)
Dec 08 Javascript
简单实现JS上传图片预览功能
Apr 14 Javascript
node.js连接MongoDB数据库的2种方法教程
May 17 Javascript
实现Vue的markdown文档可以在线运行的方法示例
Dec 11 Javascript
vue 搭建后台系统模块化开发详解
May 01 Javascript
Vue 根据条件判断van-tab的显示方式
Aug 03 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
Jul 22 #Javascript
JS判定是否原生方法
Jul 22 #Javascript
js图片延迟加载的实现方法及思路
Jul 22 #Javascript
js添加table的行和列 具体实现方法
Jul 22 #Javascript
JS中eval函数的使用示例
Jul 21 #Javascript
JS中prototype关键字的功能介绍及使用示例
Jul 21 #Javascript
原生JS实现表单checkbook获取已选择的值
Jul 21 #Javascript
You might like
php结合正则批量抓取网页中邮箱地址
2015/05/19 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
PHP的全局错误处理详解
2016/04/25 PHP
CI框架中数据库操作函数$this-&gt;db-&gt;where()相关用法总结
2016/05/17 PHP
PHP安装memcache扩展的步骤讲解
2019/02/14 PHP
TP5框架页面跳转样式操作示例
2020/04/05 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
JQuery动画和停止动画实例代码
2013/03/01 Javascript
jquery判断当前浏览器的实现代码
2015/11/07 Javascript
JavaScript String 对象常用方法总结
2016/04/28 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
JavaScript中有关一个数组中最大值和最小值及它们的下表的输出的解决办法
2016/07/01 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
Bootstrap CDN和本地化环境搭建
2016/10/26 Javascript
通过扫描二维码打开app的实现代码
2016/11/10 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
JavaScript如何实现监听键盘输入和鼠标监点击
2020/07/20 Javascript
vue3.0 项目搭建和使用流程
2021/03/04 Vue.js
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
Python中subprocess的简单使用示例
2015/07/28 Python
python实现将内容分行输出
2015/11/05 Python
详解Tensorflow数据读取有三种方式(next_batch)
2018/02/01 Python
python属于解释型语言么
2020/06/15 Python
详解Css3新特性应用之过渡与动画
2017/01/10 HTML / CSS
CSS3 实现飘动的云朵动画
2020/12/01 HTML / CSS
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
什么是servlet
2012/05/08 面试题
创业计划书中包含的9个方面
2013/12/26 职场文书
家长给老师的道歉信
2014/01/13 职场文书
网络教育自我鉴定
2014/02/04 职场文书
经理秘书求职自荐信范文
2014/03/23 职场文书
自荐信模板大全
2015/03/27 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
利用Sharding-Jdbc进行分库分表的操作代码
2022/01/22 Java/Android
Oracle中DBLink的详细介绍
2022/04/29 Oracle