window.postMessage讲解

api文档说明:window.postMessage - Web API 接口参考 | MDN

postMessage可以实现跨源通信,即一个窗口可以获得对另一个窗口的引用,传递消息。但这种消息的传递也是有限制的,另一个窗口必须是从本窗口打开(window.open)或者是本窗口中的iframe

消息监听:

window.addEventListener("message", function(e){
	console.log(e);
    console.log(e.origin); // 发送消息窗口的地址,监听消息时,可限制接收消息来源地址
    console.log(e.source); // 发送消息窗口Window对象
    console.log(e.data); // 消息内容,字符串或者对象
})

消息发送:

/**
* otherWindow: 其他窗口的window对象
* message: 消息内容,字符串或对象都可
* targetOrigin: 接收消息窗口地址,指定哪些窗口可以接收到消息,可为“*”(无限制)
* transfer: 可选
*/
otherWindow.postMessage(message, targetOrigin, [transfer]);

示例代码:

postMessage_1.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>窗口1</title>
	</head>
	<body>
		<textarea row=10 style="width: 100%;" id="msg"></textarea>
		<button type="button" onclick="openNew()">打开新窗口</button>
		<button type="button" onclick="sendMsg()">发送open窗口消息</button>
		<button type="button" onclick="sendMsgIframe()">发送iframe消息</button>
		<button type="button" onclick="sendMsgIframe2()">发送iframe2消息</button>
		<p>iframe窗口</p>
		<iframe src="./postMessage_2.html" style="width: 100%; height: 200px;" id="teIframe"></iframe>
	</body>
	<script type="text/javascript">
	
		/**
		 * 具体参考说明: https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage 
		 * postMessage要传递消息,要获取打开open的窗口
		 * 即本页面需要记录open的对象,otherWin
		 */
	
		var otherWin = null;
		function sendMsg(){
			var val = document.getElementById("msg").value;
			if(otherWin){
				otherWin.postMessage(val, "*");
			}
		}
		
		function sendMsgIframe(){
			var val = document.getElementById("msg").value;
			var frames = window.frames; // 获取当前window的所有iframe的对象
			for (var i = 0; i < frames.length; i++) {
			  frames[i].postMessage(val, "*");
			}
		}
		
		function sendMsgIframe2(){
			var val = document.getElementById("msg").value;
			var frame = document.getElementById("teIframe").contentWindow;
			frame.postMessage(val, "*");
		}
		
		function openNew(){
			otherWin = window.open("./postManage_2.html");
		}
		
		window.addEventListener("message", function(e){
			document.getElementById("msg").value = e.data;
		})
	</script>
</html>

postMessage_2.html

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>其他窗口</title>
	</head>
	<body>
		<textarea row=10 style="width: 100%;" id="msg"></textarea>
		<button type="button" onclick="sendMsg()">发送消息</button>
	</body>
	<script type="text/javascript">
	
		/**
		 * 具体参考说明: https://developer.mozilla.org/zh-CN/docs/Web/API/Window/postMessage 
		 * postMessage要传递消息,要获取触发打开open的窗口,
		 * 方式一: 监听消息,通过e.source得到
		 * 方式二:window.opener
		 */
		
		var win = window.opener ? window.opener : window.parent;  // 可以是window.open 或者iframe的形式
		function sendMsg(){
			var val = document.getElementById("msg").value;
			if(win){
				win.postMessage(val, "*");
			}
		}
		
		window.addEventListener("message", function(e){
			// fromWin = e.source;
			document.getElementById("msg").value = e.data;
		})
	</script>
</html>

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值