2010-01-25 26 views
63

Necesito ejecutar un fragmento de código de JavaScript decir, cada 2000 milisegundos.Temporizador de bucle en JavaScript

setTimeout('moveItem()',2000) 

Lo anterior se ejecutará una función después de 2000 milisegundos, pero no lo ejecutará de nuevo.

Así que dentro de mi función moveItem que tengo:

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

esto no funciona porque quiero ejecutar el gatillo clic pieza jQuery de código de cada intervalo de 2000 milisegundos, pero en este momento se está llamando todo el hora y la secuencia de comandos debe ser interrumpida. Además de eso, creo que esto es una codificación de muy mala calidad ... ¿Cómo podrían resolver esto?

+0

cuando se debe interrumpir la secuencia de comandos? – Natrium

+1

Hola, nunca lo interrumpiré. –

Respuesta

175

Tenga en cuenta que setTimeout y setInterval son muy diferentes funciones:

  • setTimeout ejecutará el código vez, después de que el tiempo de espera.
  • setInterval ejecutará el código siempre, en intervalos del tiempo de espera proporcionado.

Ambas funciones devuelven un ID temporizador que se puede utilizar para anular el tiempo de espera. Todo lo que tiene que hacer es almacenar ese valor en una variable y usarlo como argumento para clearTimeout(tid) o clearInterval(tid) respectivamente.

Por lo tanto, dependiendo de lo que quiere hacer, usted tiene dos opciones válidas:

// 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); 
} 

o

// 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); 
} 

Ambas son formas muy comunes de la consecución de la misma.

+0

Vaya con el primero. Es mejor. Simplemente haga que la función de tiempo de espera cree una nueva llamada de tiempo de espera a sí misma. – a432511

+0

Hola, Miguel, gracias, eso resolvió el problema, y ​​fue tan simple, me siento un poco ridículo ... –

+2

Me haces entender obviamente entre 'setTimeout' y' setInterval ', Gracias @Miguel Ventura –

6
setInterval(moveItem, 2000); 

es la forma para ejecutar la función moveItem cada 2 segundos. El problema principal de su código es que llama al setInterval dentro de, en lugar de fuera de, la devolución de llamada. Si entiendo lo que estás tratando de hacer, puede utilizar esto:

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

setInterval(moveItem, 2000); 

NB: No pase cuerdas a setTimeout o setInterval - la mejor práctica es hacer pasar una función anónima o un identificador de función (como yo hizo arriba). Además, tenga cuidado de no mezclar comillas simples y dobles. Elige uno y quédate con él.

-3

Debe intentar algo como esto:

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

Esto significa que usted tiene que crear una función en la que haces las cosas que tiene que hacer, y asegúrese de que se llamará a sí mismo con el intervalo que desee. En el proceso de carga del cuerpo llamar a la función por primera vez de esta manera:

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

El código está roto. Estás pasando 'undefined' para setInterval y recursivamente llamando' update() 'para siempre sin ninguna pausa. (sugerencia: el valor de retorno de update() es lo que está pasando a setInterval aquí) – slebetman

+1

-1 usted crea un nuevo intervalo de repetición cada vez que llama a esta función ... es completamente erróneo ... y tiene el mismo problema que el OP. ayuda para ... –

2

que debe ser:

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

setInterval(f, t) las llamadas de función del argumento, f, una vez cada t milisegundos.

0

Aquí la función de bucle automático con código html. Espero que esto pueda ser útil para alguien.

<!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> 

violín: DEMO

Cuestiones relacionadas