2010-01-25 4 views
63

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

setTimeout('moveItem()',2000) 

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

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

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

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

+0

когда должен сценарий быть прерван? – Natrium

+1

Привет, я никогда его не прерываю. –

ответ

175

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

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

Обе функции возвращают таймер ID, который вы можете использовать для отмены таймаута. Все, что вам нужно сделать, это сохранить это значение в переменной и использовать его в качестве аргумента для 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); 
} 

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

+0

Пойдите с первым. Лучше. Просто используйте функцию тайм-аута для создания нового тайм-аута. – a432511

+0

Эй, Мигель, спасибо, это решило проблему, и это было так просто, я чувствую себя нелепо ... –

+2

Вы заставляете меня понимать, очевидно, между 'setTimeout' и' setInterval', Thank @Miguel Ventura –

6
setInterval(moveItem, 2000); 

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

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

setInterval(moveItem, 2000); 

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

-3

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

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

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

<body onload="update()"> 
+1

Код не работает. Вы передаете 'undefined' для setInterval и рекурсивно вызываете' update() 'навсегда без паузы. (подсказка: возвращаемое значение update() - это то, что вы передаете в setInterval здесь) – slebetman

+1

-1 вы создаете новый повторяющийся интервал каждый раз, когда вы вызываете эту функцию .. его просто неправильно .. и имеет ту же проблему, о которой спрашивает OP помощь для .. –

2

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

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

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

0

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