主页面、iframe之间调用以及传值
主页面、iframe之间的调用和传值,无非就是两个交互形式:
- 主页面与子页面的交互
- 子页面之间的交互
接下来要讲的是四种交互传值的方式:利用postMessage方法传值、DOM操作传值、URL方式传值、利用全局属性传值
利用postMessage方法传值
这种方式非常像事件绑定、监听。postMessage方法接收两个参数:一条消息、一个表示消息接收方来自哪个域的字符串。第二个参数对保障安全通信非常重要,可以防止浏览器把消息发送到不安全的地方。
demo:
/*主页面发送消息,子页面接收消息的情况*/
//主页面发送消息
var myFrame = document.getElementById("myFrame");//获取框架
myFrame.contentWindow.postMessage("message", "http://crm.piao.qunar.com:8080"); //子页面接收消息,并且做出回应
window.addEventListener('message', function(e){
if(e.origin == "http://crm.piao.qunar.com:8080") {
console.log(e.data);//可以对数据进行处理
e.source.postMessage("确认收到消息", "http://crm.piao.qunar.com:8080");
}
}); /*子页面发送消息,主页面接收消息的情况*/
//子页面发送消息
parent.contentWindow.postMessage("message", "http://crm.piao.qunar.com:8080"); //主页面接收消息
window.addEventListener('message', function(e){
if(e.origin == "http://crm.piao.qunar.com:8080") {
console.log(e.data);//可以对数据进行处理
e.source.postMessage("确认收到消息", "http://crm.piao.qunar.com:8080");
}
});
注意:
- postMessage()的第一个参数最早是作为“永远都是字符串”来实现的。但后来这个参数的定义改了,改成允许传入任何数据结构。可是,并非所有浏览器都实现了这一变化。为保险起见,使用postMessage()时,最好还是只传字符串。如果你想传入结构化的数据,最佳选择是先在要传入的数据上调用JSON.stringify(),通过postMessage()传入得到的字符串,然后再在onmessage事件处理程序中调用JSON.parse()。
- e.source大多数情况下只是window对象的代理,并非实际的window对象。换句话说,不能通过这个代理对象访问window对象的其他任何信息。
- 使用postMessage可能存在兼容性的问题
DOM操作传值
iframe有contentWindow属性,通过contentWindow属性可以对iframe里面的DOM进行操作实现信息交互。还有几个特殊的属性top(最顶层框架)、parent(父级框架)、self(window自身)。
demo:
//子页面操作父页面
top.document.getElementById("mainElement").remove();
//父页面操作子页面
document.getElementById("subFrame").contentWindow.document.getElementById("subElement");
//子页面一操作子页面二
top.document.getElementById("subFrame2").contentWindow.document.getElementById("subElement2");
//子页面二操作子页面一
top.document.getElementById("subFrame1").contentWindow.document.getElementById("subElement1");
URL方式传值
通过在URL上添加数据,然后解析URL,得到相应数据;不过这种方式只能是子页面在加载时,父页面向子页面传输信息。
注意:在URL上添加一些特殊参数时,记得使用encodeURIComponent方法对其进行编码
利用全局属性传值
直接在top、parent等全局变量中添加属性,然后无论是哪个框架都可以通过全局性的属性,取到其值
文件的共用性
主页面与子页面、子页面与子页面之间的JS、CSS文件都是不能通用的,也就是不同框架的JS、CSS在未做特殊处理的情况下,不能相互使用。
主页面、iframe之间调用以及传值的更多相关文章
- 父窗口与iFrame之间调用方法和元素
父窗口与iFrame之间调用方法和元素 父窗口调用子窗口: 调用元素 js格式: var obj=document.getElementById("iframe的name").co ...
- Iframe父子窗口之间的跨域事件调用和传值
实现方案1:location.hash传值 父页面:parent.html(所在域:www.parent.com) 子页面:child.html(所在域:www.child.com) 要实现父子页面双 ...
- JS备忘--子父页面获取元素属性、显示时间,iframe之间互相调用函数
//页面加载完成后执行 $(function () { getHW();}); //当用户改变浏览器大小改变时触发 $(window).resize(function () { setHW(); }) ...
- [转]内嵌页面iframe以及和其兄弟iframe的相互传值
原文出处 iframe的调用包括以下几个方面:(调用包含html dom,js全局变量,js方法) 主页面调用iframe: iframe页面调用主页面: 主页面的包含的iframe之间相互调用: 主 ...
- 解决同一页面中两个iframe互相调用jquery,js函数
这一个月又没更新博客,唉,懒癌又犯了,今天解决了一个问题,关于两个iframe互相调用jquery函数方法 a.html中有两个iframe,如下: <iframe width="10 ...
- jQuery iframe之间相互调用
,子iframe内调用父类函数方法: window.parent.func(); ,子Iframe中获取父界面的元素: $("#xx", window.parent.documen ...
- 两个iframe之间传值
例如:点击后会把另一个iframe中的值得到弹出 Main: <html lang="en" xmlns="http://www.w3.org/1999/xhtml ...
- iOS 中 h5 页面 iframe 调用高度自扩展问题及解决
开发需求需要在 h5 中用 iframe 中调用一个其他公司开发的 html 页面. 简单的插入 <iframe /> 并设置宽高后,发现在 Android 手机浏览器上打开可以正常运行, ...
- react-native页面之间的相互传值
react-native页面之间的相互传值 之前在自己学习react-native的时候,在页面跳转和传值问题上花了一段时间去网上搜索和查找资料,自己总结了两个方法.可以参考 https://blog ...
随机推荐
- WinForm/MIS项目开发之中按钮级权限实践
一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...
- ArcGIS 10与ArcEngine 10安装及破解
1 2 3 4 5 分步阅读 一键约师傅 百度师傅高质屏和好师傅,拯救你的碎屏机 百度经验:jingyan.baidu.com 现在常见的破解方法在下面的地址中已经详细附图说明了,但是这种破解方法,想 ...
- 我的jQuery源码读后感-jquery1.11.x 集成了 AMD
jquery1.11.x 集成了 AMD AMD 加入到了 jQuery, jQuery 把源码切分成各个逻辑模块. ready 整合成依赖 Deferred 的模块. 有些模块被切分成一些更加利于维 ...
- BICEP单元测试——随机四则运算升级版
一.测试方法 6个值得测试的具体部位: Right-结果是否正确? B-是否所有的边界条件都是正确的? I-能查一下反向关联吗? C-能用其他手段交叉检查一下结果吗? E-你是否可以强制错误条件发生? ...
- linux 下cmake 编译 ,调用,调试 poco 1.6.0 小记
上篇文章 小记了: 关于 Poco::TCPServer框架 (windows 下使用的是 select模型) 学习笔记. http://www.cnblogs.com/bleachli/p/4352 ...
- C# 正则表达式
引用自:http://www.cnblogs.com/stg609/archive/2009/06/03/1492709.html 摘要:正则表达式(Regular Expressions),相信做软 ...
- 解决echsop兼容jquery(transport.js的冲突)的问题
方案一: 本人亲测过,可以用.有的人说需要删除js目录下的gobal.js文件,否则依然会冲突.我没删除也解决了冲突. 1.加入JSON2.js文件 原因很简单,transport修改Object是为 ...
- 【Java】实战Java虚拟机之五“开启JIT编译”
今天开始实战Java虚拟机之五“开启JIT编译” 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Ja ...
- iOS Crash日志
Understanding Crash Reports on iPhone OS https://developer.apple.com/videos/wwdc/2010/?id=317 http:/ ...
- 查找Maven JAR坐标
http://mvnrepository.com/ http://search.maven.org/