从Chrome扩展后台向弹出窗口传递变量

6

我希望做一个简单的扩展程序,可以从后台向弹出窗口传递变量。但问题是,我得到了“undefined”的响应。

清单文件:

{
  "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
}

background.js

 var myURL = 'aaa';

popup.html

<!doctype html>
<html>
  <head>
    <script src="popup.js"></script>
  </head>
  <body>
  </body>
</html>

popup.js

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

});

在 background.js 中尝试使用 window.myURL = 'aaa'; - rsanchez
3个回答

10
您发布的代码(与您在问题中发布的完全相同)是正确的,应该可以正常工作。(实际上,当我使用您提供的代码创建一个示例扩展时,它按预期工作。)您可能在复制粘贴实际代码时意外更改了某些内容,或者有其他东西搞砸了事情(您在帖子中遗漏的某些内容)。

顺便提一下,我建议您了解一下event-pages(即非持久化的背景页面),它们更加节约资源。请记住,转移到事件页面需要进行一些更改,以使代码正常工作:

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

注意:我并不是在暗示你之所以收到“undefined”是因为你使用了一个持久的背景页。你发布的代码应该可以与持久的背景页一起正常工作——只是最好尽可能使用事件页。

0

我遇到了类似的问题;我的问题是在更改清单后,我没有重新加载扩展程序。

我猜测 OP 的问题也是一样的。


-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
}

6
背景页面并不需要background权限才能运行。正如您链接的文档中明确说明的那样,background权限用于完全不同的目的:当任何已安装的托管应用程序、打包应用程序或扩展具有"background"权限时,Chrome会在用户登录计算机后立即(隐形地)运行,直到用户显式退出Chrome为止,并且即使关闭了其最后一个窗口,Chrome也将继续运行。 - gkalpak
3
顺便说一句,如果你想让程序在后台运行,你应该在问题中提到它,这样可以节省你自己(以及我们)一些时间 ;) - gkalpak
我什么也没改,只加了一个后台权限就可以了。我想要的是让它以某种方式工作 :) - Kuzgun
1
我可以向您保证,它无法正常工作的原因不是缺少“background”权限,除非您希望Chrome在用户登录计算机后立即(隐形地)运行 - 在用户启动Chrome之前。如果是这种情况,您应该在问题中提到它。如果不是,则您的代码可能存在其他问题,在添加background权限时可能会意外地被“修复”(例如某种类型的时间问题),但最好跟踪并正确解决它,因为它很可能会再次出现。 - gkalpak
我在这里分享了我所有的文件。没有其他神秘的代码,我可以向您保证 :) - Kuzgun
3
正如我在回答中提到的,我将发布的代码复制并粘贴到我的扩展程序中,它可以正常工作。因此,问题可能出在其他地方。(但是,如果你对此感到满意并且能够正常工作,那么我也没什么意见。只是请不要误导他人,认为访问后台页中的变量需要 background 权限。) - gkalpak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接