博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
window.postMessage实现网页间通信
阅读量:5966 次
发布时间:2019-06-19

本文共 2574 字,大约阅读时间需要 8 分钟。

window.postMessage() 方法可以安全地实现跨域通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。

一、安装live-server

要想实现跨窗口通信,必须要在服务器上运行,直接用浏览器打开HTML文件只能处理单个文件,窗口之间无法通信。

npm install -g live-server

使用命令live-server进行启动。

安装live-server,在任意位置启动服务器。

在服务器中启动之后,会看见文档中多了一个script标签。这段代码是由live-server插入的。当运行在后台的live-server检测到文件变化,就会通过websockt向网页发送“reload”消息,从而可以实现浏览器中的网页总是实时的响应文件的变更。

// = 0 ? '&' : '?') + '_cacheOverride=' + (new Date().valueOf());                    }                    head.appendChild(elem);                }            }            var protocol = window.location.protocol === 'http:' ? 'ws://' : 'wss://';            var address = protocol + window.location.host + window.location.pathname + '/ws';            var socket = new WebSocket(address);            socket.onmessage = function(msg) {                if (msg.data == 'reload') window.location.reload();                else if (msg.data == 'refreshcss') refreshCSS();            };            console.log('Live reload enabled.');        })();    }    // ]]>

二、基础知识

MessageEvent有以下几个属性:

  • data:从其他window中传递过来的对象
  • origin:调用 postMessage 时消息发送方窗口的 origin
  • source:对发送消息的窗口对象的引用; 您可以使用此来在具有不同origin的两个窗口之间建立双向通信。

在发送数据窗口执行:otherWindow.postMessage(msg,origin)

  • otherWindow:表示接受数据的窗口的window对象,包括iframe的子窗口和通过window.open打开的新窗口。
  • msg表示要发送的数据,包扩字符串和对象(ie9以下不支持,可以利用字符串和json互换)。
  • origin表示接收的域名。

三、最简单的一个demo

父窗口打开一个子窗口,然后询问子窗口:“吃饭了吗”,子窗口回复父窗口:“吃了”

father.html

son.html

四、一个网页聊天系统

father.html

        

myson.html

        

五、最后一个demo

    

son.html

    popup window        

六、安全问题

如果您不希望从其他网站接收message,请不要为message事件添加任何事件侦听器。

如果您确实希望从其他网站接收message,请始终使用origin和source属性验证发件人的身份。
当您使用postMessage将数据发送到其他窗口时,始终指定精确的目标origin,而不是*。

参考资料

转载地址:http://qlmax.baihongyu.com/

你可能感兴趣的文章
C++ Error: error LNK2019: unresolved external symbol
查看>>
Bitmap 和Drawable 的区别
查看>>
Java操作mongoDB2.6的常见API使用方法
查看>>
如何给服务器设置邮件警报。
查看>>
CEF js调用C#封装类含注释
查看>>
麦克劳林
查看>>
Eclipse SVN修改用户名和密码
查看>>
架构师的职责都有哪些?
查看>>
SVN: bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7
查看>>
jsp内置对象作业3-application用户注册
查看>>
android115 自定义控件
查看>>
iOS uuchart 用法
查看>>
c# 多线程 调用带参数函数
查看>>
JQuery 如何选择带有多个class的元素
查看>>
The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar
查看>>
VS快速生成JSON数据格式对应的实体
查看>>
Word2vec 模型载入(tensorflow)
查看>>
Linux内核——定时器和时间管理
查看>>
RabbitMq消息序列化简述
查看>>
git忽略文件【转】
查看>>