chrome 扩展: chrome.tabs.sendmessage 正在向所有选项卡发送消息,即使指定了 tabId

P. *_*Luo 5 javascript tabs google-chrome sendmessage google-chrome-extension

我实现这个的方式有错误吗?我正在打开一个新选项卡,然后向该选项卡发送消息,但是所有其他具有侦听器的选项卡也会收到该消息。

在 background.js 中:

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

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

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

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

Moh*_*nna 5

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

我通过将所需选项卡的 URL 发送到内容脚本并确保 URL 匹配来解决这个问题。

从弹出窗口:

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

从内容脚本:

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

            }
        }); 
    }
});
Run Code Online (Sandbox Code Playgroud)

在与 Google 的开发人员联系后,我在这里打开了一个问题。