Сброс таймеров
Краткая постановка задачи
Сбросить все ранее выставленные через setInterval и setTimeout таймеры. Таймеры выставляли не мы и их идентификаторы нам неизвестны. Нужно сбросить все что когда-либо было запланировано. Для чего это? Есть чужая страница и есть мой скрипт для greasemonkey. Мой скрипт должен блокировать встроенное автообновление и управлять им самостоятельно. Технические детали Firefox 4 |
"Нормального" способа нет. Но можно сделать так:
var clearAllTimers = function(){
var lastID = 0;
return function(){
var currentID = setTimeout(function(){}, 1);
for(var id = currentID; id > lastID; id--){
clearTimeout(id);
};
lastID = currentID;
};
}();
setInterval(function(){
alert("test");
}, 100);
clearAllTimers();
|
Спасибо. Тоже посещала такая мысль, но не уверен насчет того что идентификаторы выдаются по порядку. Время для экспериментов ;)
|
Не понимаю только зачем в этом примере используются две вложенные функции? Есть чего-то чего я не понимаю или это просто так? lastID ведь все равно будет обнуляться при каждом вызове?
|
Цитата:
Цитата:
|
Ммм... а можно ламерский вопрос... почему lastID не будет обнуляться? Втыкаю и не могу понять. Читаю
http://javascript.ru/tutorial/founda...last-vidimosti про это ни слова. |
Не туда втыкал: попробуй сюда:) Принцип такой:
var examlpe = function init(){
var x = "value";
return function result(){
return x;
};
}();// ф-ция init инициализируется и сразу вызывается
// переменной examlpe присвоевается результат ф-ции init, т.е. ф-ция result
alert( examlpe );// examlpe - это ф-ция result, в scope которой есть переменная x
alert( examlpe() );
|
То бишь в первом примере в переменную пишется не сама функция а функция которая находится в скопе этой функции и надо это затем чтобы в глобальном скопе не светился lastID... О мой моск...
|
Цитата:
Есть еще другой вариант:
function clearAllTimers(){
var currentID = setTimeout(function(){}, 1);
for(var id = currentID; id > clearAllTimers.lastID; id--) clearTimeout(id);
clearAllTimers.lastID = currentID;
};
clearAllTimers.lastID = 0;
Но лично мне в таких случаях больше через замыкание нравится. |
| Часовой пояс GMT +3, время: 15:51. |