如何两个不同的标签内容的脚本之间传输数据?(How to transfer data between

2019-06-26 11:29发布

在我的分机,我需要从一个选项卡的内容脚本传递一些数据到另一个选项卡的内容脚本。 如何选择使用chrome.tabs某些选项卡,如果我知道它是标签对象的名称或网址的一部分吗? 如何两个标签的剧本沟通?

更新:

显然,我没有办法在的sendMessage chrome.extension。 当我从运行脚本的内容如下:

chrome.extension.sendMessage("message");

我得到的控制台:

遗漏的类型错误:对象#有没有方法“的sendMessage”

Answer 1:

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

在内容脚本,你必须将消息传递给后台页面,因为没有方法来直接访问其他选项卡。

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

在后台页面 ,使用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);
        }
    });
});

chrome.tabs.sendMessage用于原始数据传递到不同的标签。

备注:在这个例子中,我只当查询导致了一个独特的标签传递的消息。 当唯一性是不是一个先决条件,只是通过产生的所有标签循环使用result.forEach或:

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


Answer 2:

从内容脚本,你只能用后台进程进行通信。 您可以在两个内容脚本之间在型动物标签使用backgound作为中间沟通。

另外,DOM提供了另一种方式的DOM窗口之间进行沟通,但具有相同的起源策略...

为了得到一个标签的网址,你可以在它执行内容的脚本。 内容脚本可以使用window.location.href获得url



文章来源: How to transfer data between the content scripts of two different tabs?