HTML5中使用postMessage实现两个网页间传递数据

2019-01-28 14:40:37王振洲

估计很少人知道HTML5 APIS里有一个window.postMessage API。window.postMessage的功能是允许程序员跨域在两个窗口/frames间发送数据信息。基本上,它就像是跨域的AJAX,但不是浏览器跟服务器之间交互,而是在两个客户端之间通信。让我们来看一下window.postMessage是如何工作的。除了IE6、IE7之外的所有浏览器都支持这个功能。

数据发送端

首先我们要做的是创建通信发起端,也就是数据源”source”。作为发起端,我们可以open一个新窗口,或创建一个iframe,往新窗口里发送数据,简单起见,我们每6秒钟发送一次,然后创建消息监听器,从目标窗口监听它反馈的信息。

JavaScript Code复制内容到剪贴板
  1. //弹出一个新窗口    var domain = 'http://scriptandstyle.com';   
  2. var myPopup = window.open(domain                 + '/windowPostMessageListener.html','myWindow');   
  3.    //周期性的发送消息   
  4. setInterval(function(){     var message = 'Hello!  The time is: ' + (new Date().getTime());   
  5.  console.log('blog.local:  sending message:  ' + message);            //send the message and target URI   
  6.  myPopup.postMessage(message,domain);    },6000);   
  7.    //监听消息反馈   
  8. window.addEventListener('message',function(event) {     if(event.origin !== 'http://scriptandstyle.com') return;   
  9.  console.log('received response:  ',event.data);    },false);   
  10.   

这里我使用了window.addEventListener,但在IE里这样是不行的,因为IE使用window.attachEvent。如果你不想判断浏览器的类型,可以使用一些工具库,比如jQuery或Dojo。

假设你的窗口正常的弹出来了,我们发送一条消息——需要指定URI(必要的话需要指定协议、主机、端口号等),消息接收方必须在这个指定的URI上。如果目标窗口被替换了,消息将不会发出。

我们同时创建了一个事件监听器来接收反馈信息。有一点极其重要,你一定要验证消息的来源的URI!只有在目标方合法的情况才你才能处理它发来的消息。

如果是使用iframe,代码应该这样写:

JavaScript Code复制内容到剪贴板