Chrome警报事件每4秒触发一次

时间:2015-10-23 09:07:07

标签: javascript jquery google-chrome-extension

我正在尝试将来自background.js的警报触发的消息传递给loader.js。这是我的代码:

的manifest.json:

{
"update_url": "https://clients2.google.com/service/update2/crx",

   "manifest_version": 2,
   "name": "DubX",
   "short_name": "DubX",
   "author": "Al3366",
   "description": "Automatically loads DubX on dubtrack.fm",
   "homepage_url": "https://dubx.net/",
   "version": "0",
   "browser_action": {
    "default_icon": "icons/48.png"
   },
   "permissions": ["background","alarms","tabs"],
   "background": {
      "scripts": ["background.js"],
      "persistent": false
    },
   "content_scripts": [{
      "matches": ["*://www.dubtrack.fm/*"],
      "js": ["jquery.js","loader.js"],
      "run_at": "document_end"
   }],

    "icons": { 
        "16": "icons/16.png",
        "19": "icons/19.png",
        "38": "icons/38.png",
        "48": "icons/48.png",
        "128": "icons/128.png" 
    }
}

background.js

chrome.alarms.create('hello',{delayInMinutes: 0.25});
chrome.alarms.onAlarm.addListener(function(alarm) {
    chrome.tabs.query({active: true, currentWindow: true}, function(tabs){
        var content = {greeting: 'foo'};
        chrome.tabs.sendMessage(tabs[0].id, content);  
    });
});

loader.js:

chrome.runtime.onMessage.addListener(
    function(request, sender, sendResponse) {
        if (request.greeting === 'foo') {
            hello();
        };
    }
);
$('body').prepend('<div class="cake" style=" z-index: 2147483647; color: white; position: fixed; bottom: 54px; left: 27px; background: #222; padding: 13px; -webkit-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.75); -moz-box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.75); box-shadow: 0px 0px 5px 0px rgba(0,0,0,0.75); border-radius: 5px;">Waiting for Dubtrack...</div>');
function hello() {
    $.getScript('https://rawgit.com/sinfulBA/DubX-Script/master/beta.js');
    $('.cake').remove();
};

继续发射hello();每4秒运行一次。我无法找出我做错的事情。在此先感谢您的回复。

3 个答案:

答案 0 :(得分:3)

您正在使用an event page(非持久性背景页面),该页面在大约5秒钟不活动后会被卸载。然后,浏览器中的某些活动会导致后台页面重新初始化并设置新警报。因此,新警报会每隔5秒触发一个处理程序,该处理程序会发送一条消息,使内容脚本调用hello()

  • 解决方案1:在调用chrome.alarms.create之前检查一些情况。

    例如,如果真正的目标是在浏览器开始使用onStartup event后发出一次警报并使用when键设置警报时间:

    chrome.runtime.onStartup.addListener(function() {
        chrome.alarms.create('hello', {when: Date.now() + 15*1000});
    });
    
  • 解决方案2(糟糕的一个):使用"persistent": true使背景页持久化。这很糟糕,因为持久的背景页面占用了内存。但是,正如Xan的回答所解释的那样,如果你真的需要每15秒钟发出一次警报,它就是一个完美的。

答案 1 :(得分:1)

请注意:使用chrome.alarms进行粒度不到一分钟的操作是不可能的。

引用the docs

  

为了减轻用户机器的负担,Chrome会每隔1分钟将警报限制为最多一次,但可能会将警报延迟一次。也就是说,将delayInMinutesperiodInMinutes设置为小于1将不会受到尊重,并会引发警告。

因此,在生产环境中,您的闹钟根本不会触发或延迟。您正在观察开发环境效果:

  

为了帮助您调试应用程序或扩展程序,当您将其解压缩后,警报的触发频率没有限制。

尽管wOxxOm认为持久性后台页面是一个“坏”解决方案,但它实际上是需要频繁重复事件的任务的最佳解决方案。每隔几分钟(或更频繁地)重新加载事件页面将会更加浪费资源 - 事件页面适用于您不会经常或经常发生的事情。

您应切换到持久性背景页面并使用旧的setInterval

啊,抱歉,我没有立即明白您有延迟而不是间隔。然后wOxxOm的答案完全适用。

答案 2 :(得分:0)

我认为您需要为onAlarm指定警报名称。

chrome.alarms.create('hello', { periodInMinutes: 2.0 });

chrome.alarms.onAlarm.addListener(function(alarm) {

    if (alarm.name == 'hello') {
        // do your thing
    }
}