我正在尝试将来自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秒运行一次。我无法找出我做错的事情。在此先感谢您的回复。
答案 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分钟将警报限制为最多一次,但可能会将警报延迟一次。也就是说,将
delayInMinutes
或periodInMinutes
设置为小于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
}
}