HTML5中的postMessage API基本使用方法分享


本文摘自PHP中文网,作者黄舟,侵删。

window.postMessage经常被人们利用来做跨域数据传递,下面将为大家来介绍HTML5中的postMessage API基本使用教程,需要的朋友可以参考下

关于postMessage

window.postMessage虽然说是html5的功能,但是支持IE8+,假如你的网站不需要支持IE6和IE7,那么可以使用window.postMessage。关于window.postMessage,很多朋友说他可以支持跨域,不错,window.postMessage是客户端和客户端直接的数据传递,既可以跨域传递,也可以同域传递。

应用场景

我只是简单的举一个应用场景,当然,这个功能很多地方可以使用。

假如你有一个页面,页面中拿到部分用户信息,点击进入另外一个页面,另外的页面默认是取不到用户信息的,你可以通过window.postMessage把部分用户信息传到这个页面中。(当然,你要考虑安全性等方面。)

代码举例

发送信息:

1

2

3

4

5

6

7

8

9

10

11

12

13

JavaScript Code复制内容到剪贴板

//弹出一个新窗口  

var domain = 'http://haorooms.com';  

var myPopup = window.open(domain   

            + '/windowPostMessageListener.html','myWindow');  

   

//周期性的发送消息  

setTimeout(function(){  

    //var message = '当前时间是 ' + (new Date().getTime());   

        var message = {name:"站点",sex:"男"}; //你在这里也可以传递一些数据,obj等  

    console.log('传递的数据是  ' + message);  

    myPopup.postMessage(message,domain);  

},1000);


要延迟一下,我们一般用计时器setTimeout延迟再发用。

接受的页面

1

2

3

4

5

6

JavaScript Code复制内容到剪贴板

//监听消息反馈  

window.addEventListener('message',function(event) {  

    if(event.origin !== 'http://haorooms.com') return; //这个判断一下是不是我这个域名跳转过来的  

    console.log('received response:  ',event.data);  

},false);


如下图,接受页面得到数据

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

1

2

3

4

5

6

7

8

9

10

11

12

13

JavaScript Code复制内容到剪贴板

//捕获iframe  

var domain = 'http://haorooms.com';  

var iframe = document.getElementById('myIFrame').contentWindow;  

   

//发送消息  

setTimeout(function(){  

    //var message = '当前时间是 ' + (new Date().getTime());   

        var message = {name:"站点",sex:"男"}; //你在这里也可以传递一些数据,obj等  

    console.log('传递的数据是:  ' + message);  

        //send the message and target URI  

    iframe.postMessage(message,domain);   

},1000);


接受数据

1

2

3

4

5

6

7

JavaScript Code复制内容到剪贴板

//响应事件  

window.addEventListener('message',function(event) {  

    if(event.origin !== 'http://haorooms.com') return;  

    console.log('message received:  ' + event.data,event);  

    event.source.postMessage('holla back youngin!',event.origin);  

},false);


上面的代码片段是往消息源反馈信息,确认消息已经收到。下面是几个比较重要的事件属性:

source ?C 消息源,消息的发送窗口/iframe。
origin ?C 消息源的URI(可能包含协议、域名和端口),用来验证数据源。
data ?C 发送方发送给接收方的数据。

调用实例
1. 主线程中创建 Worker 实例,并监听 onmessage 事件

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

JavaScript Code复制内容到剪贴板

<html>   

<head>   

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">   

<title>Test Web worker</title>   

<script type="text/JavaScript">   

 function init(){   

  var worker = new Worker('compute.js');   

  //event 参数中有 data 属性,就是子线程中返回的结果数据  

  worker.onmessage= function (event) {   

   // 把子线程返回的结果添加到 p 上  

   document.getElementById("result").innerHTML +=   

      event.data+"<br/>";   

  };   

 }   

</script>   

</head>   

<body onload="init()">   

<p id="result"></p>   

</body>   

</html>


在客户端的 compute.js 中,只是简单的重复多次加和操作,最后通过 postMessage 方法把结果返回给主线程,目的就是等待一段时间。而在这段时间内,主线程不应该被阻塞,用户可以通过拖拽浏览器,变大缩小浏览器窗口等操作测试这一现象。这个非阻塞主线程的结果就是 Web Workers 想达到的目的。

2. compute.js 中调用 postMessage 方法返回计算结果

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

JavaScript Code复制内容到剪贴板

var i=0;   

   

function timedCount(){   

 for(var j=0,sum=0;j<100;j++){   

  for(var i=0;i<100000000;i++){   

   sum+=i;   

  }   

 }   

 // 调用 postMessage 向主线程发送消息  

 postMessage(sum);   

}   

   

postMessage("Before computing,"+new Date());   

timedCount();   

postMessage("After computing,"+new Date());


以上就是HTML5中的postMessage API基本使用方法分享的详细内容,更多文章请关注木庄网络博客

相关阅读 >>

HTML5移动端手机网站开发流程

详解HTML5图片上传支持图片预览压缩及进度显示兼容ie6及标准浏览器

HTML5怎么添加图片动画效果

h5的组织内容如何使用

详解HTML5如何获取手机陀螺仪角度信息的示例代码

HTML5实践-使用css制作时间icon的具体详解(图)

移动端HTML5中判断横屏竖屏的方法

canvas波浪效果的实现代码

HTML5 touch事件实现触屏页面上下滑动

用js+HTML5实现的小游戏-- 捕鱼达人游戏

更多相关阅读请进入《HTML5》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...