html5 窗口之间的通信
一般窗口通信分为三种:
- iframe嵌套:多个iframe之间通信。
- 父页面操作子页面元素:oFrame.contentWindow.document.body。
- 父页面调用子页面方法:oFrame.contentWindow.functionName()。
- 子页面调用父页面元素:window.top/parent/window

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<iframe id="myFrame" src="Iframe2.html"></iframe><br />
<input type="button" value="改变子窗口的背景色" id="btn1" />
<input type="button" value="调用子窗口的方法" id="btn2" />
</body>
</html>
<script type="text/javascript">
window.onload = function(){
var myFrame = document.getElementById("myFrame");
var oBtn1 = document.getElementById("btn1");
var oBtn2 = document.getElementById("btn2");
oBtn1.onclick = function(){
myFrame.contentWindow.document.body.style.background = "greenyellow";
}
oBtn2.onclick = function(){
myFrame.contentWindow.chlidWindowHandler();
}
}
function parentWindowHandler(){
alert("这是父窗口的方法,可以被子窗口调用");
}
</script><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>这是iframe2</h1>
<input type="button" value="改变父窗口的背景色" id="btn1" />
<input type="button" value="调用父窗口的方法" id="btn2" />
</body>
</html>
<script type="text/javascript">
window.onload = function(){
var oBtn1 = document.getElementById("btn1");
var oBtn2 = document.getElementById("btn2");
oBtn1.onclick = function(){
window.top.document.body.style.background = "deepskyblue";
console.log(window.top);
}
oBtn2.onclick = function(){
window.top.parentWindowHandler();
}
}
function chlidWindowHandler(){
alert("这是子窗口的方法,可以被父窗口调用");
}
</script> - 用window.open()方法打开一个新的窗口。
- 父页面操作子页面元素:window.open()打开子页面时,返回子页面窗口对象。
- 子页面操作父页面元素:window.opener即为父窗口对象。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
input{margin:10px;}
</style>
</head>
<body>
<input type="button" name="" id="btn1" value="打开一个新窗口" /><br />
<input type="button" name="" id="btn2" value="改变子窗口背景色" /><br />
<input type="button" name="" id="btn3" value="调用子窗口方法" />
</body>
</html>
<script type="text/javascript">
window.onload = function(){
var oBtn1 = document.getElementById("btn1");
var oBtn2 = document.getElementById("btn2");
var oBtn3 = document.getElementById("btn3"); var childWin = null;
oBtn1.onclick = function(){
childWin = window.open("child.window.html","_blank");
}
oBtn2.onclick = function(){
//方法1
childWin.document.body.style.background = "greenyellow";
}
oBtn3.onclick = function(){
childWin.childWinHandler();
}
}
function parentWinHandler(){
alert("这是父窗口方法,可以被子窗口调用");
}
</script><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<input type="button" name="" id="btn1" value="改变父窗口背景色" />
<input type="button" name="" id="btn2" value="调用父窗口的方法" />
</body>
</html>
<script type="text/javascript">
window.onload = function(){
var oBtn1 = document.getElementById("btn1");
var oBtn2 = document.getElementById("btn2");
oBtn1.onclick = function(){
window.opener.document.body.style.background = "deepskyblue";
}
oBtn2.onclick = function(){
window.opener.parentWinHandler();
}
} function childWinHandler(){
alert("这是子窗口的事件,可以被父窗口调用");
}
</script> - html5t提供的postMessage方法和message事件。
- postMessage():接收消息窗口对象.postMessage("发送的数据","接收的域"); 这里的域一定要带上协议
- message事件:接收消息窗口监听message事件,事件对象中包含有origin属性和data属性。其中ev.origin可以获取发送数据的域,ev.data获取发送的具体数据。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<iframe id="myFrame" src="http://localhost:63342/XChart/Iframe2.html" width="600px;"></iframe><br />
<input type="button" value="向子窗口发送数据" id="btn" />
</body>
</html>
<script type="text/javascript">
window.onload = function(){
var myFrame = document.getElementById("myFrame");
var oBtn = document.getElementById("btn"); oBtn.onclick = function(){
myFrame.contentWindow.postMessage("testData","http://localhost:63342");
}
}
function parentWindowHandler(){
alert("这是父窗口的方法,可以被子窗口调用");
}
</script><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<p>http://localhost:63342/XChart/Iframe2.html</p>
</body>
</html>
<script type="text/javascript">
window.onload = function(){
window.addEventListener("message",function(ev){
alert("父窗口向子窗口发送的数据是:" + ev.data);
alert("数据来源是:" + ev.origin);
})
} </script>
html5 窗口之间的通信的更多相关文章
- 父窗口,子窗口之间的JS"通信"方法
今天需要在iframe内做一个弹窗,但使用弹窗组件的为子窗口,所以弹窗只在子窗口中显示掩膜层和定位,这样不符合需求. 后来晓勇哥指点,了解到一个以前一直没关注到的东西,每个窗口的全局变量,其实都存在对 ...
- 使用HTML5 的跨域通信机制进行数据同步
离线应用系统的设计目标就是在网络离线情况下依然可以操作我们的应用系统,并在网络畅通的情况下与服务器进行数据交互. 所以离线应用系统最终会做成类似C/S架构的客户端应用程序.这边基于Chrome或者 S ...
- Delphi 两个应用程序(进程)之间的通信
两个应用程序之间的通信实际上是两个进程之间的通信.由于本人知识有限,决定应用消息来实现.需要用到的知识: 1.RegisterWindowMessage(); //参数类型:pchar:返回值:Lon ...
- Android模拟器的ip获取以及模拟器之间socket通信
Android模拟器的ip获取以及模拟器之间socket通信 http://kalogen.iteye.com/blog/1565507 作者:李波 实现网络五子棋时用到了两个设备 ...
- VC中利用多线程技术实现线程之间的通信
当前流行的Windows操作系统能同时运行几个程序(独立运行的程序又称之为进程),对于同一个程序,它又可以分成若干个独立的执行流,我们称之为线程,线程提供了多任务处理的能力.用进程和线程的观点来研究软 ...
- 网络编程之Socket的TCP协议实现客户端与客户端之间的通信
我认为当你学完某个知识点后,最好是做一个实实在在的小案例.这样才能更好对知识的运用与掌握 如果你看了我前两篇关于socket通信原理的入门文章.我相信对于做出我这个小案列是完全没有问题的!! 既然是小 ...
- 基于WSAAsyncSelect模型的两台计算机之间的通信
任务目标 编写Win32程序模拟实现基于WSAAsyncSelect模型的两台计算机之间的通信,要求编程实现服务器端与客户端之间双向数据传递.客户端向服务器端发送"请输出从1到1000内所有 ...
- MFC 窗口分割与通信
一.关于CSplitterWnd类我们在使用CuteFtp或者NetAnt等工具的时候,一般都会被其复杂的界面所吸引,在这些界面中窗口被分割为若干的区域,真正做到了窗口的任意分割. 那么我们自己如何创 ...
- JS观察者设计模式:实现iframe之间快捷通信
观察者设计模式又称订阅发布模式,在JS中我们习惯叫做广播模式,当多个对象监听一个通道时,只要发布者向该通道发布命令,订阅者都可以收到该命令,然后执行响应的逻辑.今天我们要实现的就是通过观察者设计模式, ...
随机推荐
- Codeforces_731F_(前缀和)
F. Video Cards time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- Redis 之sentinel运维监控
有三台redis服务器6379.6380.6381,配置6379为主服务器,6380与6381都为6379的从服务器.如果主服务器6379挂掉了,我们怎么办? 方式一:手动修改从服务器的配置,将638 ...
- javascript模块化编程(一)(http://www.ruanyifeng.com/blog/2012/10/javascript_module.html)
Javascript模块化编程(一):模块的写法 随着网站逐渐变成"互联网应用程序",嵌入网页的Javascript代码越来越庞大,越来越复杂. 网页越来越像桌面程序,需要一个 ...
- vue中使用Swiper
第一步:安装swiper在项目目录下打开命令窗口输入命令:npm install swiper 第二步:引入js文件 第三步:引入css文件在main.js文件中引入css文件
- fuel一键部署
1. 所需物理主机的要求如下 内存:8GB+,推荐16GB: 磁盘:50GB+: 物理机OS:ubuntu-desktop-amd64 14.04(推荐) 或windows64位 物理机安装软件:安装 ...
- CentOS安装Docker-ce并配置国内镜像
前提条件 1.系统.内核 CentOS7 要求64位系统.内核版本3.10以上 CentOS6 要求版本在6.5以上,系统64位.内核版本2.6.32-431以上 查看内核版本号 uname -r # ...
- 刽子手游戏(Hangman Judge, UVa 489)
刽子手游戏其实是一款猜单词游戏,游戏规则是这样的:计算机想一个单词让你猜,你每次可以猜一个字母.如果单词里有那个字母,所有该字母会显示出来:如果没有那个字母,则计算机会在一幅“刽子手”画上填一笔.这幅 ...
- Java 内存模型与线程
when ? why ? how ? what ? 计算机的运行速度和它的存储和通信子系统速度的差距太大,大量的时间都花费在磁盘I/O .网络通信或者数据库访问上.如何把处理器的运算能力"压 ...
- webstorm汉化后乱码现象解决
本人之前使用的编辑器是sublime,今天换成webstrom,汉化时出现乱码现象,一开始我以为是没安装完整所以重装了好几遍,后来百度后才知道是webstrom字体类型的问题,具体解决方法如图,点击最 ...
- 【Codeforces 1114B】Yet Another Array Partitioning Task
[链接] 我是链接,点我呀:) [题意] 让你把数组分成k个连续的部分 使得每个部分最大的m个数字的和最大 [题解] 把原数组降序排序 然后选取前m*k个数字打标记 然后对于原数组 一直贪心地取 直到 ...