clearInterval() 不会停止 setInterval() - Firefox 扩展开发

Posted

技术标签:

【中文标题】clearInterval() 不会停止 setInterval() - Firefox 扩展开发【英文标题】:clearInterval() is not stopping setInterval() - Firefox Extension Development 【发布时间】:2011-06-14 14:57:21 【问题描述】:

我正在修改篡改数据,这将允许我将它观察到的 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,但我不确定如何解决它。

非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

如果尝试在开始时声明你的变量,你已经定义了区间

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);
 

【讨论】:

尽可能避免使用全局变量是件好事。将其存储在 oTamper.interval 中。【参考方案2】:

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

clearInterval(intervalID);

console.log('reset timer');

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

【讨论】:

【参考方案3】:

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

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

 else 
        window.clearInterval(interval);
 

【讨论】:

【参考方案4】:

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

使用interval = window.setInterval() 而不是var interval = window.setInterval() 来定义一个全局变量,以便稍后为clearInterval 访问。

以下是 javascript 变量范围的一些示例。 var 用于定义 current 范围内的变量。离开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

【讨论】:

以上是关于clearInterval() 不会停止 setInterval() - Firefox 扩展开发的主要内容,如果未能解决你的问题,请参考以下文章

AS2.0 setInterval 和 clearInterval的用法

javascript 用 clearinterval 停止 setinterval

clearInterval 按钮不停止 setInterval 倒计时

setInterval,为啥只有当 clearInterval 函数高于 setInterval 函数时,计时器才停止?

setInterval 在第一次调用时被跳过,并且 Clearinterval 在调用 Javascript 时没有停止

js中clearInterval无效,以及setInterval中断后重新执行