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’”的主要内容,如果未能解决你的问题,请参考以下文章