clearInterval() не останавливает setInterval() - Firefox Extension Development

Я работаю над модификацией данных тампера, которые позволят мне отправлять 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, я вижу, что значение «проверено» действительно правильное. Я считаю, что проблема заключается в том, как я вызываю clearInterval, но я не совсем уверен, как это исправить.

Любая помощь приветствуется!


person Kotsu    schedule 14.06.2011    source источник


Ответы (4)


Вы определили интервал внутри, если попытаетесь объявить свою переменную в начале

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);
 }
}
person Senad Meškin    schedule 14.06.2011
comment
По возможности лучше избегать глобальных переменных. Вместо этого сохраните его в oTamper.interval. - person MatrixFrog; 14.06.2011

Вы делаете это неправильно, каждый раз, когда вы хотите установить новый интервал, вы должны сначала очистить его.

clearInterval(intervalID);

console.log('reset timer');

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

Вы сохраняете interval в локальной переменной; значение будет потеряно после возврата из функции, когда в следующий раз вы попытаетесь clearInterval использовать неопределенную переменную. Вместо этого сохраните интервал, т.е. глобальную переменную:

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

 else {
        window.clearInterval(interval);
 }
person reko_t    schedule 14.06.2011

Конечно, потому что 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
person Midas    schedule 14.06.2011