В отличие от метода setTimeout, setInterval
выполняет код много раз, через равные промежутки времени, пока не будет остановлен при помощи clearInterval.
В каком виде указывать первый параметр - разницы нет.
При указании строки кода - динамически создается функция с телом code
.
Следующие два вызова почти одинаковы:
// (1)
setInterval('alert("прошла секунда")', 1000)
// (2)
function sec() {
alert("прошла секунда")
}
setInterval(sec, 1000) // использовать функцию
Но более правильным считается объявление функции в явном виде, например так:
setInterval(function() { alert(...) }, 1000)
Вызов со строкой существует для совместимости с прежними версиями javascript.
this
Функция выполняется в другом контексте, со значением this = window
, поэтому о передаче правильного this
надо позаботиться отдельно.
object = {
func: function() { alert(this) }
}
setInterval( object.func , 1000) // this будет равно window
// правильный вариант с передачей this
setInterval( function() { object.func.call(object) } , 1000)
Отмена выполнения
Вы можете отменить выполнение setInterval
при помощи clearInterval, используя для этого идентификатор intervalID
.
var intervalID = setInterval(...)
clearInterval(intervalID)
Спасибо. Очень помогло.
Я как-то писал программу, которая отсчитывает 60 секунд в обратном порядке.
Так вот, когда значение опускается до 56, интервал отсчёта составляет уже две секунды, потом 4, потом я сам со счёта сбился... В чём проблема, нужно парсить время отсчёта, или датить?
да
Надо пользоваться циклами
Недавно встретил эту функцию. Сам, только начал изучать веб-дизайн.
Значение задержки ничуть не в милисекундах.
Счас вот гоняю цикл с НУЛЁВОЙ задержкой - а всёравно отрабатывается относительно медленно.
Немогу понять - в чём причина. Надо много быстрее чтобы работало.
Попробуй использовать setTimer(); мне помогает
Вызывайте первый раз функцию без очереди.
setInterval(foo, 1000);
foo();
function foo () {...}
Мне помогло! Большое спасибо!
Задача была подгружать периодически с небольшим интервалом HTML из файла, на сервере и актуально обновлять таким образом информацию без перезагрузки страницы.
Вот код, который у меня получился, вдруг кому пригодится.
(в скрипте использовалась библиотека скриптов Jquery)
$(document).ready(function() {
setInterval(foo, 5000);
foo();
function foo () {$('#divClass').load('yourFile.html');}
});
Вот код, который у меня получился, вдруг кому пригодится.
(в скрипте использовалась библиотека скриптов Jquery)
$(document).ready(function() {
setInterval(foo, 5000);
foo();
function foo () {$('#divClass').load('yourFile.html');}
});
Да!Конечно пригодиться !Cпасибо !
Для цикла с нулевой задержкой используйте
Потому что во избежание перегрузки в браузере минимальная задержка-4мс
P.S. Даже с for(;;)
Как-то не нравится мне выражение "Но более правильным считается..." в справочнике. Если это справочник, то достаточно привести несколько примеров, и пользователь уже сам решит, что для него правильней. А если это учебник, то нужно аргументировать - почему это более правильно, чем другое. Мне что-то никак не понятно, почему более правильно задавать тело функции (которое может быть большим) прямо в вызове setInterval. Не лучше ли задать функцию где-то в сторонке, а в вызове setInterval указать только её имя?
setInterval('alert("прошла секунда")', 1000)
Хороший прикол. У меня в лисичке 70 страничек было открыто, вырубить только по F4 удалось.
setInterval(function () {
alert("прошла секунда");
}, 1000);
А Эсли бы это было не setInterval(alert('Прошла секунда')), 1000)
А что-то типа setInterval(alert('Milisecunda')), 1), то пришлось бы переустанавливать браузер
1) поэтому не стоит использовать alert в setInterval. Если уж очень надо, лучше использовать console.log.
2) В setInterval минимальный шаг 20 миллисекунд.
В спецификации говорится, что минимальный шаг должен быть равен 4 мс
: https://html.spec.whatwg.org/multipage/webappapis.html#timers
Почему-то эта функция работает как setTimout :-(
Контекст следующий:
есть функция:
function dlt(){
document.getElementById('count').value=ti10s;
ti10s--;
и 3 кнопки:
Так вот поле count обновляется всякий раз только по нажатию кнопки start, а не через каждые полсекунды , как замышлялось.
В чем может быть причина?
Рано или поздно может понадобиться передавать параметры в ту функцию, которая вызывается через указанный период времени. Делается это очень просто, все параметры указываются после миллисекунд и не нужно писать громоздкую функцию:
EuroFlock, молодец это действительно важный момент, на многих сайтах про этот момент умалчивают. Но для передачи параметров в функцию, вызываемую через Interval – это самый правильный и простой вариант!!!
Не знаю, но лично мне кажется, что такое легче сделать так:
как быть, если мне надо запихнуть функцию с переменной? например:
function move(direction) { ... }
setInterval(move(true), 1000);
Вызов alert | confirm останавливает выполнение setInterval (поскольку модальное окно). Следующий код будет всегда ждать нажатия с клавиатуры:
У меня довольно скользкий вопрос:
делал слайдшоу
Все работает отлично только 1 минус при каждой смене фотографии идет скачет на эту фотографию при выполнении setInterval("photos()",10000);
если страничка длинная то когда прокручиваю вниз страницу при смене фотографии опять прокручивается на нее как это исправить ?
Как вариант, грузить все картинки сразу, задав всем кроме активной display:none, а при следующей итерации интервала скрывать все и показывать следующую.
Конечно, если картинок много, то это не лучший вариант...
Здравствуйте, допустим есть следующий код:
При неактивной вкладке в firefox или chrome интервал времени продолжает считаться, но анимация останавливается в фоне, после перехода на вкладку элементы начинают "перебегать" без интервала пока не сменятся столько раз, сколько бы сменились в фоновом режиме вкладки...
Как бороться с этим? Как остановить счетчик времени в setInterval() или заставить анимацию исполняться в фоновой вкладке?
Насколько мне известно, невозможно заставить браузеры воспроизводить анимацию в фоновой вкладке. Я даже удивлен, что интервал вообще работает, т.к. мои наблюдения показывали, что исполнение кода вообще приостанавливается, и не только JS, но и расширений (flash). И это логично: если пользователь не смотрит на страницу сайта - он с ней не взаимодействует, а значит нет никакого смысла запускать "свистелки" и "дуделки". А также мы имеем более правильную информацию в таких системах, как google analytics, которые сообщают сколько времени пользователь реально контактировал с сайтом.
Это, в принципе, верный подход. Но что если кому-то нужно прикрутить js-ный таймер или еще какую-то вещь, требующую более или менее точного подсчета времени от начала использования интервала?
С этой стороны хорошо, что setInterval работает и в фоне.
Вы не правы. ибо setInterval'у - обсолютно пофиг на все анализаторы гугла, как и на неверные мнения.
функция - продолжает работу, т.к. при смене фокуса/переходе на другую вкладку и т.д. - не происходит останова функции (clearInterval - не задействуется, а только он вправе остановить выполнение setInterval)!
Я делал костыль.
Перед запуском анимации ставил свой флаг состояния. А после завершения его снимал. А, в начале интервального обработчика делал проверку.
На примере вашего кода это будет выглядеть так:
Получается что, когда вкладка становится неактивной, анимация приостанавливается, и калбек аниматора в неактивной вкладке не отработает. То есть, setInterval в неактивной вкладке будет гонять пустые циклы. В момент активации вкладки анимация дойдет до конца, флаг сбросится и весь механизм заработает заново.
setInterval(function() { alert(...) }, 1000)
Анонимная функция - рекомендуемое решение ? очень сомнительный совет.
Чтобы не создавать лишнее имя и не засорять глобальное пространство имен. Анонимные функции рулят.
а можно место alert написать document.write
Можно.
А возможно ли как-нибудь в качестве задержки использовать переменную?
что-то вроде этого:
интервал создастся один раз, изменение переменной delay внутри функции никак не повлияет на интервал.
Впринципе, можно и подобие многопоточности реализовать в яваскрипте))))
тестил скорость перерисовки canvas
работает превосходно, но где то раз в 3 секунды, изображение замирает на долю секунды, как будто пара - другая запусков не срабатывает
кто нибудь наблюдал нечто подобное? и если да, то как пофиксил?
Не очень хочется заморачиваться, но иногда возникает ситуация, когда предидущий кадр еще не успел прорисоваться, а уже срабатывает таймер для прорисовки следующего, тут нужно грамотный рендер, в webgl (3d контекст конваса), кажется, есть рендер, который работает как таймер, но отслеживает подобную ситуацию. Вообще из-за вашего комментария по ключам javascript.ru canvas api гугл выдал эту страницу
Полезная статья. Спасибо, помогло с разработкой чата.
здравствуйте ребят помогите пожалуйста проблема такая хочу следить за сайтом ну к примеру возьмем "форум где надо авторизоваться при входе и тока потом будут видны комментарии" так вот как написать такой код который бы следил за этим форумом то есть при изменений сайта или форума мне выдавало звуковое оповещение или что то в этом роде и при этом когда я пуду включать слежку он сам авторизовался то есть чтоб я мог сохранить там логин и пароль один раз и кажди раз как буду включать чтоб ничего не надобыло уже... и без разницы на чем будет написан главное чтоб такое организовать тока я пока начиню в программировании и сам никак не справлюсь прощу помогите пожалуйста
самый непонятный справочник
Подскажите пожалуйста как быть с таким примером, как полностью остановить new_1 и new_2 и вставить new_3?
setInterval("skClick(6,3);", 1000)
помогите прочитать что обозначает команда skClick(6,3) и именно цифры (6,3)
Такой вопрос:
Написал скрипт, который плавно предает объекту прозрачность:
Можно ли сделать это с помощью setInterval, чтобы не городить адское количество программного кода, или есть какой - то другой способ это сделать?
Не можно, а нужно. Сейчас не скажу как это выглядит на js, но задача ставится примерно так: нужно изменить свойство prop (в вашем случае это opacity) от oldState до newState за время T (общее время анимации/действия/чего угодно) c периодом изменений P (т.е. число кадров/колебаний/чего угодно в секунду, т.е. 30 кадров в секунду, это 1/30 секунды). Т.е. prop, oldState, newState, T, P - это входные данные.
Значит время для таймера = 1/P*1000 (не забываем про милисекунды).
Перед запуском нужно запомнить время старта tStrat.
Нужна связь между временем и значениями изменяемого параметра, т.е. предположим координата Х объекта должна измениться от 100 до 200 за 10 секунд (помните школу? поезд выехал из точки А в точку Б...), значит через 5 секунд у объекта координата Х станет равна 150, т.е. (200-100)/10*5 + 100 (весь путь разделиди на время - получили скорость, скорость умножили на время - получили пройденный путь) получаем формулу:
prop = (newState - oldState)/T*(now-tStart) + oldState
Просто? Но это только начало анализа. хз зачем пишу, обычно мимо прохожу.
Ок, добавлю, чтоб было красивее. Поменяем местами некоторые значения в формуле prop = (newState - oldState)*(now-tStart)/T + oldState
Обратите внимание на (now-tStart)/T. now-tStart это время от начала анимации до текущего момента, в самом начале = 0, в конце анимации = T. отношении прошедшего времени ко времени всей анимации (now-tStart)/T будет изменяться от 0 до 1. Назовем этот параметр deltaT (deltaT = (now-tStart)/T), тогда
prop = (newState - oldState) * deltaT + oldState
Отдельно вынеся параметр deltaT можно использовать его в дополнительной функции, например изменять так: deltaT = deltaT*deltaT (deltaT в квадрате, т.е. квадратичная функция, тогда парметр будет медленне изменяться вначале, но быстрее к концу).
А чтоб заставить SetInterval при запуске обновить инфу в элементе (а далее через период).
По предыдущему посту поясню. Загружается страница и setinterval сразу обновляет такой-то элемент а не через период , а далее через период. У setinterval нет возможности срабатывания при загрузке, а не только через период?
Поломал мозг, почему не срабатывает setInterval. Может решение и лежит где-то на поверхности, но я в ступоре. Аж в голове булькает - так мозг кипит.
$(document).ready надо вызывать поcле объявление Load
Добрый день!
Как сделать так что-бы у меня обновлялось количество новых сообщений, например как в контакте.
Или например есть сайт с анекдотами, и при добавлении в определенную категорию анекдота счетчик количества анекдотов добавлял в той сумме +1
Если не ошибаюсь это задача серверного языка программирования или если вы имели ввиду в онлайн режиме, то это AJAX.
создай отдельную таблицу в базе например reset и создай идин столбец например change и при определенный дествиях делай аякс запрос например через $.post(); и измени значение в базе в столбце change на 1 и у тебя должен быть setInterval проверяющий есть ли в таблицу reset в столбце change число 1 если data = 1 т.е если есть то делай определнные действия )) если не понял могу по лучше объяснить))
Я в js не силен, если у кого есть время буду рад помощи
Пытался нагуглить, но не смог найти.
Вот за это
setInterval( function() { object.func.call(object) } , 1000)
только для того чтобы передать параметр javascript должен быть уничтожен
Чего this._timerBeep() выполняется только один раз?
Console log:
_init!
_timerBeep!
update!
draw!
Я хотел бы спросить влияет ли использования много интервалов setIntervals, на зависания компа , у меня через интервалы идут запросы к базе не всегда интервал всегда включен но запросы идет по определенным действия пользователя, или мой комп глючит или на самом деле и влияет, буду благодарен за разумный ответ
как не оборачивая в функцию писать код в setInterval("alert(1)
alert(6);
", 100)
Во первых, ты точку с запятой пропустил.
Во вторых, а чем тебя не устраивает оборачивание в функцию?
Почему-то описание неверное. Вот так же:
var intervalId = setInterval(func / code, delay[, arg1, arg2...])
Нюанс использования аргументов не описан. Следующий код под Node.js показывает суть
Вывод:
Elapsed 0 5
Elapsed 1 5
Elapsed 2 5
Elapsed 3 5
Elapsed 4 5
Elapsed 5 5
Elapsed 6 5
Elapsed 7 5
Elapsed 8 5
Elapsed 9 5
...
Добрый день.
Есть слайдер подскажите как пушить смену баннера, выводя значения атрибута, с помощью setInterval
Я совсем мало что понимаю в js... Буду признателен за помощь
var timerId = setInterval(function() {
console.log( $('.flex-active-slide a').attr('name') );
}, 1000);
Добрый день, вопрос в следующем имеется три произвольных объекта,
допустим это будут три строки заключенные в теги
, как правильно сделать поочередное изменение цвета в каждой из строк, через некий промежуток времени. С изменением цвета отдельной строки вроде получается перебирая добавленные классы:
var color = ['color1', 'color2', 'color3'];
var i = -1;
function fun(){
i=(i + 1)%color.length;
document.querySelector('p').className = color[i];
}
setInterval(fun, 5000);
Но перебирать сразу и строки и цвета для них не выходи.
Можно сделать просто перебор цветов для каждой отдельно, но не знаю правильно ли это будет..