目录
html5跨域通信之postMessage的用法
2.通道通信
首页 web前端 H5教程 html5跨域通信之postMessage

html5跨域通信之postMessage

Feb 16, 2017 pm 02:30 PM

html5跨域通信之postMessage的用法

不同域名下的文档因为安全问题,不允许相互之间文档的访问,但是有的时候却不得不需要这样的操作。因此我们一般可以采用 window.name,hash,或者jsonp来实现跨域访问。

不过自从html5出来以后,我们又可以多一种实现方式了postMessage,下面就是一个最简单的消息传递的例子,我们要实现的功能是将page1页面中的内容,发送到不同域名下的page2页面,然后page2将对应消息内容展示出来。

下面是几个比较重要的事件属性:

  • source – 消息源,消息的发送窗口/iframe。

  • origin – 消息源的URI(可能包含协议、域名和端口),用来验证数据源。

  • data – 发送方发送给接收方的数据。 <br>这三个属性是消息传输中必须用到的数据。

首先我们需要两个页面,然后必须分别位于不同的域名下,当然本机肯定要有一个web服务器,接下来就通过修改host来实现不同域名访问

127.0.0.1 www.postmessage1.com127.0.0.1 www.postmessage2.com
登录后复制
登录后复制

主页http://www.php.cn/ 里面嵌套一个iframe框架

<!DOCTYPE html><html><head>
    <title>Html5 postMessage跨文档通信</title></head><body>
    <input type="text" id="text">
    <input type="button" id="send" value="发送">

    <iframe id="ifr" src="http://www.postmessage2.com/page2.html"></iframe>


    <script type="text/javascript">
        var text = document.getElementById(&#39;text&#39;),
            send = document.getElementById(&#39;send&#39;),
            ifr = window.frames[0];            //ifr = document.getElementById(&#39;ifr&#39;).contentWindow;
            //确保你使用的是iframe的contentWindow属性,而不是节点对象。

        send.addEventListener(&#39;click&#39;,function(){
            //主窗口postMessage发送消息给iframe子窗口。
            //子窗口通过监听message事件来获得消息
            ifr.postMessage(text.value,&#39;http://www.postmessage2.com&#39;);
        })    </script></body></html>
登录后复制
登录后复制

iframe框架的src地址为http://www.php.cn/

<!DOCTYPE html><html><head>
    <title></title></head>
    <script type="text/javascript">
        //在iframe窗口中监听messages事件,并接收消息
        window.addEventListener(&#39;message&#39;,function(event){
            var p1 = document.getElementById(&#39;p1&#39;);            if(event.origin === &#39;http://www.postmessage1.com&#39;){
                p1.innerHTML += event.data +"<br>";
            }

        })    </script><body>
    <h1>我是一个iframe</h1>
    <p id="p1"></p></body></html>
登录后复制
登录后复制

这里写图片描述

跟其他很web技术一样,如果你不校验数据源的合法性,那使用这种技术将会变得很危险;你的应用的安全需要你对它负责。window.postMessage就像是PHP相对于JavaScript技术。window.postMessage很酷,不是吗?

双向数据传输也是一样的:

<!DOCTYPE html><html><head>
    <title>Html5 postMessage跨文档通信</title></head><body>
    <input type="text" id="text">
    <input type="button" id="send" value="发送">

    <iframe id="ifr" src="http://www.postmessage2.com/postmessage/iframe01.html"></iframe>


    <script type="text/javascript">
        var text = document.getElementById(&#39;text&#39;),
            send = document.getElementById(&#39;send&#39;),            // ifr = window.frames[0];
            ifr = document.getElementById(&#39;ifr&#39;).contentWindow;
        window.addEventListener(&#39;message&#39;, function(ev){
            if(ev.origin === &#39;http://www.postmessage2.com&#39;){
                alert(&#39;从&#39;+ ev.origin + &#39;传过来的消息:&#39; + ev.data);
            }
        });

        send.addEventListener(&#39;click&#39;,function(){
            //主窗口postMessage发送消息给iframe子窗口。
            //子窗口通过监听message事件来获得消息
            ifr.postMessage(text.value,&#39;http://www.postmessage2.com&#39;);
        })    </script></body></html>
登录后复制
登录后复制

另一个页面的代码如下:

<!DOCTYPE html><html><head>
    <title></title></head>
    <script type="text/javascript">
        //在iframe窗口中监听messages事件,并接收消息
        window.addEventListener(&#39;message&#39;,function(event){
            var p1 = document.getElementById(&#39;p1&#39;);            if (event.origin === &#39;http://www.postmessage1.com&#39;) {
                p1.innerHTML += "来自窗口" + event.origin + event.data+"<br>"
            }            //像主页面回送消息
            event.source.postMessage("你好,这里是:" + this.location, event.origin);

        });    </script><body>
    <h1>我是一个iframe</h1>
    <p id="p1"></p></body></html>
登录后复制
登录后复制

这里写图片描述

2.通道通信

消息通道提供了一个直接,双向浏览上下文之间的通信手段。跟跨文档通信一样,DOM不直接暴露。取而代之,管道每端为端口,数据从一个端口发送,被另一个端口接收,。

消息通道是有用的,特别是跨多个起源的沟通。请考虑以下情形:
人人网上(http://www.php.cn/)嵌入了一个第三方的游戏页面(通过iframe的形式,如“人人餐厅”),同时,这个第三方的游戏页面(http://www.php.cn/)又需要从另外一个通讯录网站(http://www.php.cn/)获取用户的通讯信息。咋办?

也就是说通讯录站点要发送信息给游戏站点,根据跨文档通信,我们让父页面作为代理(也就是这里的人人网页面)(类似第一个demo)。然而,这种做法意味着通讯录站点需要有和人人网页面一样的信任级别。人人网这个社交站点需要信任每一个请求,或者为我们过滤(应该指:一个一个指定)。

但是,使用通道通信,通讯录站点(http://www.php.cn/)和游戏站点(http://www.php.cn/)可以直接沟通

MessageChannel和MessagePort对象

当我们创建了一个MessageChannel对象,我们实际上创造了两个相互关联的端口。一个端口保持开放,为发送端。另外一个被转发到其他浏览上下文(被父页面发送到另外一个iframe元素的子页面中)。

var mc = new MessageChannel();
登录后复制
登录后复制

每一个端口就是一个MessagePort对象,包含3个可用方法:

  • postMessage() 通过通道发送消息

  • start() 开始在端口上分派接受的信息

  • close() 关闭端口

MessagePort对象还有onmessage事件属性,可被用来定义事件句柄而不是事件监听。

实例
上面过于术语的东西我自己都看不明白,还是实例好说话。

首先建立三个网站,其中主网站为:http://www.php.cn/,另外建立两个子网站http://www.php.cn/和http://www.php.cn/。现在来模拟两个子网站之间的通信过程:

需求:当子网站1被加载完成后,向子网站2发送消息:“(1)我已经等不及了,你好了吗?<br>”,当子网站2接收到消息后,向子网站1返回消息,“(2)你别急呀,马上就好!”。当子网页1接收到子网站2 的消息后,返回给主页面页面对话信息.

子页面1的代码

<!DOCTYPE html><html><head>
    <title>通道通信子页面iframe01</title></head><body><script type="text/javascript">
    window.onload = function(){
        var mc, portMessageHandler;
        mc = new MessageChannel();
        portMessageHandler = function(event){
            alert(event.data);
        }        //向父页面发送消息以及端口port2
        window.parent.postMessage(&#39;(1)我已经等不及了,你好了吗?<br>&#39;, &#39;http://localhost/test1/main.html&#39;, [mc.port2]);        //定义本页面接收到消息后,应该做的处理
        mc.port1.addEventListener(&#39;message&#39;, portMessageHandler, false);        //打开本页面的端口,开始监听。。。
        mc.port1.start();
    }</script></body></html>
登录后复制
登录后复制

主页面的代码:

<!DOCTYPE html><html><head>
    <title>messageChannel通信</title></head><body>
    <h1>通道通信实例</h1>

    <iframe style="display: none;" src="http://localhost/test1/iframe01.html"></iframe>
    <iframe style="display: none;" src="http://localhost/test2/iframe02.html"></iframe>
    <script type="text/javascript">
        window.onload = function(){
            var iframes, messageHandle;
            iframes = window.frames;

            messageHandle = function(event){
                if (event.ports.length > 0) {                    //如果有接收端口,将接收的端口与消息转发给iframe02
                    iframes[1].postMessage(event.data,&#39;http://localhost/test2/iframe02.html&#39;, event.ports);
                }
            }            //监听第一个页面
            window.addEventListener(&#39;message&#39;,messageHandle,false);
        }    </script></body></html>
登录后复制
登录后复制

子页面2的代码:

<!DOCTYPE html><html><head>
    <title>通道通信子页面iframe02</title></head><body><script type="text/javascript">
    window.onload = function(){
        var messageHandler = function(event){
            event.ports[0].postMessage(event.data + "(2)你别急呀,马上就好!");
        }        //子页面2接收到消息,并将新的消息转发给子页面1
        window.addEventListener(&#39;message&#39;,messageHandler, false);
    }</script></body></html>
登录后复制
登录后复制

结果图
这里写图片描述

上面的demo动用了三个页面:主页面和两个iframe页面。下面说说每个页面都做了些什么:

首先是第一个iframe页面:其任务有三个,

  • 一是创建MessageChannel通道对象;

  • 二是告诉主页面,我加载好了,并把端口传过去;

  • 三是显示发送信息。

//1.创建MessageChannel通道对象mc = new MessageChannel();//2.二是告诉主页面,我加载好了,并把端口传过去;window.parent.postMessage(&#39;(1)我已经等不及了,你好了吗?<br>&#39;, &#39;http://localhost/test1/main.html&#39;, [mc.port2]);//3.显示发送信息mc.port1.addEventListener(&#39;message&#39;, portMessageHandler, false);
mc.port1.start();
登录后复制
登录后复制

主页面其任务很简单就一个:告诉第二个iframe页面,端口已经打开了(第一个iframe就可以确定跟第二个iframe通信的端口了)。

// 将端口告诉其他文档iframes[1].postMessage(event.data,&#39;http://localhost/test2/iframe02.html&#39;, event.ports);
登录后复制
登录后复制

最后就是第二个iframe页面。其任务有两个:一是确定接到的消息与端口;二是将post一个新的数据和此端口保持通信了。

// 1. 接到消息与端口window.addEventListener(&#39;message&#39;,messageHandler, false);// 2. 与端口建立通道,post一个新的数据port.postMessage(message);
登录后复制
登录后复制

html5跨域通信之postMessage的用法

不同域名下的文档因为安全问题,不允许相互之间文档的访问,但是有的时候却不得不需要这样的操作。因此我们一般可以采用 window.name,hash,或者jsonp来实现跨域访问。

不过自从html5出来以后,我们又可以多一种实现方式了postMessage,下面就是一个最简单的消息传递的例子,我们要实现的功能是将page1页面中的内容,发送到不同域名下的page2页面,然后page2将对应消息内容展示出来。

下面是几个比较重要的事件属性:

  • source – 消息源,消息的发送窗口/iframe。

  • origin – 消息源的URI(可能包含协议、域名和端口),用来验证数据源。

  • data – 发送方发送给接收方的数据。
    这三个属性是消息传输中必须用到的数据。

首先我们需要两个页面,然后必须分别位于不同的域名下,当然本机肯定要有一个web服务器,接下来就通过修改host来实现不同域名访问

127.0.0.1 www.postmessage1.com127.0.0.1 www.postmessage2.com
登录后复制
登录后复制

主页http://www.php.cn/ 里面嵌套一个iframe框架

<!DOCTYPE html><html><head>
    <title>Html5 postMessage跨文档通信</title></head><body>
    <input type="text" id="text">
    <input type="button" id="send" value="发送">

    <iframe id="ifr" src="http://www.postmessage2.com/page2.html"></iframe>


    <script type="text/javascript">
        var text = document.getElementById(&#39;text&#39;),
            send = document.getElementById(&#39;send&#39;),
            ifr = window.frames[0];            //ifr = document.getElementById(&#39;ifr&#39;).contentWindow;
            //确保你使用的是iframe的contentWindow属性,而不是节点对象。

        send.addEventListener(&#39;click&#39;,function(){
            //主窗口postMessage发送消息给iframe子窗口。
            //子窗口通过监听message事件来获得消息
            ifr.postMessage(text.value,&#39;http://www.postmessage2.com&#39;);
        })    </script></body></html>
登录后复制
登录后复制

iframe框架的src地址为http://www.php.cn/

<!DOCTYPE html><html><head>
    <title></title></head>
    <script type="text/javascript">
        //在iframe窗口中监听messages事件,并接收消息
        window.addEventListener(&#39;message&#39;,function(event){
            var p1 = document.getElementById(&#39;p1&#39;);            if(event.origin === &#39;http://www.postmessage1.com&#39;){
                p1.innerHTML += event.data +"<br>";
            }

        })    </script><body>
    <h1>我是一个iframe</h1>
    <p id="p1"></p></body></html>
登录后复制
登录后复制

这里写图片描述

跟其他很web技术一样,如果你不校验数据源的合法性,那使用这种技术将会变得很危险;你的应用的安全需要你对它负责。window.postMessage就像是PHP相对于JavaScript技术。window.postMessage很酷,不是吗?

双向数据传输也是一样的:

<!DOCTYPE html><html><head>
    <title>Html5 postMessage跨文档通信</title></head><body>
    <input type="text" id="text">
    <input type="button" id="send" value="发送">

    <iframe id="ifr" src="http://www.postmessage2.com/postmessage/iframe01.html"></iframe>


    <script type="text/javascript">
        var text = document.getElementById(&#39;text&#39;),
            send = document.getElementById(&#39;send&#39;),            // ifr = window.frames[0];
            ifr = document.getElementById(&#39;ifr&#39;).contentWindow;
        window.addEventListener(&#39;message&#39;, function(ev){
            if(ev.origin === &#39;http://www.postmessage2.com&#39;){
                alert(&#39;从&#39;+ ev.origin + &#39;传过来的消息:&#39; + ev.data);
            }
        });

        send.addEventListener(&#39;click&#39;,function(){
            //主窗口postMessage发送消息给iframe子窗口。
            //子窗口通过监听message事件来获得消息
            ifr.postMessage(text.value,&#39;http://www.postmessage2.com&#39;);
        })    </script></body></html>
登录后复制
登录后复制

另一个页面的代码如下:

<!DOCTYPE html><html><head>
    <title></title></head>
    <script type="text/javascript">
        //在iframe窗口中监听messages事件,并接收消息
        window.addEventListener(&#39;message&#39;,function(event){
            var p1 = document.getElementById(&#39;p1&#39;);            if (event.origin === &#39;http://www.postmessage1.com&#39;) {
                p1.innerHTML += "来自窗口" + event.origin + event.data+"<br>"
            }            //像主页面回送消息
            event.source.postMessage("你好,这里是:" + this.location, event.origin);

        });    </script><body>
    <h1>我是一个iframe</h1>
    <p id="p1"></p></body></html>
登录后复制
登录后复制

这里写图片描述

2.通道通信

消息通道提供了一个直接,双向浏览上下文之间的通信手段。跟跨文档通信一样,DOM不直接暴露。取而代之,管道每端为端口,数据从一个端口发送,被另一个端口接收,。

消息通道是有用的,特别是跨多个起源的沟通。请考虑以下情形:
人人网上(http://www.php.cn/)嵌入了一个第三方的游戏页面(通过iframe的形式,如“人人餐厅”),同时,这个第三方的游戏页面(http://www.php.cn/)又需要从另外一个通讯录网站(http://www.php.cn/)获取用户的通讯信息。咋办?

也就是说通讯录站点要发送信息给游戏站点,根据跨文档通信,我们让父页面作为代理(也就是这里的人人网页面)(类似第一个demo)。然而,这种做法意味着通讯录站点需要有和人人网页面一样的信任级别。人人网这个社交站点需要信任每一个请求,或者为我们过滤(应该指:一个一个指定)。

但是,使用通道通信,通讯录站点(http://www.php.cn/)和游戏站点(http://www.php.cn/)可以直接沟通

MessageChannel和MessagePort对象

当我们创建了一个MessageChannel对象,我们实际上创造了两个相互关联的端口。一个端口保持开放,为发送端。另外一个被转发到其他浏览上下文(被父页面发送到另外一个iframe元素的子页面中)。

var mc = new MessageChannel();
登录后复制
登录后复制

每一个端口就是一个MessagePort对象,包含3个可用方法:

  • postMessage() 通过通道发送消息

  • start() 开始在端口上分派接受的信息

  • close() 关闭端口

MessagePort对象还有onmessage事件属性,可被用来定义事件句柄而不是事件监听。

实例
上面过于术语的东西我自己都看不明白,还是实例好说话。

首先建立三个网站,其中主网站为:http://www.php.cn/,另外建立两个子网站http://www.php.cn/和http://www.php.cn/。现在来模拟两个子网站之间的通信过程:

需求:当子网站1被加载完成后,向子网站2发送消息:“(1)我已经等不及了,你好了吗?<br>”,当子网站2接收到消息后,向子网站1返回消息,“(2)你别急呀,马上就好!”。当子网页1接收到子网站2 的消息后,返回给主页面页面对话信息.

子页面1的代码

<!DOCTYPE html><html><head>
    <title>通道通信子页面iframe01</title></head><body><script type="text/javascript">
    window.onload = function(){
        var mc, portMessageHandler;
        mc = new MessageChannel();
        portMessageHandler = function(event){
            alert(event.data);
        }        //向父页面发送消息以及端口port2
        window.parent.postMessage(&#39;(1)我已经等不及了,你好了吗?<br>&#39;, &#39;http://localhost/test1/main.html&#39;, [mc.port2]);        //定义本页面接收到消息后,应该做的处理
        mc.port1.addEventListener(&#39;message&#39;, portMessageHandler, false);        //打开本页面的端口,开始监听。。。
        mc.port1.start();
    }</script></body></html>
登录后复制
登录后复制

主页面的代码:

<!DOCTYPE html><html><head>
    <title>messageChannel通信</title></head><body>
    <h1>通道通信实例</h1>

    <iframe style="display: none;" src="http://localhost/test1/iframe01.html"></iframe>
    <iframe style="display: none;" src="http://localhost/test2/iframe02.html"></iframe>
    <script type="text/javascript">
        window.onload = function(){
            var iframes, messageHandle;
            iframes = window.frames;

            messageHandle = function(event){
                if (event.ports.length > 0) {                    //如果有接收端口,将接收的端口与消息转发给iframe02
                    iframes[1].postMessage(event.data,&#39;http://localhost/test2/iframe02.html&#39;, event.ports);
                }
            }            //监听第一个页面
            window.addEventListener(&#39;message&#39;,messageHandle,false);
        }    </script></body></html>
登录后复制
登录后复制

子页面2的代码:

<!DOCTYPE html><html><head>
    <title>通道通信子页面iframe02</title></head><body><script type="text/javascript">
    window.onload = function(){
        var messageHandler = function(event){
            event.ports[0].postMessage(event.data + "(2)你别急呀,马上就好!");
        }        //子页面2接收到消息,并将新的消息转发给子页面1
        window.addEventListener(&#39;message&#39;,messageHandler, false);
    }</script></body></html>
登录后复制
登录后复制

结果图
这里写图片描述

上面的demo动用了三个页面:主页面和两个iframe页面。下面说说每个页面都做了些什么:

首先是第一个iframe页面:其任务有三个,

  • 一是创建MessageChannel通道对象;

  • 二是告诉主页面,我加载好了,并把端口传过去;

  • 三是显示发送信息。

//1.创建MessageChannel通道对象mc = new MessageChannel();//2.二是告诉主页面,我加载好了,并把端口传过去;window.parent.postMessage(&#39;(1)我已经等不及了,你好了吗?<br>&#39;, &#39;http://localhost/test1/main.html&#39;, [mc.port2]);//3.显示发送信息mc.port1.addEventListener(&#39;message&#39;, portMessageHandler, false);
mc.port1.start();
登录后复制
登录后复制

主页面其任务很简单就一个:告诉第二个iframe页面,端口已经打开了(第一个iframe就可以确定跟第二个iframe通信的端口了)。

// 将端口告诉其他文档iframes[1].postMessage(event.data,&#39;http://localhost/test2/iframe02.html&#39;, event.ports);
登录后复制
登录后复制

最后就是第二个iframe页面。其任务有两个:一是确定接到的消息与端口;二是将post一个新的数据和此端口保持通信了。

// 1. 接到消息与端口window.addEventListener(&#39;message&#39;,messageHandler, false);// 2. 与端口建立通道,post一个新的数据port.postMessage(message);
登录后复制
登录后复制

 以上就是html5跨域通信之postMessage的内容,更多相关内容请关注PHP中文网(www.php.cn)!<br>

<br>

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

HTML 中的表格边框 HTML 中的表格边框 Sep 04, 2024 pm 04:49 PM

HTML 表格边框指南。在这里,我们以 HTML 中的表格边框为例,讨论定义表格边框的多种方法。

HTML 左边距 HTML 左边距 Sep 04, 2024 pm 04:48 PM

HTML 左边距指南。在这里,我们讨论 HTML margin-left 的简要概述及其示例及其代码实现。

HTML 中的嵌套表 HTML 中的嵌套表 Sep 04, 2024 pm 04:49 PM

这是 HTML 中嵌套表的指南。这里我们讨论如何在表中创建表以及相应的示例。

HTML 表格布局 HTML 表格布局 Sep 04, 2024 pm 04:54 PM

HTML 表格布局指南。在这里,我们详细讨论 HTML 表格布局的值以及示例和输出。

HTML 输入占位符 HTML 输入占位符 Sep 04, 2024 pm 04:54 PM

HTML 输入占位符指南。在这里,我们讨论 HTML 输入占位符的示例以及代码和输出。

HTML 有序列表 HTML 有序列表 Sep 04, 2024 pm 04:43 PM

HTML 有序列表指南。在这里我们还分别讨论了 HTML 有序列表和类型的介绍以及它们的示例

在 HTML 中移动文本 在 HTML 中移动文本 Sep 04, 2024 pm 04:45 PM

HTML 中的文本移动指南。在这里我们讨论一下marquee标签如何使用语法和实现示例。

HTML onclick 按钮 HTML onclick 按钮 Sep 04, 2024 pm 04:49 PM

HTML onclick 按钮指南。这里我们分别讨论它们的介绍、工作原理、示例以及各个事件中的onclick事件。

See all articles