用postMessage实现跨域通信

     出于要打造一个各个web应用间能够相互联系的生态系统的目标,则需要一种在各个窗口间安全发送消息的方式,利用postMessage()开发正是这样一种方式。


     曾经很长一段时间以来,只有遵守相同协议,并且具有相同端口号,同时在一个主机这样的条件下,窗口间才能互发消息。postMessage()提供了一种安全的跨域通信方法,从而打破了这样的限制。


     在这篇文章中你将首先学习如何利用postMessage()实现分别处在不同域下的两个窗口之间的通信,其中一个窗口是控制窗口(controller window),另一个是接收窗口(receiver window )。


postMessage()来发送消息

postMessage()接收两个参数:

        1、 message——即将被发送到接收窗口的字符串或者对象。
        2、targetOrigin ——接收窗口的URL。为能实现消息的成功发送,目标窗口的协议名,端口号以及主机名必须匹配。“*”能够匹配任何URL,为安全考虑,我们不鼓励这么做。

      如果一个窗口(控制窗口)想向其他窗口(接收窗口)发送消息,则控制窗口可以调用这个方法。我们可以用多种不同方法获得目标窗口的引用。

         1、  使用window.open()方法将返回一个新窗口的引用;
         2、  对iframes而言,可以使用iframes的contentWindow属性。
 
targetWindow.postMessage('Hello World!', 'http://example.com');


        下面让我们来研究下如何在接收窗口上接收信息。

添加事件监听器来接收消息


       当调用postMessage()执行成功后,接收窗口上的MessageEvent事件即被触发。你可以用一个标准的事件监听器来监听这个事件并执行一些代码。

      传入监听器回调的事件有项属性data,能够用来获取由postMessage传入的string或者object。

window.addEventListener('message', function(e) {
  var message = e.data;
});


示例:与iframe通信

                            用postMessage实现跨域通信_第1张图片

                                                                                             使用postMessage与iframe进行通信

        现在你已经掌握了如何使用postMessage()在不同窗口间传递消息,下面让我来看一个例子。

在这个部分我们将在代码层面讲述通过一个示例演示控制页面如何与利用iframe嵌套在其中的接收页面进行通信的。

查看示例              下载代码                   在codepen上查看  



控制窗口


       首先我们需要为控制页面写一些html,其中的主要元素有一个是

你可能感兴趣的:(JavaScript)