chrome扩展名:chrome.tabs.sendmessage正在将消息发送到所有标签,即使指定了tabId

时间:2015-09-10 17:16:57

标签: javascript google-chrome google-chrome-extension tabs sendmessage

我执行此操作的方式是否有错误?我打开一个新选项卡,然后向该选项卡发送一条消息,但随后所有其他具有监听器的选项卡也会收到该消息。

在background.js中:

chrome.tabs.create({url:chrome.extension.getURL("placement.html")},function(tab){
    chrome.tabs.sendMessage(tab.id, {
        "name":"name",
        "payload":payload
    });
});

在placement.js中(加载placement.html时运行):

chrome.runtime.onMessage.addListener(function(request, sender, sendResponse) {
    if (request.name == "name") {
        payload = request.payload;
    }
});

我看到无论何时创建新选项卡,都会将有效负载发送到具有此onMessage侦听器的所有选项卡。这段代码相对较旧,所以我不确定最近是否有一些改变了影响chrome.tabs.sendMessage解释方式的内容" tab.id"。任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:3)

我同意@wOxxOm,这是Chrome新版本的一个错误...似乎chrome.tabs.connect不尊重标签ID参数。

我通过将所需标签的网址发送到内容脚本并确保网址匹配来解决这个问题。

来自弹出窗口:

chrome.tabs.query({currentWindow: true,active: true}, function(tabs){ 
        port = chrome.tabs.connect(tabs[0].id,{name: "channelName"});
        port.postMessage({url:tabs[0].url});
});

来自内容脚本:

chrome.runtime.onConnect.addListener(function(port) {
        if(port.name == "channelName"){
        port.onMessage.addListener(function(response) {
            if(response.url == window.location.href){

            }
        }); 
    }
});

在与Google的开发人员联系后,我已经打开了一个问题here