Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 12.06.2011, 01:41
Новичок на форуме
Отправить личное сообщение для DrunkenStranger Посмотреть профиль Найти все сообщения от DrunkenStranger
 
Регистрация: 12.06.2011
Сообщений: 5

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

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

Технические детали
Firefox 4
Ответить с цитированием
  #2 (permalink)  
Старый 12.06.2011, 07:53
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

"Нормального" способа нет. Но можно сделать так:
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();
Ответить с цитированием
  #3 (permalink)  
Старый 12.06.2011, 13:02
Новичок на форуме
Отправить личное сообщение для DrunkenStranger Посмотреть профиль Найти все сообщения от DrunkenStranger
 
Регистрация: 12.06.2011
Сообщений: 5

Спасибо. Тоже посещала такая мысль, но не уверен насчет того что идентификаторы выдаются по порядку. Время для экспериментов
Ответить с цитированием
  #4 (permalink)  
Старый 12.06.2011, 14:13
Новичок на форуме
Отправить личное сообщение для DrunkenStranger Посмотреть профиль Найти все сообщения от DrunkenStranger
 
Регистрация: 12.06.2011
Сообщений: 5

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

Последний раз редактировалось DrunkenStranger, 12.06.2011 в 14:16.
Ответить с цитированием
  #5 (permalink)  
Старый 12.06.2011, 14:36
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от DrunkenStranger
lastID ведь все равно будет обнуляться при каждом вызове?
Нет, не будет.
Сообщение от DrunkenStranger
или это просто так?
Нет, конечно! Зачем что-то просто так делать
Ответить с цитированием
  #6 (permalink)  
Старый 12.06.2011, 16:39
Новичок на форуме
Отправить личное сообщение для DrunkenStranger Посмотреть профиль Найти все сообщения от DrunkenStranger
 
Регистрация: 12.06.2011
Сообщений: 5

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

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

про это ни слова.
Ответить с цитированием
  #7 (permalink)  
Старый 12.06.2011, 16:53
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

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

alert( examlpe );// examlpe - это ф-ция result, в scope которой есть переменная x
alert( examlpe() );
Ответить с цитированием
  #8 (permalink)  
Старый 12.06.2011, 17:54
Новичок на форуме
Отправить личное сообщение для DrunkenStranger Посмотреть профиль Найти все сообщения от DrunkenStranger
 
Регистрация: 12.06.2011
Сообщений: 5

То бишь в первом примере в переменную пишется не сама функция а функция которая находится в скопе этой функции и надо это затем чтобы в глобальном скопе не светился lastID... О мой моск...
Ответить с цитированием
  #9 (permalink)  
Старый 12.06.2011, 18:26
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Сообщение от 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;
Но лично мне в таких случаях больше через замыкание нравится.

Последний раз редактировалось Sweet, 12.06.2011 в 18:32.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сброс зума(zoom) окна вручную на значение по умолчанию Anatoly Firefox/Mozilla 14 19.01.2011 23:35
Сброс значений checkbox'ов Mars_ Общие вопросы Javascript 4 07.08.2009 10:54
Сброс параметра select petr0007 Общие вопросы Javascript 2 16.02.2009 13:23