【问题标题】:chrome.runtime.sendMessage raises "Uncaught TypeError: Cannot call method 'sendMessage' of undefined "chrome.runtime.sendMessage 引发“未捕获的类型错误:无法调用未定义的方法‘sendMessage’”
【发布时间】: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 将我的数据从网页(通过此注入脚本)发送到事件/背景页面,然后从那里重新发送到我的内容脚本,就像文档中描述的那样。如果有更简单的方法也是安全的,为什么不呢:-)

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


【解决方案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()

【讨论】:

【解决方案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 公开给某些网站的地方。

    问题解决了。

    【讨论】:

    • 您为什么不与我们分享您的答案?不,“问题已解决”不是答案
    • 能否请您给我们答案。我也遇到了同样的问题。
    猜你喜欢
    • 2013-08-31
    • 2011-11-12
    • 2013-09-14
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多