7

我有一个 HTML 页面(文件main.html )使用带有window.open("newtab.html")方法的 JavaScript 在同一域中打开一个新选项卡。

在新选项卡中,用户通过单击按钮来结束他们的活动。此时,我想向打开器窗口发送一条消息。我尝试使用 postMessage,但从新选项卡中我无法引用开瓶器。

从新标签中,我想要类似的东西,但我已经“ko”了

var w = window.opener;
if (w) {
    w.postMessage("hi", "http://10.150.10.43");
} else {
    alert("ko");
}

将消息从辅助选项卡/窗口发送到主要选项卡/窗口(在同一域中)的最佳方式是什么?

4

1 回答 1

15

这很奇怪。打开一个新窗口window.open("newtab.html")应该让新打开的窗口能够通过window.opener.

无论如何,在同一域上的两个窗口之间进行通信还有其他几个选项。我认为以下两个是最容易实现的:

  1. 使用localStorage。如果您在新标签窗口中将某个键下的某些数据存储到 localStorage 中,则打开器窗口将获得一个存储事件。如果您使用处理程序捕获事件,则可以从新选项卡窗口中写入的 localStorage 中读取数据。请注意,仅当两个页面都在同一个域中并且实际上有两个窗口存在问题时才会触发事件(事件不会在写入数据的同一个窗口中触发)。有关如何执行此操作的更多信息 - 参见例如:http ://diveintohtml5.info/storage.html

  2. 使用共享的 Web 工作者。Web Worker 是一个 JS 脚本,在单独的线程上在后台执行。共享网络工作者是一种特殊类型的网络工作者,它允许任意数量的父文档与单个工作者进行通信。因此,您可以使用工作程序在打开器窗口和新选项卡窗口之间中继消息。与工作人员通信的 API 与 postMessage API 非常相似。有关如何执行此操作的更多信息 - 参见例如:http ://www.sitepoint.com/javascript-shared-web-workers-html5/ 。

于 2012-09-16T19:24:40.713 回答