为什么我的Google扩展程序似乎只在我观察后台脚本控制台时开始执行

时间:2014-10-21 19:09:06

标签: javascript google-chrome google-chrome-extension google-chrome-devtools

我希望我的Google扩展程序在Google Chrome窗口打开后立即开始执行。我的background.js中有以下代码:

if (window.Notification) {
    setInterval( function() { callAutomate(); }, 60000 );
}

function callAutomate() {
 // Code to automate hello-hello.com
}

清单文件如下 -

{
    "name" : "Hello.co Extension",
    "version" : "1.1",
    "description" : "Say Hello",
    "background" :
    {
        "scripts": ["background.js"],
        "persistent": false
    },
    "page_action" :
    {
        "default_icon" : "hello-19.png",
        "default_title": "Hello World",
        "default_popup": "popup.html"
    },
    "content_scripts": [
        {
        "matches": ["https://www.hellohello.com/*"],    
        "js": [
            "content.js",
            "webDB.js"
            ]
        }
    ],
    "permissions": [ 
        "tabs",
        "storage",
        "unlimitedStorage",
        "webNavigation",
        "notifications",
        "https://www.hellohello.com/"
    ],
    "options_page": "options.html",
    "icons" : {
        "48" : "hello-48.png",
        "128" : "hello-128.png"
    },
    "manifest_version": 2,
    "web_accessible_resources": [
        "hello-48.png"
    ]
}

这是我的问题callAutomate();函数似乎只在我观察background.js的控制台日志时调用。但是,扩展的预期行为是调用callAutomate();从Google Chrome窗口打开时起每隔一分钟运行一次。

任何有关解释性代码的帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:3)

正如Chrome extension documentation中所述,有两种类型的背景页面:

  • 持久性背景页面:始终"已打开"
  • 活动背景页:"打开和关闭"根据需要

您使用的是第二个,与manifest.json文件中的"persistent": false一起指定, 因此,当您正常加载页面时,后台代码将不会自行执行 我非常确定当您在后台页面上使用开发人员工具("观察控制台")时,页面将被打开"在控制台保持打开状态时不会关闭。

删除"persistent": false您的代码将被执行。

但正如文档中所建议的那样,您应该尽可能多地使用事件页面,以便查看lifetime documentation以查看与后台页面通信的不同方式,从而执行所需的代码。 / p>

答案 1 :(得分:2)

这是因为清单中的"persistent": false

这描述了一个Event page,也就是说,如果Chrome可以闲置超过几秒钟,Chrome就可以随意卸载该页面,只跟踪已注册的事件处理程序。

事件页面的注释明确提到:

  

如果您的扩展程序使用window.setTimeout()window.setInterval(),请切换为使用警报API。如果事件页面关闭,基于DOM的计时器将无法兑现

如果您打开后台页面的Dev Tools窗口,它将不会被卸载,从而导致代码正常执行。


您可以切换为使用chrome.alarms API,但在此之前,仔细阅读活动页面文档。您需要了解所有限制:例如,由于页面已卸载,因此变量中的所有本地状态都将丢失。如果您需要保持状态,则需要使用存储API。

如果您的目的过于复杂,请移除"persistent": false以恢复为正常的背景页。