目录
----MyExtension
|----popup.html
|----popup.js
|----content.js
|----background.js
|----manifest.json
mainfest.json
{
"manifest_version": 2,
...........
"content_scripts": [
{
"matches": ["<all_urls>"],
"js": ["content.js"]
}
],
"browser_action": {
"default_title": "Practice",
"default_popup": "popup.html"
},
"permissions": [
"<all_urls>",
"tabs",
"storage",
"activeTab"
],
"background": {
"scripts": ["background.js"]
}
}
....
popup.html
<html>
<head>
....
<script src="popup.js"></script>
</head>
<body>
<input id="status" type="chckbox">
</body>
</html>
popup.js
$(document).ready(function(){
$on = $("#status");
//sends the settings to background to save it
$on.on("click",function(){
$obj = {"on":$on.prop("checked")}
browser.runtime.sendMessage($obj);
console.log("sending....");
})
})
我想做的就是,如果选中了popup.html中的复选框,则仅向后台脚本发送一条消息。 问题是我无法访问popup.js中的浏览器名称空间,因为它不包含内容脚本或后台脚本。而且我无法从内容脚本访问复选框,因为它未链接至popup.html(如果未链接其链接,则未定义参考错误浏览器。我尝试了无数的Google搜索,花了数小时阅读Web扩展文档仍然找不到回答如何解决该问题,不胜感激。
答案 0 :(得分:2)
我对您有个好消息-您可以在浏览器操作列表中访问浏览器名称空间,否则它们将毫无用处:)
这意味着其他东西坏了。
首先,如果您尚未执行此操作,请使用Ctrl + Shift + Alt + I打开“浏览器工具箱”,以查看您那里可能存在其他类型的错误。
然后将其包含在您的background.js中:
function handleMessage(request, sender, sendResponse) {
console.log("Message from somewhere: ", request);
}
browser.runtime.onMessage.addListener(handleMessage);
要真正阅读消息。
请参阅:
https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/browserAction
在弹出窗口中运行的JavaScript可以访问与您的后台脚本相同的所有WebExtension API,但是其全局上下文是弹出窗口,而不是浏览器中显示的当前页面。要影响网页,您需要通过消息与之交流。
编辑,无关:
$on = $("#status");
您确实意识到这样做可以引用/创建一个全局变量'$ on',对吗?你是说:
var $on = $("#status");
?