Vue进阶(九十二):窗口间通信postMessage

举报
SHQ5785 发表于 2020/12/30 01:53:01 2020/12/30
【摘要】 在前端应用中,窗口间的通信用的地方还是挺多的,比如弹出qq登录认证窗。 postMessage语法 window.postMessage(msg,targetOrigin) 1 注意postMessage要通过window对象调用!因为这里的window不只是当前window,大部分使用postMessage的时候,都不是本页面的window,而是其他网页的win...

在前端应用中,窗口间的通信用的地方还是挺多的,比如弹出qq登录认证窗。在这里插入图片描述

postMessage语法

window.postMessage(msg,targetOrigin)

  
 
  • 1

注意postMessage要通过window对象调用!因为这里的window不只是当前window,大部分使用postMessage的时候,都不是本页面的window,而是其他网页的window!如:

  1. iframe的contentWindow
  2. 通过window.open方法打开的新窗口的window
  3. window.opener

如果你使用postMessage时没有带window,那么,你就是用的本页面的window来调用了它。

参数说明

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>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

由于postMessage是通过网络协议,所以不能以直接在浏览器打开html的方式进行调试。而是应该放在服务器上,走网络协议。

拓展阅读

文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。

原文链接:shq5785.blog.csdn.net/article/details/104042541

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。