使chrome扩展和chrome.runtime.onMessage没有收到消息

时间:2015-02-19 21:26:03

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

以下是我的活动页面中的代码:

chrome.runtime.onInstalled.addListener(function (){
    chrome.contextMenus.create
        ({
            "title": "Test",
            "contexts": ["all"],
            "id": "menu"
        });
    chrome.contextMenus.create
        ({
            "title": "Dummy",
            "contexts": ["all"],
            "id": "dummy",
            "parentId": "menu"
        });
});

chrome.contextMenus.onClicked.addListener(onClickHandler);

function onClickHandler (info, tab) {
    if(info.menuItemId == "dummy"){
        chrome.tabs.sendMessage(tab.id, {greeting: "hello"}, function(response) {
            console.log(response.farewell);
        });  
    }
}

以下是我的内容脚本中的代码,直接来自chrome消息传递文档:

chrome.runtime.onMessage.addListener(
  function(request, sender, sendResponse) {
    console.log(sender.tab ?
                "from a content script:" + sender.tab.url :
                "from the extension");
    if (request.greeting == "hello")
      sendResponse({farewell: "goodbye"});
  });

正在触发事件页面中的onClickHandler,但似乎sendMessage方法无效。 onMessage侦听器未接收任何信息,因此它不会将任何内容记录到控制台,甚至不会发送响应。这会导致原始的sendMessage回调抛出异常,因为甚至没有定义response.farewell。有谁知道为什么代码似乎不起作用。

错误:

Error in event handler for (unknown): TypeError: Cannot read property 'farewell' of undefined

2 个答案:

答案 0 :(得分:1)

事实证明,内容脚本或事件页面中的代码没有问题。

这个帖子:Chrome extension Content Script not loaded until page is refreshed

帮助我意识到内容脚本没有运行,因为我正在测试它的网站,并且因为它没有运行它显然无法监听任何事件。

答案 1 :(得分:1)

对于其他有问题的人,我的问题是尝试使用@media only screen and (max-device-width: 1024px) and (min-device-width: 361px) { .contact_center_image{ position: relative; margin-left: 23%; bottom: 50px; } .image_size{ width: 1000px; height: 700px; } } @media only screen and (max-device-width: 360px){ .contact_center_image{ position: relative; margin-left: 20%; bottom: 50px; } .image_size{ width: 400px; height: 300px; } } API将消息发送到内容脚本。

要向内容脚本发送消息,您必须使用chrome.runtime,例如:chrome.tabs

  

从扩展名向内容脚本发送请求看起来非常   相似,不同之处在于您需要指定将其发送到哪个标签。

     

将一条消息发送到指定选项卡中的内容脚本,   带有一个可选的回调,用于在响应返回时运行。

API文档:https://developer.chrome.com/extensions/tabs#method-sendMessage