在Chrome扩展程序中将变量从背景传递到弹出窗口

Kuz*_*gun 5 variables google-chrome google-chrome-extension

我想做一个简单的扩展,它将一个变量从后台传递给弹出窗口.问题是,我得到了"未定义"的回应.

表现:

{
  "name": "Get var",
  "description": "get var",
  "version": "2.0",
  "permissions": [
    "activeTab"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },
  "browser_action": {
    "default_title": "Get that variable",
    "default_popup": "popup.html"
  },
  "manifest_version": 2
}
Run Code Online (Sandbox Code Playgroud)

background.js

 var myURL = 'aaa';
Run Code Online (Sandbox Code Playgroud)

popup.html

<!doctype html>
<html>
  <head>
    <script src="popup.js"></script>
  </head>
  <body>
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

popup.js

document.addEventListener('DOMContentLoaded', function () {
   var bg = chrome.extension.getBackgroundPage();
    var myURL = bg.myURL;
  alert(myURL)

});
Run Code Online (Sandbox Code Playgroud)

gka*_*pak 7

您的代码(正如您在问题中发布的那样)是正确的,应该可以正常工作.(事实上​​,当我使用您提供的代码创建示例扩展时,它确实按预期工作.)
您在复制粘贴实际代码时意外更改了某些内容,或者还有其他东西搞乱了(您从帖子中遗漏了一些内容) ).


顺便说一下,我建议查看更加资源友好的事件页面(即非持久性背景页面).请记住,移动到事件页面需要进行一些更改才能使代码正常工作:

document.addEventListener('DOMContentLoaded', function () {
    chrome.runtime.getBackgroundPage(function (bg) {
        var myUrl = bg.myUrl;
        alert(myUrl);
    });
});
Run Code Online (Sandbox Code Playgroud)

注意:我不以任何方式暗示您收到的原因undefined是您使用持久性背景页面.您发布的代码应该可以在持久的后台页面中正常工作 - 使用事件页面(只要有可能)这是更好的做法.


Kuz*_*gun -3

最后我发现了问题,我读到后台页面需要后台权限才能工作(这里是 chrome 扩展权限文档)。所以我像这样改变了清单:

{
  "name": "Get var",
  "description": "get var",
  "version": "2.0",
  "permissions": [
    "activeTab,background"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": true
  },
  "browser_action": {
    "default_title": "Get that variable",
    "default_popup": "popup.html"
  },
  "manifest_version": 2
}
Run Code Online (Sandbox Code Playgroud)

  • 后台页面当然**不需要**需要“后台”权限才能工作。“后台”权限的用途非常不同,正如您链接到的文档中明确指出的那样:_当任何安装的托管应用程序、打包应用程序或扩展程序具有“后台”权限时,Chrome 会在用户登录后立即运行(不可见)在用户启动 Chrome 之前。“后台”权限还使 Chrome 继续运行(即使在最后一个窗口关闭后),直到用户明确退出 Chrome。_ (6认同)
  • 顺便说一句,如果这是您想要的(在后台运行),您应该在问题中提到它,以节省您(和我们自己)一些时间;) (3认同)
  • 正如我的回答中提到的,我将发布的代码复制并粘贴到我的扩展中,并且工作正常。所以,这是另一回事。(但是,为了结束这个,如果你对它感到满意并且它对你有用,那对我来说没问题。只是,请不要提供虚假信息,即为了访问后台页面中的变量,你需要“背景” ` 许可。) (3认同)