【问题标题】:Making chrome extension and chrome.runtime.onMessage isn't receiving the message制作 chrome 扩展和 chrome.runtime.onMessage 没有收到消息
【发布时间】:2026-02-24 03:55:02
【问题描述】:

这是我的活动页面中的代码:

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

【问题讨论】:

  • 可能与这个重复:*.com/questions/26296181/…
  • @gui47 不是重复的,因为我已经使用 tabs.sendMessage 而不是 runtime.sendMessage,这是他们犯的错误。

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


【解决方案1】:

对于其他有问题的人,我的问题是尝试使用 chrome.runtime API 向内容脚本发送消息。

为了向内容脚本发送消息,您必须使用 chrome.tabs,如下所示:chrome.tabs.sendMessage(tabId, message, options, response)

从扩展发送请求到内容脚本看起来很 类似,只是您需要指定将其发送到哪个选项卡。

向指定选项卡中的内容脚本发送一条消息, 发送回响应时运行可选的回调。

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

【讨论】:

    【解决方案2】:

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

    本帖:Chrome extension Content Script not loaded until page is refreshed

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

    【讨论】:

    • 这也是一个很好的主题阅读:*.com/a/23895822/934239
    • 谢谢你给我链接,但我已经看到它并点赞了哈哈。
    【解决方案3】:

    我遇到了一个问题,我发送消息的工作代码停止工作。

    我意识到问题出在 tabid 上。浏览器打开了多个窗口,我缺少 activeWindow 属性来获取活动标签。

    以下代码 sn-p 对我有用。

    const fetchTabs = () => {
     return new Promise((resolve, reject) => {
      chrome.tabs.query({ active: true, currentWindow: true }, resolve);
     });
    };
    

    注意activeWindow 属性。

    【讨论】: