Javascript chrome扩展中的消息传递不工作
我是chrome扩展的新手,在开始使用时遇到了一些麻烦 首先,我的总体目标是能够在弹出窗口中单击一个按钮,并在DOM中进行一些更改。如果我理解正确,那么执行此操作的方法是加载内容脚本并向此内容脚本发送消息。这是我在Chrome开发者页面上看到的内容,但我在控制台日志中没有看到任何内容: manifest.jsonJavascript chrome扩展中的消息传递不工作,javascript,google-chrome,google-chrome-extension,event-listener,message-passing,Javascript,Google Chrome,Google Chrome Extension,Event Listener,Message Passing,我是chrome扩展的新手,在开始使用时遇到了一些麻烦 首先,我的总体目标是能够在弹出窗口中单击一个按钮,并在DOM中进行一些更改。如果我理解正确,那么执行此操作的方法是加载内容脚本并向此内容脚本发送消息。这是我在Chrome开发者页面上看到的内容,但我在控制台日志中没有看到任何内容: manifest.json { "manifest_version": 2, "name": "Test", "version": "1.0", "permissions":
{
"manifest_version": 2,
"name": "Test",
"version": "1.0",
"permissions": [
"tabs", "http://*/*"
],
"content_scripts": [
{
"matches": ["http://*/*"],
"js": ["content.js"]
}
],
"browser_action": {
"default_icon": "icon.png",
"default_popup": "popup.html"
}
}
popup.html
<html>
<body>
<script src="popup.js"></script>
</body>
</html>
content.js
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"});
});
很多代码直接来自文档,所以我不知道我做错了什么。加载popup.html(DOMContentLoaded)时,popup.js脚本将启动该文件。但可以肯定的是,内容将被注入脚本还没有出现在任何网页中,因为您还没有时间打开它,而且“匹配项”:[“http://*/*”]是可以的。按背景脚本更改背景内容脚本,我认为它会工作。加载popup.html(DOMContentLoaded)时,popup.js脚本将启动文件。但可以肯定的是,内容将被注入脚本还没有出现在任何网页中,因为您还没有时间打开它,而且“匹配项”:[“http://*/*”]是可以的。按背景脚本更改背景内容脚本,我认为它会工作。我刚刚将您的代码复制到我的计算机上,并按原样运行,它会按您的预期工作。不过,我想您可能会对您期望的
console.log
输出将出现在哪里感到困惑
打开任何网页并打开该网页的控制台。单击您的浏览器操作,弹出窗口显示,并确保内容脚本中的行:chrome-extension://fndmlopghajebfadeabnfnfmhalelokm/popup.html
出现
但是,您在那里看不到您的再见
行,因为这是从popup.js
注销的,而不是选项卡的内容脚本。让我们打开弹出窗口的检查器,并在那里查找再见
消息。右键单击浏览器操作图标并选择“检查弹出窗口”菜单项。您的(空)弹出窗口显示,并出现一个新的检查器窗口;选择Console选项卡,您将在那里看到再见
消息
有关其他信息,请参阅
PS.
chrome.tabs.getSelected
已弃用;相反我同意你的看法方 觉 – 您应该考虑使用编程注入来更改DOM。 < P>我只是将您的代码复制到我的机器上,按原样运行它,正如您所期望的那样工作。不过,我想您可能会对您期望的console.log
输出将出现在哪里感到困惑
打开任何网页并打开该网页的控制台。单击您的浏览器操作,弹出窗口显示,并确保内容脚本中的行:chrome-extension://fndmlopghajebfadeabnfnfmhalelokm/popup.html
出现
但是,您在那里看不到您的再见
行,因为这是从popup.js
注销的,而不是选项卡的内容脚本。让我们打开弹出窗口的检查器,并在那里查找再见
消息。右键单击浏览器操作图标并选择“检查弹出窗口”菜单项。您的(空)弹出窗口显示,并出现一个新的检查器窗口;选择Console选项卡,您将在那里看到再见
消息
有关其他信息,请参阅
PS.
chrome.tabs.getSelected
已弃用;相反我同意你的看法方 觉 – 您应该考虑使用编程注入来更改DOM。我没有发现您的代码有任何错误。你的Chrome版本是什么?根据您的总体目标,我认为您可能应该听chrome.browserAction.onClicked
(无弹出窗口),并以编程方式在事件处理程序中插入内容脚本()@方觉 我发送到内容脚本的消息取决于弹出窗口中的一些用户输入,因此我需要它。我的chrome版本是26.0.1410.63。我没有发现你的代码有任何问题。你的Chrome版本是什么?根据您的总体目标,我认为您可能应该听chrome.browserAction.onClicked
(无弹出窗口),并以编程方式在事件处理程序中插入内容脚本()@方觉 我发送到内容脚本的消息取决于弹出窗口中的一些用户输入,因此我需要它。我的chrome版本是26.0.1410.63。我认为内容脚本是在页面加载时注入的,这是在我打开popup.html之前……我认为内容脚本是在页面加载时注入的,这是在我打开popup.html之前……谢谢,这很有帮助。是否可以将数据传递给以编程方式注入的脚本?这就是我没有这样做的原因,我认为不可能向脚本传递任何数据。@gsingh2011:per,您可以创建任意字符串发送到chrome.tabs.executeScript
。或者只需在需要时插入内容脚本,而不是在每个页面上,通过chrome.tabs.executeScript(null,{file:“content_script.js”})代码>。这将允许您使用与计划中相同的体系结构,而无需向用户打开的每个页面添加不必要的脚本。谢谢,这很有帮助。是否可以将数据传递给以编程方式注入的脚本?这就是我没有这样做的原因,我认为不可能向脚本传递任何数据。@gsingh2011:per,您可以创建任意字符串发送到chrome.tabs.executeScript
。或者只需在需要时插入内容脚本,而不是在每个页面上,通过chrome.tabs.executeScript(null,{file:“content_script.js”})代码>。这将允许您使用计划中的相同体系结构,而无需向用户打开的每个页面添加不必要的脚本。
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"});
});