onMessage.addListener未触发

时间:2014-06-09 14:57:24

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

无论我在网上复制/粘贴什么样的例子,我都无法触发chrome.runtime.onMessage.addListener,即使我尽可能地将它们分解。现在我正在使用:

背景JS

chrome.runtime.onInstalled.addListener(function() {
    var context = "selection";
    var title = "TM";
    var id = chrome.contextMenus.create({
        "title": title,
        "contexts":[context],
        "id": "context" + context
    }); 
});

chrome.contextMenus.onClicked.addListener(onClickHandler);

function onClickHandler(info, tab) {
    chrome.windows.create(
        {url : 'URL Here'},
        function(window) {
            chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
                chrome.tabs.sendMessage(tabs[0].id, {greeting: "hello"});
            });
        }
    );
};

内容脚本

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
    console.log('onMessage fired');
});

内容脚本中的侦听器不会触发。如果我尝试从sendMessage方法读取响应,那么我得到'undefined'。除此之外,内容脚本正在加载并正常运行。我已经仔细检查了我发送到正确的标签ID,也从窗口对象中抓取它。

我需要做的就是将所选文本发送到内容脚本。我是Chrome扩展程序的新用户,所以不知道我是否遗漏了一些非常明显的内容!

1 个答案:

答案 0 :(得分:0)

我相信你在这里有一个竞争条件:chrome.windows.create回调在页面仍在加载时返回,并且还没有监听器处于活动状态。

要解决此问题,您可以反转连接的方向:从页面向背景发送消息。在后台,如果需要识别选项卡,可以将发件人的窗口ID与新创建的窗口进行比较。