clearInterval()没有停止setInterval() - Firefox扩展开发

时间:2011-06-14 14:57:21

标签: javascript checkbox firefox-addon xul setinterval

我正在修改篡改数据,这将允许我将其观察到的HTTP请求/响应发送到服务器。到目前为止,该功能已正确实施。下一步是自动执行此过程,我希望使用“复选框”类型的工具栏菜单按钮来打开和关闭此功能。

到目前为止,我在.XUL中有一些代码:

<toolbarbutton id="tamper.autosend" label="&tamper.toolbar.autosend;" type="checkbox" oncommand="oTamper.toggleTimer();"/>

这个功能在我的扩展程序的主要驱动程序中:

toggleTimer : function() {
 var checked = document.getElementById('tamper.autosend').checked;

 var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);

 consoleService.logStringMessage(checked);

 if (checked) {
        var interval = window.setInterval(function(thisObj) { thisObj.sendResults(true); }, 1000, this);
 }

 else {
        window.clearInterval(interval);
 }
}

使用consoleService我看到'checked'的值确实是正确的。我认为问题在于我如何调用clearInterval,但我不确定如何解决它。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:5)

如果尝试在开始时声明变量,则已在内部定义了区间

var interval = 0;
toggleTimer : function() {
 var checked = document.getElementById('tamper.autosend').checked;

 var consoleService = Components.classes["@mozilla.org/consoleservice;1"].getService(Components.interfaces.nsIConsoleService);

 consoleService.logStringMessage(checked);

 if (checked) {
        interval = window.setInterval(function(thisObj) { thisObj.sendResults(true); }, 1000, this);
 }

 else {
        window.clearInterval(interval);
 }
}

答案 1 :(得分:3)

你做错了,每次你想设置新的间隔时,你应该先清除它

clearInterval(intervalID);

console.log('reset timer');

intervalID = setInterval(function () {
    console.log('tick');
}, refreshInterval);

答案 2 :(得分:2)

您将interval存储在本地变量中;函数返回后,下次尝试clearInterval未定义的变量时,该值将丢失。将间隔存储在全局变量中:

 if (checked) {
        window.interval = window.setInterval(function(thisObj) { thisObj.sendResults(true); }, 1000, this);
 }

 else {
        window.clearInterval(interval);
 }

答案 3 :(得分:2)

当然,因为interval被定义为私有变量。它在toggleTimer函数中定义,并在函数结束时被销毁。

使用interval = window.setInterval()代替var interval = window.setInterval()来定义稍后可以clearInterval访问的全局变量。

以下是JavaScript变量范围的一些示例。 var用于在当前范围内定义变量。离开var总是创建或更改局部变量。

function func1() {
    i = 1; // global
}
func1();
alert(i); // 1

var j = 2;
function func2() {
    var j = 3; // private
}
func2();
alert(j); // 2

k = 4;
function func3() {
    k = 5; // global
}
func3();
alert(k); // 5

var l = 6;
function func4() {
    l = 7; // global
}
func4();
alert(l); // 7

function func5() {
    var m = 6; // private
}
func5();
alert(m); // undefined