我正在尝试制作Chrome扩展程序。我的后台脚本在ui按下按钮时触发。它应该向我的内容脚本发送一条消息,该脚本将响应发送回后台脚本。无法弄清楚这是如何工作的。点击侦听器正在触发,但消息传递不起作用。这是我到目前为止所得到的:
后台脚本:
$(document).on('click', '#getGlobalFuncsBtn', function(){
chrome.extension.sendMessage({text:"getStuff"},function(reponse){
if(reponse.type == "test"){
console.log('test received');
}
});
console.log('click listener');
});
内容脚本:
chrome.extension.onMessage.addListener(function(message,sender,sendResponse){
if(message.text == "getStuff"){
console.log('test sent');
sendResponse({type:"test"});
}
});
弹出式HTML:
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<button id="getGlobalFuncsBtn">Get Global Funcs</button>
<script src="jquery-2.0.2.min.js"></script>
<script src="background.js"></script>
</body>
</html>
的manifest.json:
{
"manifest_version": 2,
"name": "Var Viewer",
"description": "This extension allows you to view and change all user defined js global vars.",
"version": "1.1",
"permissions": [
"storage"
],
"content_scripts": [
{
"matches": ["http://*/*", "https://*/*"],
"js": ["jquery-2.0.2.min.js","content.js"]
}
],
"web_accessible_resources": [
"jquery-2.0.2.min.js"
],
"background": {
"scripts": ["background.js"],
"persistent": true
},
"browser_action": {
"default_icon": "icon.png",
"default_popup": "pop.html",
"default_title": "Var Viewer"
}
}
答案 0 :(得分:5)
1)首先,您试图在后台脚本中触发getGlobalFuncsBtn
按钮单击事件,这是没有意义的。实际上,您宣布background.js
两次:第一次在manifest
档内:
"background": {
"scripts": ["jquery-1.7.2.min.js","background.js"]
},
(表示它是后台脚本)
,第二次进入popup.html:
<script src="background.js"></script>
(表示它是一个弹出式JavaScript文件)
Background page
是您只执行某些后台操作(例如,计算)的地方。 popup.html
是你的实际弹出窗口,所以这是你应该使用jQuery按钮的地方。总的来说,你应该清除manifest.json中的background
字段(将background.js
重命名为popup.js
会更好,但这不是必需的。)
(你的后台脚本在按下按钮时触发,因为你在popup.html
内正确地声明了它。)
您可以在官方文档中了解有关background pages
的更多信息:http://developer.chrome.com/extensions/background_pages.html。
2)您的第二个问题是在扩展程序页面之间发送邮件(可能是任何扩展程序页面,在您的代码段中为background.js
)和content script
。如果要在两个常规扩展页面之间设置通信通道,则非常简单。使用chrome.runtime.sendMessage
和chrome.runtime.onMessage.addListener
。但是,如果要与content script
进行通信,则必须通过定义要向其发送消息的特定tab
来稍微复杂一些(content script
实际上是作为代码的一部分执行的您在manifest
文件中指定的标签页。您的代码应该是这样的:
(如果您重命名,则为background.js
):
popup.js
// code below is supposed to be inside your button trigger
chrome.tabs.query({active: true, currentWindow: true}, function(tabs) {
chrome.tabs.sendMessage(tabs[0].id, {text:"getStuff"}, function(response) {
if(response.type == "test"){
console.log('test received');
}
});
});
事件监听器对于Content script
或extension page
看起来相同,因此您的content script
代码应该正常工作。您只需将content.js
替换为extension
:
runtime
中的:
content.js
很好地阅读了chrome.runtime.onMessage.addListener(
function(request, sender, sendResponse) {
if (request.text == "getStuff") {
console.log('test sent');
sendResponse({type: "test"});
}
});
中传递的消息:http://developer.chrome.com/extensions/messaging.html。