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

Posted

技术标签:

【中文标题】chrome.runtime.sendMessage 引发“未捕获的类型错误:无法调用未定义的方法‘sendMessage’”【英文标题】:chrome.runtime.sendMessage raises "Uncaught TypeError: Cannot call method 'sendMessage' of undefined " 【发布时间】:2014-03-22 05:37:13 【问题描述】:

我正在编写一个 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";

然后将其注入网页,当它执行时,我得到:

未捕获的类型错误:无法调用未定义的方法 'sendMessage'

谁能帮我解决这个问题?

谢谢

【问题讨论】:

内容脚本与网页中的 javascript 分开执行,当您将脚本注入页面时,它无法直接与您的内容脚本对话。通常有一些变通方法,因此请发布更多关于您要完成的工作的详细信息。 是 @1337holiday ,我知道,这就是为什么我尝试使用此消息传递 API 将我的数据从网页(通过此注入脚本)发送到事件/背景页面,然后从那里重新发送到我的内容脚本,就像文档中描述的那样。如果有更简单的方法也是安全的,为什么不呢:-) 【参考方案1】:

Chrome 扩展中的 javaScript 代码可以分为以下几组:

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

Content scripts(通过清单文件或chrome.tabs.executeScript)-Partial 访问某些 chrome API 完全访问页面的 DOM。

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

在您的情况下,代码在实际页面上执行,无法调用 chrome.runtime.* API。 也许,你可以试试window.postMessage()。

【讨论】:

在这个文档developer.chrome.com/extensions/messaging#external-webpage 中,似乎可以访问chrome.runtime。但我收到错误Cannot read property 'sendMessage' of undefined。为什么?【参考方案2】:

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

不正确:

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

正确:

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

如果不是本地主机,请确保匹配包含至少2级域的掩码as described in documentation

匹配(字符串数组)- 可选

允许连接的网页的 URL 模式。这不会影响内容脚本。如果留空或未指定,则无法连接任何网页。

模式不能包含通配符域或(有效)***>域的子域; *://google.com/* 和 http://*.chromium.org/* 有效,而 、>http://*/*、*://*.com/* 甚至http://*.appspot.com/* 不是。

【讨论】:

【参考方案3】:

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

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

问题解决了。

【讨论】:

您为什么不与我们分享您的答案?不,“问题已解决”不是答案 能否请您给我们答案。我也遇到了同样的问题。

以上是关于chrome.runtime.sendMessage 引发“未捕获的类型错误:无法调用未定义的方法‘sendMessage’”的主要内容,如果未能解决你的问题,请参考以下文章