Firefox Web扩展。在内容脚本中访问弹出内容

时间:2018-09-03 12:25:41

标签: javascript firefox-webextensions

目录

----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扩展文档仍然找不到回答如何解决该问题,不胜感激。

1 个答案:

答案 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");