主页面、iframe之间的调用和传值,无非就是两个交互形式:

  1. 主页面与子页面的交互
  2. 子页面之间的交互

接下来要讲的是四种交互传值的方式:利用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");
}
});

注意:

  1. postMessage()的第一个参数最早是作为“永远都是字符串”来实现的。但后来这个参数的定义改了,改成允许传入任何数据结构。可是,并非所有浏览器都实现了这一变化。为保险起见,使用postMessage()时,最好还是只传字符串。如果你想传入结构化的数据,最佳选择是先在要传入的数据上调用JSON.stringify(),通过postMessage()传入得到的字符串,然后再在onmessage事件处理程序中调用JSON.parse()。
  2. e.source大多数情况下只是window对象的代理,并非实际的window对象。换句话说,不能通过这个代理对象访问window对象的其他任何信息。
  3. 使用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之间调用以及传值的更多相关文章

  1. 父窗口与iFrame之间调用方法和元素

    父窗口与iFrame之间调用方法和元素 父窗口调用子窗口: 调用元素 js格式: var obj=document.getElementById("iframe的name").co ...

  2. Iframe父子窗口之间的跨域事件调用和传值

    实现方案1:location.hash传值 父页面:parent.html(所在域:www.parent.com) 子页面:child.html(所在域:www.child.com) 要实现父子页面双 ...

  3. JS备忘--子父页面获取元素属性、显示时间,iframe之间互相调用函数

    //页面加载完成后执行 $(function () { getHW();}); //当用户改变浏览器大小改变时触发 $(window).resize(function () { setHW(); }) ...

  4. [转]内嵌页面iframe以及和其兄弟iframe的相互传值

    原文出处 iframe的调用包括以下几个方面:(调用包含html dom,js全局变量,js方法) 主页面调用iframe: iframe页面调用主页面: 主页面的包含的iframe之间相互调用: 主 ...

  5. 解决同一页面中两个iframe互相调用jquery,js函数

    这一个月又没更新博客,唉,懒癌又犯了,今天解决了一个问题,关于两个iframe互相调用jquery函数方法 a.html中有两个iframe,如下: <iframe width="10 ...

  6. jQuery iframe之间相互调用

    ,子iframe内调用父类函数方法: window.parent.func(); ,子Iframe中获取父界面的元素: $("#xx", window.parent.documen ...

  7. 两个iframe之间传值

    例如:点击后会把另一个iframe中的值得到弹出 Main: <html lang="en" xmlns="http://www.w3.org/1999/xhtml ...

  8. iOS 中 h5 页面 iframe 调用高度自扩展问题及解决

    开发需求需要在 h5 中用 iframe 中调用一个其他公司开发的 html 页面. 简单的插入 <iframe /> 并设置宽高后,发现在 Android 手机浏览器上打开可以正常运行, ...

  9. react-native页面之间的相互传值

    react-native页面之间的相互传值 之前在自己学习react-native的时候,在页面跳转和传值问题上花了一段时间去网上搜索和查找资料,自己总结了两个方法.可以参考 https://blog ...

随机推荐

  1. 在SOUI中非半透明窗口如何实现圆角窗口?

    如果SOUI的宿主窗口没有包含子窗口,直接使用窗口的半透明属性:translucent=1就可以解决了,整个窗口形状完全由背景图决定,可以实现完美的圆角. 然后窗口半透明时,窗口中的子窗口(非SWin ...

  2. webbench之编译安装(一)

    1.编译安装:   1 2 3 4 [root@hexuweb102 ~]$wget http://blog.s135.com/soft/linux/webbench/webbench-1.5.tar ...

  3. Go语言 使用内置Http组件

    package main import ( "net/http" ) func SayHello(w http.ResponseWriter, req *http.Request) ...

  4. Codeforces Round #370 - #379 (Div. 2)

    题意: 思路: Codeforces Round #370(Solved: 4 out of 5) A - Memory and Crow 题意:有一个序列,然后对每一个进行ai = bi - bi  ...

  5. PHP 删除目录及目录下文件

    <?php function del_dir ($dir,$type=true){    $n=0;    if (is_dir($dir)) {        if ($dh = opendi ...

  6. 2016 Multi-University Training Contest 3

    5/11 2016 Multi-University Training Contest 3官方题解 2016年多校训练第三场 老年选手历险记 暴力 A Sqrt Bo(CYD) 题意:问进行多少次开根 ...

  7. nodejs安装express不是内部或外部命令

    工具/原料  Node.js安装包 方法/步骤  首先下载Node.js安装包,此处我用的是官方最新的v0.10.27 32位版: http://nodejs.org/dist/v0.10.27/no ...

  8. 卸载oracle删除注册表脚本

    一.前言 在我们操作系统中,有时要卸载oracle数据库,每一次都要去删除win下的注册表,为了方便删除注册表的信息,下面通过一种删除注册表快捷的脚本. 二.脚本信息 Windows Registry ...

  9. NSDateFormatter 相关理解

    Formatter译为格式,相应的NSDateFormatter就相当于是NSDate的转换类,将NSDate转换为另一种格式,或转换回来.NSDate没有自己的输出,需要借助NSDateFormat ...

  10. java分享第十一天(接口测试)

     HTTP协议的接口测试中,使用到最多的就是GET请求与POST请求,其中POST请求有FORM参数提交请求与RAW请求( post请求时有一个选项是form-data,或者raw,使用raw可以请求 ...