postMessage可以进行跨端口通信吗?

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)
                }
            })

我自己试了一下,会有报错,但是执行时成功的

clipboard.png

这是不是说只能在子页面或者iframe这种情况下发送数据,不同端口不可以通信?

阅读 3.3k
2 个回答

不好意思,审题不清,题主的报错截图不影响,是另外的图标请求问题,不影响的,详细了解可以戳这里

下面回答题主的其他问题:

可以跨域通信

如果跨域失败是另一种提示,Access-Control-Allow-Origin,,,,,

clipboard.png

跨域包含跨端口,可以自行百度下什么是跨域,大概是:协议,域名,端口有一个不同,就是跨域。

现在已经弄明白了这个问题写下自己的理解,希望可以对以后遇到相同问题的伙伴一些帮助。此答案不会给自己采纳,欢迎有更好的答案,采纳留给更好的答案。
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也会失败。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题