如何清除chrome中特定选项卡上的Interval设置?

时间:2015-10-16 12:50:33

标签: javascript google-chrome-extension

我正在创建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);
});

但这不能清除我之前设定的间隔吗?

2 个答案:

答案 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。 在你的代码之后进行递归调用。

让我知道它是否有效?