我正在创建Chrome扩展程序,以便在用户提供的特定时间间隔后自动刷新页面。 根据当前选项卡ID,它设置间隔,当用户希望停止间隔时,他只需单击停止按钮。
我能够setInterval并将该定时器值存储在对象中,例如:
javascript
var timerid = setInterval(function(){},interval)
var timers = {
timerid : timerid,
tabid : tabid
}
关于清除间隔我只是使用选项卡ID
找到计时器值 var timerid = _.findWhere(timers,{tabid : tabid });
clearInterval(timerid)
我的 Background.js
var tabId = 0;
var activeTabs = [];
var timers = [];
//listening for new tab message and refresh action
chrome.runtime.onMessage.addListener(
function(request, sender, response){
console.log("Inside background");
console.log("Tab Id ",request.tabId)
if(request.type === 'reload' && request.tabId !== null ){
console.log("Tab Reload Event")
console.log("Refreshing tab ",request.tabId );
var first = setInterval(function(){
chrome.tabs.reload(request.tabId);
},request.interval);
timers.push({ tabid: request.tabId,timerId : first });
console.log("Timers");
console.log(timers);
console.log("Done reloading")
}
if(request.type === 'clear' && request.tabId !== null){
console.log("running intervals");
console.log(timers);
var timer = _.findWhere(timers,{ tabid: request.tabId });
console.log("Clearing the running interval of ",timer.timerId);
console.log("Tab Id ",request.tabId);
clearInterval(timer.timerId);
}
}
)
chrome.tabs.onCreated.addListener(function(tab){
activeTabs.push(tab.id);
});
但这不能清除我之前设定的间隔吗?
答案 0 :(得分:1)
每次开始间隔时,您似乎都在重新声明timers
对象。
如果您使用tabid作为属性名称,也可以避免使用findWhere
。
var timerid = setInterval(function(){},interval)
var timers[tabid] = timerid;
然后清除你可以使用:
var timerid = timers[tabid];
clearInterval(timerid);
您可能遇到的另一个问题是,如果您在标签中声明计时器,那么就不会与其他标签共享。为此,您需要查看message passing,并使用背景页面来协调事物。
答案 1 :(得分:0)
转到setTimeout方法。只需在下面做一些解决方法。
isStopped = false;
interval = //userinput;
var operation = function(){
if(isStopped == true){
return;
}
......your code....
setTimeout(operation, interval);
}
当用户想要停止时,将全局变量isStopped更改为true。 在你的代码之后进行递归调用。
让我知道它是否有效?