Таймер цикла в JavaScript

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

setTimeout('moveItem()',2000)

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

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

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

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

Ответ 1

Обратите внимание, что 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 an interval, it'll loop forever)
}
function abortTimer() { // to be called when you want to stop the timer
  clearInterval(tid);
}

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

Ответ 2

setInterval(moveItem, 2000);

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

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

setInterval(moveItem, 2000);

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

Ответ 3

Я считаю, что вы ищете setInterval()

Ответ 4

Это должно быть:

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

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

Ответ 5

Здесь используется функция автоматического цикла с кодом 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>

Fiddle: DEMO

Ответ 6

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

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

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

<body onload="update()">