开发者问题收集

chrome.runtime.sendMessage 引发“未捕获的类型错误:无法调用未定义的方法‘sendMessage’”

2014-02-20
13624

我正在编写一个 Google Chrome 扩展程序,并尝试将注入网页的一段代码中的信息发送到我的内容脚本。

根据 http://developer.chrome.com/extensions/messaging#external-webpage ,我应该使用类似以下内容:

// The ID of the extension we want to talk to.
var editorExtensionId = "abcdefghijklmnoabcdefhijklmnoabc";

// Make a simple request:
chrome.runtime.sendMessage(editorExtensionId, {openUrlInEditor: url},
  function(response) {
    if (!response.success)
      handleError(url);
  });

问题是,当我执行以下命令时:

var script_code = "var msg = {message : 'plop'};\n";
script_code += "chrome.runtime.sendMessage('" + chrome.i18n.getMessage("@@extension_id") + "', msg, function(response) {\n";
script_code += "    console.log('response received');\n";
script_code += "});\n";

然后将其注入网页,执行后得到:

Uncaught TypeError: Cannot call method 'sendMessage' of undefined

有人可以帮我解决这个问题吗?

谢谢

3个回答

Chrome 扩展程序中的 javaScript 代码可分为以下几类:

  • 扩展程序代码 - 完全访问所有允许的 chrome.* API。
    这包括所有扩展程序页面(背景页面、弹出页面、选项页面等)

  • 内容脚本 (通过清单文件或 chrome.tabs.executeScript )- 部分 访问某些 chrome API
    完全访问页面的 DOM。

  • 注入脚本(通过内容脚本中的 此方法 )- 完全访问页面中的所有属性。无法访问任何 chrome. API。 *
    在实际页面上执行,无法访问任何 chrome.* API。**。

就您而言,代码在实际页面上执行,无法调用 chrome.runtime.* API。
也许,您可以尝试 window.postMessage()

fulme
2014-02-21

请检查您的清单文件,如果您使用的是 localhost,请确保匹配正确

不正确:

"externally_connectable": {
  "matches": ["https://localhost:PORT_NUMBER/\*"]
}

正确:

"externally_connectable": {
  "matches": ["\*://localhost/\*"]
}

如果不是 localhost,请确保匹配包含至少 2 级域的掩码 如文档中所述

matches (array of string) - optional

The URL patterns for web pages that are allowed to connect. This does not affect content scripts. If left empty or unspecified, no web pages can connect.

Patterns cannot include wildcard domains nor subdomains of (effective) top level >domains; *://google.com/* and http://*.chromium.org/* are valid, while <all_urls>, >http://*/*, *://*.com/*, and even http://*.appspot.com/* are not.

Viktor Oleksyshyn
2021-12-14

事实上,我包含了错误版本的 manifest.json 文件。

我的错,这是您指定要向某些网站公开消息传递 API 的地方。

问题解决了。

Stéphane
2014-02-21