setTimeout запускается только один раз? - PullRequest
24 голосов
/ 23 октября 2011
function slide()
{
    if($('.current').is(':last-child')){
        $('.current').removeClass('.current');
        $('#imgholder').first().addClass('.current');
        $('#imgholder').animate({left: '3920px'});
    }
    else{
        $nxt=$(".current");
        $(".current").removeClass("current");
        $nxt.next().addClass("current");
        $('#imgholder').animate({left: '-=980'},{duration: 'slow', easing: 'easeOutBounce' });
        }
}
var loop_handle= setTimeout("slide()",'3000');

Я поместил этот код в раздел заголовка, и setTimeout запускается только один раз.

Ответы [ 8 ]

67 голосов
/ 23 октября 2011

setTimeout должен запускаться только один раз.Вы ищете setInterval.

var loop_handle = setInterval(slide, 3000);

Кроме того, второй аргумент должен быть числом, а не строкой.Когда вызов функции не требует никаких аргументов, лучше использовать ссылку на функцию, а не использовать строку.Строка будет преобразована в функцию.Эта функция будет выполняться в пределах окна.

  setInterval("slide()", 3000);
//becomes
  setInterval(Function("slide();"), 3000);
5 голосов
/ 23 октября 2011

Вы вызываете его только один раз, поэтому он будет выполняться только один раз.

Возможно, вы думаете о "setInterval ()".

Кстати, когда вы вызываете его, просто передайте имя функции, а не строку:

setInterval(slide, 3000);
4 голосов
/ 23 октября 2011

Функция setTimeout запускается только один раз!Если вы хотите запустить его больше раз, вы должны использовать setInterval:

var loop_handle= setInterval("slide()",'3000');

Также вы можете использовать setTimeout в конце функции slide(), чтобы снова установить тайм-аут:

var loop_handle;
function slide() {
    if($('.current').is(':last-child')) {
        $('.current').removeClass('.current');
        $('#imgholder').first().addClass('.current');
        $('#imgholder').animate({left: '3920px'});
    }
    else {
        $nxt=$(".current");
        $(".current").removeClass("current");
        $nxt.next().addClass("current");
        $('#imgholder').animate({left: '-=980'},{duration: 'slow', easing: 'easeOutBounce' });
    }
    loop_handle = setTimeout("slide()",'3000');
}
loop_handle = setTimeout("slide()",'3000');
4 голосов
/ 23 октября 2011

Вы ищете setInterval

См .: https://developer.mozilla.org/en/window.setInterval

2 голосов
/ 23 октября 2011

Это потому, что setTimeout() должен запускаться только один раз.Для запуска события на заданных интервалах пользователь setInterval().

2 голосов
/ 23 октября 2011

Да, setTimeout запускается только один раз. Вам нужен setInterval.

0 голосов
/ 03 февраля 2018

Эта проблема обычно возникает, когда вы использовали setTimeout в цикле рекурсии, например, в обратном вызове ajax, и когда вы хотите запустить что-то из рекурсии, вы ожидаете, что setTimeout будет работать как прошлый.не забудьте использовать setInterval в нерекурсивных функциях.

0 голосов
/ 01 июня 2017

использовать setTimeout с рекурсией (бесконечный цикл)

Если вы хотите сохранить точное расстояние между каждым вызовом функции, используйте setTimeout вместо setInterval. setInterval может в некоторый момент перекрываться, и это часто не ожидаемое поведение.

(function test(){
  setTimeout(function(){
    console.log(1);
    testt();
  }, 2000)
})()
...