跨文档消息传输之postMessage()



HTML5提供了在网页文档之间互相接收与发送信息的功能。使用这个功能,只要获取到网页所在窗口对象的实例,不仅同源(域+端口号)的web网页之间可以互相通信,甚至可以实现跨域通信。
首先,要想接受从其他的窗口那里发过来的消息,就必须对窗口对象的message事件进行监视。
使用window对象的postMessage方法向其他窗口发送消息。


具体案例主页面中包括一个iframe,iframe的src指向与主页面不在一个域下的网页,这两个网页之间进行消息传输如下:

主页面:

  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <title>跨文档消息传输示例</title>  
  6.     </head>  
  7.     <body>  
  8.         <iframe src="http://193.168.19.168/ztree/demo/cn/msg.html" width="400" height="400" onload="sendMsg();"></iframe>  
  9.         <div id="div1">  
  10.               
  11.         </div>  
  12.         <script type="text/javascript" charset="utf-8">  
  13.             //绑定onmessage事件,接收消息!  
  14.             addEventListener('message',function(e){  
  15.                 e=e||event;  
  16.                   
  17.                 //e.origin:协议+域名+端口(80默认不显示)  
  18.                 //e.data:消息内容  
  19.                   
  20.                 var obj=JSON.parse(e.data);  
  21.                   
  22.                 if(!obj.error){  
  23.                     alert('接收成功!');  
  24.                     document.getElementById('div1').innerHTML='从e.origin='+e.origin+',那里来的消息e.data='+e.data;  
  25.                 }  
  26.             },false);  
  27.               
  28.               
  29.             function sendMsg(){  
  30.                 //这里必须获得iframe窗口的window对象  
  31.                 //且不要用document.getElementByTagName('iframe')[0]  
  32.                 var winIframe=window.frames[0];  
  33.   
  34.                 setTimeout(function(){  
  35.                     //iframe窗口加载完成,使用postMessage向iframe内发送消息  
  36.                     //第一个参数为:消息内容  
  37.                     //第二个参数为:接收消息的对象窗口url,一般与iframe的src一致或url只到端口号http://193.168.19.168/  
  38.                     winIframe.postMessage('{"张三":10,"李四":20,"王五":30,"小明":40,"小白":50,"老五":60,"老周":67}',"http://193.168.19.168/ztree/demo/cn/msg.html");  
  39.                 },2000);  
  40.             }  
  41.         </script>  
  42.     </body>  
  43. </html>  
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>跨文档消息传输示例</title>
	</head>
	<body>
		<iframe src="http://193.168.19.168/ztree/demo/cn/msg.html" width="400" height="400" οnlοad="sendMsg();"></iframe>
		<div id="div1">
			
		</div>
		<script type="text/javascript" charset="utf-8">
			//绑定onmessage事件,接收消息!
			addEventListener('message',function(e){
				e=e||event;
				
				//e.origin:协议+域名+端口(80默认不显示)
				//e.data:消息内容
				
				var obj=JSON.parse(e.data);
				
				if(!obj.error){
					alert('接收成功!');
					document.getElementById('div1').innerHTML='从e.origin='+e.origin+',那里来的消息e.data='+e.data;
				}
			},false);
			
			
			function sendMsg(){
				//这里必须获得iframe窗口的window对象
				//且不要用document.getElementByTagName('iframe')[0]
				var winIframe=window.frames[0];

				setTimeout(function(){
					//iframe窗口加载完成,使用postMessage向iframe内发送消息
					//第一个参数为:消息内容
					//第二个参数为:接收消息的对象窗口url,一般与iframe的src一致或url只到端口号http://193.168.19.168/
					winIframe.postMessage('{"张三":10,"李四":20,"王五":30,"小明":40,"小白":50,"老五":60,"老周":67}',"http://193.168.19.168/ztree/demo/cn/msg.html");
				},2000);
			}
		</script>
	</body>
</html>


iframe指向的页面:

  1. <!DOCTYPE html>  
  2. <html>  
  3.     <head>  
  4.         <meta charset="utf-8">  
  5.         <title>iframe内容</title>  
  6.         <script type="text/javascript" charset="utf-8">  
  7.             //绑定onmessage事件,接收消息  
  8.             addEventListener('message', function(e) {  
  9.                 e = e || event;  
  10.   
  11.                 //可以过滤域  
  12.                 if (e.origin == 'http://127.0.0.1:8020') {  
  13.                     alert('可以信任的信源');  
  14.   
  15.                     //接收从e.origin发来的消息e.data  
  16.                     var obj = JSON.parse(e.data), aHtml = [];  
  17.   
  18.                     for (var key in obj) {  
  19.                         var age = obj[key], str = '';  
  20.   
  21.                         switch(true) {  
  22.                             case age<=10:  
  23.                                 str = key + '小朋友今年' + age + '岁。';  
  24.                                 break;  
  25.                             case age<=20:  
  26.                                 str = key + '年青人今年' + age + '岁。';  
  27.                                 break;  
  28.                             case age<=30:  
  29.                                 str = key + '中年人今年' + age + '岁。';  
  30.                                 break;  
  31.                             case age<=40:  
  32.                                 str = key + '壮汉今年' + age + '岁。';  
  33.                                 break;  
  34.                             case age<=50:  
  35.                                 str = key + '猛男今年' + age + '岁。';  
  36.                                 break;  
  37.                             case age<=60:  
  38.                                 str = key + '快退休了,今年' + age + '岁。';  
  39.                                 break;  
  40.                             default:  
  41.                                 str = key + '老年人今年' + age + '岁。';  
  42.                                 break;  
  43.                         }  
  44.                           
  45.                         aHtml.push(str);  
  46.                     }  
  47.   
  48.                     document.body.innerHTML = '从e.origin=' + e.origin + ',发来的消息e.data=<br />' + aHtml.join('<br />');  
  49.                 } else {  
  50.                     alert('不可信任的消息源');  
  51.                 }  
  52.   
  53.                 setTimeout(function() {  
  54.   
  55.                     //e.source即主页面的window对象,使用它向主页面发送消息  
  56.                     e.source.postMessage('{"error":false,"msg":""}', e.origin);  
  57.                 }, 2000);  
  58.             }, false);  
  59.   
  60.         </script>  
  61.     </head>  
  62.     <body>  
  63.         <div id="div1">  
  64.   
  65.         </div>  
  66.     </body>  
  67. </html>  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值