Этот метод выполняет код(или функцию), указанный в первом аргументе, асинхронно, с задержкой в delay миллисекунд.
В отличие от метода setInterval, setTimeout выполняет код только один раз.
В каком виде указывать первый параметр - в виде строки кода или функции - разницы нет.
Следующие два вызова работают одинаково:
// первый аргумент - строка
setTimeout('alert("прошла секунда")', 1000)
// первый аргумент - функция
function second_passed() {
alert("прошла секунда")
}
setTimeout(second_passed, 1000)
При указании строки кода - интерпретатор динамически создает анонимную функцию с телом из данной строки. Но более правильным считается объявление функции в явном виде, например так:
setTimeout(function() { alert('0.5 секунды') }, 500)
Вызов со строкой существует для совместимости с прежними версиями javascript.
Контекст выполнения, this
Функция выполняется в другом контексте, отличном от контекста, в котором задается setTimeout.
При этом значение this = window, поэтому о передаче правильного this надо позаботиться отдельно.
Пример: Без передачи this
object = {
func: function() { alert(this) }
}
setTimeout( object.func , 1000) // this будет равно window
Можно указать this явно, используя промежуточную функцию.
Пример: Передача this через call
object = {
func: function() { alert(this) }
}
// правильный вариант с передачей this
setTimeout( function() { object.func() } , 1000)
Как правило, this передаетcя через замыкание. Для этого используется промежуточная переменная во внешней функции, которой присваивается this:
...
var self = this // промежуточная перменная
function fun() {
alert(self)
}
setTimeout(fun, 1000)
Отмена выполнения
Вы можете отменить выполнение setTimeout при помощи clearTimeout, используя для этого идентификатор таймаута.
var timeout_id = setTimeout(...)
clearTimeout(timeout_id)
Пример: Рабочий пример
<input type="button" onclick="on()" value="Запустить таймаут"/>
<input type="button" onclick="off()" value="Остановить отсчет"/>
<script>
function go() { alert('Я сработало') }
function on() {
timeoutId = setTimeout(go, 3000)
}
function off() {
clearTimeout(timeoutId)
}
</script>
Минимальная задержка
Минимально возможная задержка в разных браузерах варьируется. В среднем на момент написания этого текста (январь 2011) она составляет 12 мс. То есть, разницы между setTimeout(.., 1) и setTimeout(.., 12), как правило, нет.
Производительность
Большое количество таймеров может привести к серьезной нагрузке на процессор.
Это в первую очередь касается приложений, в которых одновременно анимируется большое количество объектов. В этом случае, по возможности, следует использовать один таймер, который выполняет всю анимацию, а не множество независимых.
Единственное место, где нашел корректную передачу контекста в setTimeout!
Существует ли аналогичный способ передачи контекста в анонимно определенную функцию: function(){... /*this - window*/ ...}
Илья, Спасибо!!!
Евгений.
Для передачи контекста используются либо call/apply, либо промежуточная переменная в самой функции, которая заранее ставится в нужное значение.
... var self = this // промежуточная перменная function fun() { alert(self) } setTimeout(fun, 1000)За clearTimeout() отдельное спасибо!
А как передать объект?
setTimeout('myFunc(объект)',1);
???
Если что-то нужно делать до определенных пор, тогда прописываем все в одной функции и не паримся...Выполнение итераций происходит последовательно с промежутком времени 60 микросекунд. + реализована передача параметра от функции её преемнице...
function set_active(cat) { setTimeout(function(){ //Делаем что-нибудь... Изменяем какую-либо величину if(/* Если величина подходит */) setTimeout(function(){set_active(cat);},10); },60); }1. Не микро, а миллисекунд.
2. Этот код будет генерировать 25-30 таймеров в секунду не очищая их, вместо того, чтобы использовать всего-лишь 1 объект setInterval, щелкающий через необходимые вам 60 мс и выполняющий нужные проверки. Или в чем суть то была?
Весьма желательно запоминать все идентификаторы таймаутов, и после их срабатывания вызывать clearTimeout, иначе, после срабатывания большого количества таймаутов (~тысяч, в зав-ти от браузера) браузер начинает жутко тормозить - видать утекают какие-то ресурсы.
Рано или поздно может понадобиться передавать параметры в ту функцию, которая вызывается через указанный период времени. Делается это очень просто, все параметры указываются после миллисекунд и не нужно писать громоздкую функцию:
var time=1; var name="first"; function timer(t,n) { alert(n+t); time++; } setInterval(timer, 1000, time, name); //setTimeout(timer, 1000, time, name);Такой синтаксис будет работать только в Firefox
работает даже в IE7-8
правильнее будет setInterval(function(){timer(time, name)}, 1000);
Подскажите, почему не работает вот этот код:
var myPost = $('.post').hide();
for (var i = 0; i < myPost.length; i++){
j=i;
setTimeout(function(j){
myPost.eq(j).fadeIn(1000);
},1000);
};
Какой аргумент Вы ожидаете в callback-функции для setTimeout? Читайте про замыкания, функции и setTimeout.
JS видит, что установлен timeout. Через секунду он запускает функцию заданую в первом аргументе. Но он не передает в функцию никаких параметров, т.к. он даже не знает, что они там должны быть (потому что функция передается в setTimeout как простая переменная, или как ссылка на функцию, если хотите).
Почитай про замыкания. Вот приблизительное решение твоей проблемы:
var getFunctionForTimeout = function(j){
var fn = function(){
alert(j);//или myPost.eq(j).fadeIn(1000);
}
return fn;//создано замыкание. мы возвращаем функцию, которая знает правильное значение j.
}
for (var i = 0; i <= 10; i++) {setTimeout(getFunctionForTimeout(i), 1000)}
как при повторном вызове функции типа:
function Name(nummess){ setTimeout(display,200); }дождаться выполнения предыдущего вызова display?
Как вариант - использовать глобальную переменную-индикатор выполнения функции.
var displayinuse = 0; //В начале функции display function display() { if (displayinuse==1) setTimeout(display,200); displayinuse=1; //.... собственно display //при выходе из функции сбрасываем displayinuse=0; return ... }подскажите как выведенный текст после не заполненного поля убрать через заданное время
вот код
вывода ошибки не заполненного поля
// вывод заполнити поле Телефон пользователя
function testuserPhone () { var input=this; if (input.value!="") return;
var tips=document.createElement("SPAN");
tips.innerHTML="Пожалуйста заполните поле 'Телефон пользователя: '.";
var td=input.parentNode;
td.appendChild(tips);
}
function userPhone ( str ) {
// проверяет не осталось ли поле пустым
if (str == " ") {
onclick="userPhone(this.valid)"
alert ("Введите Телефон пользователя: ")
return false
}
return true
}
Подскажите как скрыть текст после указанного времени.
Чтоб он пропадал!
Поставь setTimeout(function() {document.getElementById("TextToDisappear").style("display", "none");}, 3000);
Соответственно, сам текст должен быть обрамлён в DIV с ID="TextToDisappear"
Помогите, пожалуйста, с одной проблемой.
У меня 2 функции для выпадания и убирания слоя с информацией.
При помощи document.getElementById и setTimeout плавно изменяется значение top у слоя. Всё бы хорошо, но почему-то после одного выпада окна, при попытке вызвать его еще раз - ничего не выходит. Работает только после обновления страницы
доброго времени суток! пожалуйста подскажите, почему не работает?
var Tfade=function(){} Tfade.prototype.fadeIn=function() { setTimeout(function () { this.fadeIn(); }, 100); }В приведенном коде this.fadeIn(); срабатывает как вызов функции, а не как ссылка на нее.
Пробуй this.fadeIn - без ();
Помогите пожалуйста, как сделать чтобы видео начинало проигрываться не сразу, а через 2-3 секунды? на одном сайте заметил, что видео начинает подгружаться только через несколько секунд, в коде обнаружил: setTimeout("showIt()", 2000); // 1000 = 1 sec я еще пока чайник, подскажите как применить эту фишку?
Почему не работает данный код? Выводит только первое значение i через секунду после запуска и все...
var i =0;
function f() {
i++
document.write(i + "")
}
for (d=0; d<10; d++) {
setTimeout(f, 1000)
}
Потому что "document.write" очищает и начинает запись в пустом документе. Лучше сделать так
var i = 0;
function f() {
if(i<10){
i++;
document.getElementById("text").innerHTML=i + "";
setTimeout(f, 1000)
}
}
f();
Потому что "document.write" очищает и начинает запись в пустом документе. Лучше сделать так
<div id="text"></div> <script type="text/javascript"> var i = 0; function f() { if(i<10){ i++; document.getElementById("text").innerHTML=i + ""; setTimeout(f, 1000) } } f(); </script>помогите исправить ошибку
var user = 1;
setTimeout(func1(+user+),1000)
Ну очень надо=(
var user = 1;
setTimeout("func1("+user+")",1000)
Доброго времени дня, всем!
Я только начинаю учиться языку js. Прошу помощи.
Есть Код вызова popup окна на Mootols:
window.addEvent('domready', function(){ Mediabox.open('#mb_announcement', '', '600 150'); });Подскажите, пожалуйста, как и куда вставить таймер вызова этого окна.
Чтоб оно загружалось, скажем, через минуту, после загрузки страницы.
И еще хочется только одноразового появления. Как завязать этот код с куками?
Заранее благодарен.
Всем привет!
Спасибо за хороший сайт, очень часто им пользуюсь.
Прочитал статью, но не нашел ответа на свой вопрос.
Работаю с setTimeout() и clearTimeout().
var timeOut; function invisible(item_id) { clearTimeout(timeOut); timeOut = setTimeout(function() { document.getElementByID(item_id).style.backgroundColor = '#FFFFFF'; }, 1500); }К примеру, у меня есть 2 ячейки в Таблице с Желтым фоновым цветом. При нажатии на ячейку, цвет после 1.5 секунды меняется на Белый.
Однако, если нажать на 2-ю ячейку раньше окончания Задержки, меняется цвет только последней.
clearTimeout() добавлен для сброса Задержки в случае, если в ячейку нажать повторно.
Подскажите, пожалуйста, как поступить в данном случае ?
У меня вопрос и я не знаю, что делать. Мне нужна помошь.
Где взять готовый js.
Задача такая. Нужно, что бы после того, как заходишь на сайт, гдето секунд через 10 срабатывала левая кнопка мыши автоматически. Один раз.
Заранее спасибо...
У меня вопрос и я не знаю, что делать. Мне нужна помошь.
Где взять готовый js.
Задача такая. Нужно, что бы после того, как заходишь на сайт, гдето секунд через 10 срабатывала левая кнопка мыши автоматически. Один раз.
Заранее спасибо...
Существует метод click(), который, правда, не работает в хроме.
document.getElementById("EL_ID").click(); или (если нужно кликнуть прямо по документу) - document.body.click(); / document.documentElement.click(); (в зависимости от задачи).
Рецепт готового JS:
Берем базовый массив, заворачиваем в него три не пустых объекта, кладем на правую кнопку мыши и ждем 20 минут. В этот момент обязательно произносим RTFM каждые 70 секунд.....
Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.