H5PostMessages实现跨页面通信

效果图

这里写图片描述

postMessages

HTML5提供了新型机制PostMessage实现安全的跨源通信.

语法

1
otherWindow.postMessage(message, targetOrigin, [transfer]);
  • otherWindow: 其他窗口的一个引用, 比如IFRAME的contentWindow属性, 执行, window.open返回的窗口对象.
  • message: 将要发送到其他窗口的数据.
  • targetOrigin: 通过窗口的origin属性来指定哪些窗口能接收到消息事件, 其值可以是字符”*”(表示无限制)或者一个URL
  • transfer: 是一串和message同时传递的Transferable对象. 这些对象的所有权将被转移给消息的接收方, 而发送一放将不再保有所有权.

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
//1.html消息发送端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>消息发送端</title>
</head>
<body>
<script>
(function () {
//模拟数据
let message = [
'hi',
'hello',
'liuxuan',
'jizemingbu',
'daqiaoweijiu',
];
//随机获取message信息, 真实环境是从服务端获取数据
let getMessage = function () {
let index = Math.floor(Math.random() * 10);
return message[index] || null
}
let postMessageLoop = function () {
let randomTime = Math.floor(Math.random() * 1000);
setTimeout(() => {
let message = getMessage();
if (message !== null) {
window.parent.postMessage(message, 'http://localhost:8088');
}
postMessageLoop();
}, randomTime);
}
postMessageLoop();
})()
</script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
//2.html 消息接收端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>消息接收端</title>
</head>
<body>
<ul id="messageList"></ul>
<iframe id="postWindow" src="1.html" style="display:none"></iframe>
<script>
(function (w) {
let doc = w.document;
let msgList = doc.querySelector('#messageList');
let handler = function (msg) {
let li = doc.createElement('li');
li.innerText = msg;
msgList.appendChild(li);//把消息显示
}
//监视postMessage发送的消息
w.addEventListener('message', function (event) {
if (event.origin === 'http://localhost:8088') {
handler(event.data);
}
}, false);
})(window)
</script>
</body>
</html>
越来越多的平台(微信公众平台,新浪微博,简书,百度打赏等)支持打赏功能,付费阅读时代越来越近,特此增加了打赏功能,支持微信打赏和支付宝打赏。坚持原创技术分享,您的支持将鼓励我继续创作!