Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Сброс таймеров (https://javascript.ru/forum/misc/17996-sbros-tajjmerov.html)

DrunkenStranger 12.06.2011 01:41

Сброс таймеров
 
Краткая постановка задачи
Сбросить все ранее выставленные через setInterval и setTimeout таймеры. Таймеры выставляли не мы и их идентификаторы нам неизвестны. Нужно сбросить все что когда-либо было запланировано.

Для чего это?
Есть чужая страница и есть мой скрипт для greasemonkey. Мой скрипт должен блокировать встроенное автообновление и управлять им самостоятельно.

Технические детали
Firefox 4

Sweet 12.06.2011 07:53

"Нормального" способа нет. Но можно сделать так:
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();

DrunkenStranger 12.06.2011 13:02

Спасибо. Тоже посещала такая мысль, но не уверен насчет того что идентификаторы выдаются по порядку. Время для экспериментов ;)

DrunkenStranger 12.06.2011 14:13

Не понимаю только зачем в этом примере используются две вложенные функции? Есть чего-то чего я не понимаю или это просто так? lastID ведь все равно будет обнуляться при каждом вызове?

Sweet 12.06.2011 14:36

Цитата:

Сообщение от DrunkenStranger
lastID ведь все равно будет обнуляться при каждом вызове?

Нет, не будет.
Цитата:

Сообщение от DrunkenStranger
или это просто так?

Нет, конечно! Зачем что-то просто так делать:)

DrunkenStranger 12.06.2011 16:39

Ммм... а можно ламерский вопрос... почему lastID не будет обнуляться? Втыкаю и не могу понять. Читаю

http://javascript.ru/tutorial/founda...last-vidimosti

про это ни слова.

Sweet 12.06.2011 16:53

Не туда втыкал: попробуй сюда:) Принцип такой:
var examlpe = function init(){
  var x = "value";
  
  return function result(){
    return x;
  };
}();// ф-ция init инициализируется и сразу вызывается
// переменной examlpe присвоевается результат ф-ции init, т.е. ф-ция result

alert( examlpe );// examlpe - это ф-ция result, в scope которой есть переменная x
alert( examlpe() );

DrunkenStranger 12.06.2011 17:54

То бишь в первом примере в переменную пишется не сама функция а функция которая находится в скопе этой функции и надо это затем чтобы в глобальном скопе не светился lastID... О мой моск...

Sweet 12.06.2011 18:26

Цитата:

Сообщение от DrunkenStranger
То бишь в первом примере в переменную пишется не сама функция а функция которая находится в скопе этой функции и надо это затем чтобы в глобальном скопе не светился 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, время: 20:46.