window.postMessage() 方法可以安全地实现跨源通信。通常,对于两个不同页面的脚本,只有当执行它们的页面位于具有相同的协议(通常为https),端口号(443为https的默认值),以及主机 (两个页面的模数 Document.domain设置为相同的值) 时,这两个脚本才能相互通信。window.postMessage() 方法提供了一种受控机制来规避此限制,只要正确的使用,这种方法就很安全。参考自:https://developer.mozilla.org...这里的跨源是否指的就是跨域?查了一下关于postMessage的使用基本都是iframe向父窗口传数据,那是不是不同协议和不同端口是无法通信的呢?比如说我在localhost:3000启动一个页面,localhost:3500启动一个页面,可不可以进行通信呢btn.addEventListener('click', () => { try { postMessage('helloWorld','localhost:3000' ); console.info('消息已经成功发送') } catch (error) { console.error(error) } })我自己试了一下,会有报错,但是执行时成功的这是不是说只能在子页面或者iframe这种情况下发送数据,不同端口不可以通信?
2 回答
幕布斯7119047
TA贡献1794条经验 获得超8个赞
下面回答题主的其他问题:
可以跨域通信
如果跨域失败是另一种提示,Access-Control-Allow-Origin,,,,,

跨域包含跨端口,可以自行百度下什么是跨域,大概是:协议,域名,端口有一个不同,就是跨域。
繁星淼淼
TA贡献1775条经验 获得超11个赞
postMessage是可以进行跨域通信的。MDN中描述的跨源就是通常意义上的跨域。语法如下:
otherWindow.postMessage(message, targetOrigin, [transfer]);
这里的otherWindow指的是其他窗口的引用,比如iframe的contentWindow属性、执行window.open返回的窗口对象、或者是命名过或数值索引的window.frames。
所以此时的targetOrigin和otherWindow的引用必须是相互匹配的,否则不能进行通信。也就是要和谁进行通信就要拿到谁的引用。
关于window.open有一点需要特别注意的就是:要通过window.open获取引用值,必须是在window.open打开页面成功打开的情况下才会返回该窗口的引用,否则返回null。因为有的浏览器会处于安全机制拦截非用户点击的自弹出窗口,此时window.open是无法获取正常返回值的,postMessage也会失败。
添加回答
举报
0/150
提交
取消
