Vue 应用 postMessage 实现窗口通信
【摘要】 一、拓展阅读在前端应用中,窗口间通信应用场景很多,比如弹出qq登录认证窗。 二、postMessage 语法window.postMessage(msg,targetOrigin)注意⚠️postMessage要通过window对象调用!因为这里的window不只是当前window!大部分使用postMessage的时候,都不是本页面的window,而是其他网页的window!如:ifra...
一、拓展阅读
在前端应用中,窗口间通信应用场景很多,比如弹出qq登录认证窗。
二、postMessage 语法
window.postMessage(msg,targetOrigin)
注意⚠️postMessage
要通过window
对象调用!因为这里的window
不只是当前window
!大部分使用postMessage
的时候,都不是本页面的window
,而是其他网页的window
!如:
iframe
的contentWindow
;- 通过
window.open
方法打开新窗口的window
; window.opener
如果你使用postMessage
时没有带window
,就是用的本页面的window
来调用它。
2.1 参数说明
msg
这是要传递的消息。它可以是一切javascript
参数,如字符串,数字,对象,数组,而不是和json
一样只局限于字符串。
targetOrigin
这个参数称作“目标域”,注意⚠️,是目标域不是本域!比如,你想在2.com的网页上往1.com网页上传消息,那么这个参数就是“http://1.com/”,而不是2.com.
另外,一个完整的域包括:协议,主机名,端口号。如:http://g.cn:80/
window.open
方法会返回一个窗口对象,使用这个对象可以向子窗口发送消息,而子窗口可以通过window.opener
向父窗口发送消息,示例如下:
// index.html
<body>
<button onclick="opwin()">打开</button>
<script type="text/javascript">
function opwin() {
//保留窗口对象
var popup = window.open("test.html", "_blank");
}
function receiveMessage(event) {
//event.origin是指发送的消息源,一定要进行验证!!!
if (event.origin !== "http://localhost")return;
//event.data是发送过来的消息。
console.log(event.data);
//event.source是指子窗口,主动向子窗口发送消息可以用popup
//postMessage有两个参数,消息和自己的源(例如http://www.baidu.com),自己的源应该和目标源相同。否则发送会失败。
event.source.postMessage("我是主窗口,我接收到消息了",window.location);
}
//添加消息接收函数
window.addEventListener("message", receiveMessage, false);
</script>
</body>
// test.html
<body>
<button onclick="send()">发送</button>
<script type="text/javascript">
function send() {
//window.opener指的就是父窗口(打开本窗口的窗口)
window.opener.postMessage("我是子窗口,向主窗口发送消息", window.location);
}
function receiveMessage(event) {
if (event.origin !== "http://localhost")return;
console.log(event.data);
}
window.addEventListener("message", receiveMessage, false);
</script>
</body>
由于postMessage
是通过网络协议,所以不能以直接在浏览器以打开html
的方式进行调试。而是应该放在服务器上,走网络协议。
三、拓展阅读
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)