window.postMessage 打开窗口/选项卡

window.postMessage to open window/tab

提问人:Viking NM 提问时间:10/4/2023 更新时间:10/4/2023 访问量:47

问:

我似乎找不到这个问题的答案;但是打开了窗口/选项卡,我正在尝试使用 postMessage 和 eventListener 在它们之间进行通信......似乎没有任何效果。每个窗口/选项卡都有一个名称;如何通过名称引用该窗口/选项卡?尝试了我看到的所有解决方案,但没有任何效果。window.open() 技巧也不起作用,因为它默认被阻止或不起作用。

const myWindow = window.open('', 'myName');

导致 null myWindow,因此 postMessage 无法执行任何操作,也尝试以相同的 null 结果发送 url。

myWindow.postMessage({'e': 123, 'f': 456, 'g': 789}, '*');

使用 * 仅用于 SNG 进行测试。各种帖子都暗示这能够工作,但到目前为止还没有成功的例子,也没有关于如何通过名称定位已经打开的窗口/选项卡的参考。还有几个域可能被公司使用(启用 CORS)并在不同的选项卡中同时打开。

JavaScript 后消息

评论

0赞 dandavis 10/4/2023
您必须打开或框住一个窗口才能获得用于 postMessage 的句柄。您可以使用事件在同一域上的不同窗口之间发送信息,而不管它们是如何打开的。如果您有多个域,则可以使用服务器中继软件包(如 firebase),或者让它们都嵌入一个域中的隐藏 iframe,您可以在该域中使用 postMessage 或存储事件与 iframe 通信,然后 iframe 可以将 postMessage 发送到 .storagetop
0赞 Viking NM 10/4/2023
所以没有办法按名称定位窗口?好吧,我想也许也可以使用 Service Worker,但这不能做跨域的事情。我可能不得不将 iframe 触发器与 localstorage 一起使用,然后用于不同的域。谢谢:)
0赞 dandavis 10/4/2023
还有 WebRTC 数据通道和共享工作线程,但我认为存储事件虽然在实践中有点复杂,因为它是隐藏的帧等等,但仍然是最简单的仅限客户端的解决方案。如果你的需求很简单/1次,你也可以考虑“名称传输”,stackoverflow.com/questions/23629421/......

答: 暂无答案