【问题标题】:Chrome Extension - Execute code when Chrome StartsChrome 扩展 - Chrome 启动时执行代码
【发布时间】:2015-04-21 14:37:45
【问题描述】:

我正在开发一个 Chrome 扩展,我正在研究如何在 chrome 启动时执行代码。

我有这些文件:

script.js
index.html
manifest.json

在 script.js 中我有:

$(document).ready(function() {
    $.getJSON("https://api.twitch.tv/kraken/streams/"+"NameOfStreamer",function(c) {
        if (c.stream == null) {
            ...
        } else {
            ...
        }
    });
});

我不想在 HTML 完成渲染时执行此代码,而是在 Chrome 首先启动时执行此代码,然后每分钟重新运行一次。

这和$(document).ready()的想法相同,但在Chrome启动时执行。

【问题讨论】:

    标签: jquery google-chrome-extension getjson


    【解决方案1】:

    请先阅读Architecture Overview。这不是很长的文字,但非常重要。

    一个弹出窗口只有在打开时才存在;没有代码可以运行。

    background page 是解决方案:它是一个不可见的页面,在 Chrome 启动后立即创建,并在 Chrome 的整个生命周期内继续运行。


    实施:

    在您的清单中,声明您的后台脚本(按加载顺序):

    "background" : {
      "scripts": ["jquery.js", "background.js"]
    },
    

    代码将在 Chrome 启动后立即运行。不需要 $(document).ready 包装器:

    $.getJSON("https://api.twitch.tv/kraken/streams/"+"NameOfStreamer", function(c) {
      /* ... */
    });
    

    如果你需要重复,你可以使用chrome.alarms API或者干脆DOM intervals

    getData();
    setInterval(getData, 60000); // Once every minute
    
    function getData() {
      $.getJSON("https://api.twitch.tv/kraken/streams/"+"NameOfStreamer", function(c) {
        /* ... */
      });
    }
    

    这样就解决了获取更新数据的问题。但是后台页面是不可见的。如果要显示数据,可以使用 browserAction 弹出窗口。

    这样,您可以将扩展分为处理数据(背景)的部分和显示数据的弹出窗口。

    您必须以某种方式从后台请求数据;如何做到这一点对于这个问题来说太宽泛了,但是您可以使用Messaging API 或直接使用chrome.runtime.getBackgroundPage() 访问后台页面。您还可以将数据存储在chrome.storage 中,可从弹出窗口访问。这可能不是一个详尽的列表。

    或者,根据您的需要,您可能需要查看notifications

    【讨论】:

    • 这是一个很好的解释,非常感谢 Xan。所以如果我明白了,在我的 jquery.js 中我暂时什么都不做=)?
    • “你的”jquery.js?由于您使用的是 jQuery,因此您应该在扩展中包含它的副本。
    • 我假设script.js 包含在您的弹出窗口中。我在答案的最后部分告诉了你应该放什么。
    • 是的,我删除了我的评论,因为发现了错误 =) 但谢谢 =)
    • 但是当我启动扩展程序时,在控制台中我有这个“未捕获的 ReferenceError:$ 未定义”这一行“$.getJSON(”api.twitch.tv/kraken/streams/…"
    【解决方案2】:

    你需要使用铬的onCreated事件:

    chrome.windows.onCreated.addListener(function() {
        //do stuff
    });
    

    Docs for event onCreated

    【讨论】:

    • 是的。答案是非常无用的,因为将此代码放在现有文件中将完全没有任何作用。 OP 需要解释背景页面与弹出窗口的概念。但即便如此,Chrome 首次打开时它不会触发 - 它注册得太晚了。所以,这是一个错误的答案。
    • 嗯。好的Xan,我明白你的意思,也许你有一个教程来解释背景页面与弹出窗口的概念=)?
    • @BenoitRastier 我正在写一个答案。
    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 2015-10-09
    • 2015-10-10
    • 2020-04-22
    • 1970-01-01
    • 2014-01-17
    • 2012-05-09
    • 2021-12-12
    相关资源
    最近更新 更多