Safari 扩展 - 如何让多个页面写入一个新页面? (见图)

Safari extension - How can I get multiple pages to write to one new page? (see pic)

我正在构建一个 Safari 扩展程序,我想从几个页面中获取一些数据并聚合到一个新的空白页面,在那里它会被很好地格式化和比较。

我可以让页面将它们的数据发送到 global.html,但您可能知道,global.html 无法写入页面,即使它可以打开一个新的空白页面.

有什么想法吗?

我可以将所有数据发送到数据库,但必须使用网络来完成本应完全在本地完成的操作,这似乎太笨拙了。

如果我没记错的话,你不能写入一个新的空标签,因为它没有 DOM。但是,如果您创建一个新选项卡并将其 URL 设置为 "about:blank",它将有一个 DOM,您可以使用注入的脚本对其进行写入。您可以让注入的脚本测试 运行 所在页面的 URL,并且仅在 URL 为 "about:blank".

时执行某些操作

您无法修改 global.html 文件中的 DOM。但是您可以将消息从 global.html 发送到您打开的 window。 window 只需要能够接收消息的代码。

因此,您将从页面中获取内容,将其发送给 global.html,然后 global.html 会将其发送给您的新 window。

您可以让您的 global.html 文件打开一个新的 window 到扩展文件夹中的内部文件(称为 popup.html),如下所示:

var myWin = safari.application.openBrowserWindow();
myWin.activeTab.url = safari.extension.baseURI + "popup.html";

然后您可以像这样向 window 发送消息:

myWin.activeTab.page.dispatchMessage("messageName", {some: 'data'});

在您的 popup.html 文件中,您需要一些代码来接收该消息,您可以这样做:

safari.self.addEventListener("message", waitForMessage, false);

function waitForMessage(e){
    if(e.name == 'messageName'){
        var data = e.message;
    }
}

如果您需要回信给 global.html,您可以这样做:

safari.self.tab.dispatchMessage("testing",{'this': 'that'});

在此处查看有关 Safari 扩展中消息传递的更多信息:https://developer.apple.com/library/content/documentation/Tools/Conceptual/SafariExtensionGuide/MessagesandProxies/MessagesandProxies.html#//apple_ref/doc/uid/TP40009977-CH14-SW1