Книга: JavaScript. Подробное руководство, 6-е издание

14.1. Таймеры

14.1. Таймеры

Функции setTimeout() и setlnterval() позволяют зарегистрировать функцию, которая будет вызываться один или более раз через определенные интервалы времени. Это очень важные функции для клиентского JavaScript, и поэтому они были определены как методы объекта Window, несмотря на то что являются универсальными функциями, не выполняющими никаких действий с окном.

Метод setTimeout() объекта Window планирует запуск функции через определенное число миллисекунд. Метод setTimeout() возвращает значение, которое может быть передано методу clearTimeout(), чтобы отменить запланированный ранее запуск функции.

Метод setlnterval() похож на setTimeout(), за исключением того, что он автоматически заново планирует повторное выполнение через указанное количество миллисекунд:

setInterval(updateClock, 60000); // Вызывать updateClock() через каждые 60 сек.

Подобно setTimeout(), метод setlnterval() возвращает значение, которое может быть передано методу clearlnterval(), чтобы отменить запланированный запуск функции.

В примере 14.1 определяется вспомогательная функция, которая ожидает указанный интервал времени, многократно вызывает указанную функцию и затем отменяет запланированные вызовы по истечении другого заданного интервала времени. Этот пример демонстрирует использование методов setTimeout(), setlnterval() и clearlnterval().

Пример 14.1. Вспомогательная функция для работы с таймером

/*
* Планирует вызов или вызовы функции f() в будущем.
* Ожидает перед первым вызовом start миллисекунд, затем вызывает f()
* каждые interval миллисекунд и останавливается через start+end миллисекунд.
* Если аргумент interval указан, а аргумент end нет, повторяющиеся вызовы функции f
* никогда не прекратятся. Если отсутствуют оба аргумента, interval и end,
* тогда функция f будет вызвана только один раз, через start миллисекунд.
* Если указан только аргумент f, функция будет вызвана немедленно, как если бы
* в аргументе start было передано число 0. Обратите внимание, что вызов invokeQ
* не блокируется: она сразу же возвращает управление.
*/
function invoke(f, start, interval, end) {
  if (!start) start =0; //По умолчанию через 0 мс
  if (arguments.length <= 2) // Случай однократного вызова
    setTimeout(f, start); // Вызвать 1 раз через start мс.
  else { // Случай многократного вызова
    setTimeout(repeat, start); // Начать вызовы через start мс
    function repeat() { // Планируется на вызов выше
      var h = setlntervalQ, interval); // Вызывать f через interval мс.
      // Прекратить вызовы через end мс, если значение end определено
      if (end) setTimeout(function() { clearlnterval(h); }, end);
    }
  }
}

По исторически сложившимся причинам в первом аргументе методам setTimeout() и setlnterval() допускается передавать строку. В этом случае строка будет интерпретироваться (как с применением функции eval()) через указанный интервал, времени. Спецификация HTML5 (и все броузеры, кроме IE) допускает передавать методам setTimeout() и setlnterval() дополнительные аргументы после первых двух. Все эти дополнительные аргументы будут передаваться функции, вызов которой планируется этими методами. Однако если требуется сохранить совместимость с IE, эту возможность использовать не следует.

Если методу setTimeout() указать величину интервала 0 миллисекунд, указанная функция будет вызвана не сразу, а «как только такая возможность появится, т. е. как только завершат работу все обработчики событий.

Оглавление книги


Генерация: 0.126. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз