如何在两个不同选项卡的内容脚本之间传输数据?

gvl*_*sov 4 google-chrome-extension content-script

在我的扩展中,我需要将一些数据从一个选项卡的内容脚本传输到另一个选项卡的内容脚本.如果我知道该标签对象的名称或网址的一部分,我如何使用chrome.tabs选择某个标签?两个标签的脚本如何通信?

更新:

显然我在chrome.extension中没有方法sendMessage.当我从内容脚本运行以下内容时:

chrome.extension.sendMessage("message");
Run Code Online (Sandbox Code Playgroud)

我进入控制台:

未捕获的TypeError:对象#没有方法'sendMessage'

Rob*_*b W 5

首先,请注意在扩展中传递的消息是JSON序列化的.消息中不包括不可序列化的类型,例如函数.

在内容脚本中,您必须将消息传递到后台页面,因为没有方法可以直接访问其他选项卡.

// Example: Send a string. Often, you send an object, which includes
//  additional information, eg {method:'userdefined', data:'thevalue'}
chrome.extension.sendMessage(' ... message ... ');
Run Code Online (Sandbox Code Playgroud)

后台页面中,使用该chrome.tabs.query方法获取选项卡的ID.为了简单的例子,我已经对模式和网址进行了硬编码.以这种方式包含上一条消息中的查询值可能是个好主意:{query:{...}, data:...}.

// background script:
chrome.extension.onMessage.addListener(function(details) {
    chrome.tabs.query({
        title: "title pattern",
        url: "http://domain/*urlpattern*"
    }, function(result) {
        // result is an array of tab.Tabs
        if (result.length === 1) { // There's exactely one tab matching the query.
            var tab = result[0];
            // details.message holds the original message
            chrome.tabs.sendMessage(tab.id, details.message);
        }
    });
});
Run Code Online (Sandbox Code Playgroud)

chrome.tabs.sendMessage 用于将原始数据传递到不同的选项卡.

备注:在示例中,我仅在查询生成一个唯一选项卡时传递了消息.如果唯一性不是先决条件,只需使用result.forEach或遍历所有生成的选项卡:

for (var i=0, tab; i<result.length; i++) {
    tab = results[i];
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • @Susei`chrome.extension.sendMessage`是在Chrome 20中引入的.在Chrome 20之前,您必须使用`chrome.extension.sendRequest`(并使用`onRequest`而不是`onmessage`).同样适用于`chrome.tabs.sendMessage` /`sendRequest`. (2认同)