Таймер цикла в JavaScript - PullRequest
67 голосов
/ 25 января 2010

Мне нужно выполнить фрагмент кода JavaScript, скажем, каждые 2000 миллисекунд.

setTimeout('moveItem()',2000)

Вышеуказанная функция выполнит функцию через 2000 миллисекунд, но не выполнит ее снова.

Итак, внутри моей функции moveItem у меня есть:

function moveItem() {
    jQuery(".stripTransmitter ul li a").trigger('click');
    setInterval('moverItem()',2000);
}

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

Ответы [ 6 ]

184 голосов
/ 25 января 2010

Обратите внимание, что setTimeout и setInterval очень разные функции:

  • setTimeout выполнит код один раз после истечения времени ожидания.
  • setInterval выполнит код навсегда , с интервалами в указанное время.

Обе функции возвращают идентификатор таймера , который можно использовать для отмены тайм-аута. Все, что вам нужно сделать, это сохранить это значение в переменной и использовать его в качестве аргумента для clearTimeout(tid) или clearInterval(tid) соответственно.

Итак, в зависимости от того, что вы хотите сделать, у вас есть два правильных варианта:

// set timeout
var tid = setTimeout(mycode, 2000);
function mycode() {
  // do some stuff...
  tid = setTimeout(mycode, 2000); // repeat myself
}
function abortTimer() { // to be called when you want to stop the timer
  clearTimeout(tid);
}

или

// set interval
var tid = setInterval(mycode, 2000);
function mycode() {
  // do some stuff...
  // no need to recall the function (it's an interval, it'll loop forever)
}
function abortTimer() { // to be called when you want to stop the timer
  clearInterval(tid);
}

Оба очень распространенные способы достижения того же.

6 голосов
/ 25 января 2010
setInterval(moveItem, 2000);

- это способ для выполнения функции moveItem каждые 2 секунды. Основная проблема в вашем коде заключается в том, что вы вызываете setInterval внутри, а не снаружи, обратного вызова. Если я понимаю, что вы пытаетесь сделать, вы можете использовать это:

function moveItem() {
    jQuery('.stripTransmitter ul li a').trigger('click');
}

setInterval(moveItem, 2000);

N.B.: Не передавайте строки в setTimeout или setInterval - рекомендуется передавать анонимную функцию или идентификатор функции (как я делал выше) Также будьте осторожны, чтобы не смешивать одинарные и двойные кавычки. Выберите один и придерживайтесь его.

2 голосов
/ 25 января 2010

Должно быть:

function moveItem() {
  jQuery(".stripTransmitter ul li a").trigger('click');
}
setInterval(moveItem,2000);

setInterval(f, t) вызывает функцию аргумента, f, один раз каждые t миллисекунды.

2 голосов
/ 25 января 2010

Я полагаю, вы ищете setInterval ()

0 голосов
/ 19 февраля 2013

Здесь функция автоматического цикла с HTML-кодом. Я надеюсь, что это может быть полезно для кого-то.

<!DOCTYPE html>
<html>
<head>
<style>
div {
position: relative;
background-color: #abc;
width: 40px;
height: 40px;
float: left;
margin: 5px;
}
</style>
<script src="http://code.jquery.com/jquery-latest.js"></script>
</head>
<body>
<p><button id="go">Run »</button></p>
<div class="block"></div>
<script>

function test() {
$(".block").animate({left: "+=50", opacity: 1}, 500 );
   setTimeout(mycode, 2000);
};
$( "#go" ).click(function(){
test();
});
</script>
</body>
</html>

Скрипка: DEMO

0 голосов
/ 25 января 2010

Вы должны попробовать что-то вроде этого:

 function update(){
    i++;
    document.getElementById('tekst').innerHTML = i;
    setInterval(update(),1000);
    }

Это означает, что вам нужно создать функцию, в которой вы будете выполнять то, что вам нужно, и убедиться, что она будет вызывать себя с интервалом, который вам нравится. В вашем теле onload вызовите функцию в первый раз, как это:

<body onload="update()">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...