49

我在developer.chrome.com上阅读了有关背景页面和内容脚本的信息, 但我对它们感到困惑,我无法理解何时使用后台脚本以及何时使用内容脚本。例如:

manifest.json

{
    "name": "Hello World",
    "version": "2.0",
    "manifest_version": 2,
    "background": 
    {
        "scripts": ["background.js"]
    },
    "content_scripts":
    [
        {
            "matches": ["http://*/*", "https://*/*"],
            "js": ["js/myScript.js"]
        }
    ],
    "permissions": ["tabs", "http://*/*"],
    "browser_action":
    {
        "default_icon": "icon.png"
    }
}

如果background.js是:

// Called when the user clicks on the browser action.
chrome.browserAction.onClicked.addListener(function(tab) {
  alert("test");
});

它运行良好,但如果我将上面相同的代码放入 中myScript.js,它就不起作用。

所以我不知道哪个脚本应该位于,哪个脚本应该background.js位于内容脚本中。

4

2 回答 2

57

实际上,内容脚本是在网页上下文中运行的 JavaScript 文件。通过使用标准的文档对象模型 (DOM),他们可以读取浏览器访问的网页的详细信息,或对其进行更改。

扩展的一个常见需求是拥有一个长时间运行的脚本来管理某些任务或状态。救援的背景页面。背景页面是在扩展进程中运行的 HTML 页面。它在您的扩展程序的整个生命周期内都存在,并且一次只有一个实例处于活动状态。

于 2012-10-19T10:11:44.373 回答
19

我知道这个问题是很久以前的事了,但我最近进入了 Chrome 扩展开发,并且和你一样有确切的问题。因此,我希望我的回答能够阐明这种困惑。

您已指定myScript.js为您的内容脚本。将您的代码放入内容脚本时不起作用的原因是它需要侦听浏览器按钮单击事件。但是,内容脚本只能有限地访问 Chrome api,主要是chrome.runtime事件。它无法检测chrome.browserAction.onClick事件。

另一方面,后台脚本可以访问完整的 Chrome api 数组。

何时使用后台脚本而不是内容脚本取决于您的扩展目标。您想简单地更改网页的呈现方式吗?那么你只需要内容脚本,不需要后台脚本。例如,如果你想在任何网页上制作一个扩展来切换暗模式,你可以不用后台脚本。

如果您想为您的扩展程序将自动切换暗模式的站点列表保存用户偏好怎么办?然后添加一个后台脚本: - 将他们的偏好存储到 Chrome 存储中。

  • 检测用户何时登陆列表中的站点
  • 向内容脚本发送一条消息,指示它切换暗模式。

这不是最好的例子,但我的观点是,当您需要处理常用功能并保持用户体验时,需要后台脚本。

于 2020-08-13T05:12:24.097 回答