2010-07-07 20 views
6

Queremos saber si es posible tener una función usando jQuery para inspeccionar varios elementos y, dependiendo de los tipos asignados a ellos con un clic, realizar otras funciones. Básicamente, una función que se ejecutará para siempre, mientras que el usuario no actualiza la página.jQuery función infinita ejecución

La idea no es depender de los clics de eventos para realizar una función, sino de las clases asignadas a un elemento específico.

Por ejemplo:

$("td.gantt").each(function() { 
    if($(this).hasClass("oper")) { 
     //execute a serie of functions 
    } 
    if($(this).hasClass("preop")) { 
     //execute a serie of functions 
    } 
}); 

Lo anterior se ejecuta una vez, y tenemos que correr todo el tiempo.

Respuesta

17
// define a function... 
function ganttEach() { 
    $("td.gantt").each(function() { 
    // ... 
    }); 
} 

// ...repeat it once every second 
window.setInterval(ganttEach, 1000); 

No se puede "dejar que se ejecute todo el tiempo" (como, en un bucle while(true)) porque JavaScript está y el bloqueo de la rosca significa que su código otra nunca se quedará solo subproceso. setInterval() se asegura de que haya "espacios" necesarios para que se ejecute otro código.

setInterval() devuelve una ID que puede almacenar en una variable y alimentar a clearInterval() en algún momento para que vuelva a detenerse.


Si desea asegurarse de que cada nueva iteración de la función se inicia sólo después la anterior realmente ha terminado, utilice setTimeout() lugar:

// define a self-repeating function... 
function ganttEach() { 
    $("td.gantt").each(function() { 
    // ... 
    }); 
    window.setTimeout(ganttEach, 1000); // calls itself again in one second 
} 

// ...initiate self-repeating function 
ganttEach(); 

Probablemente debería incluir alguna forma de detenga la repetición interminable aquí, como introducir una bandera que esté marcada antes de la llamada setTimeout().

+0

+1 para setTimeout() –

+0

+1 sí el tiempo de espera del sitio puede evitar el sondeo – galambalazs

+0

¿Qué pasa con el consumo de ancho de banda? Rendimiento bajo IE? – betacar

0

No estoy seguro exactamente de lo que intenta hacer, pero ¿ha probado setInterval? Seguirá funcionando si eso es lo que realmente quieres.

3

Es posible, con setInterval. Mi consejo sería seleccionar el elemento fuera de la función de repetición para minimizar la sobrecarga.

Un bucle infinito sería bloquear el navegador de interfaz de usuario, ya que es un único entorno roscado. Sin embargo, le permite agregar acciones al UI stack que se ejecutará después de un período de tiempo determinado. Puede especificar este período en el segundo parámetro de setInterval.

// select the element outside 
// to minimize overhead 
$gantt = $("td.gantt"); 

// define a repeating action 
setInterval(function() { 
    $gantt.each(function() { 
     if($(this).hasClass("oper")) { 
      //execute a serie of functions 
     } 
     if($(this).hasClass("preop")) { 
      //execute a serie of functions 
     } 
    }); 
}, 100); // repeat interval: 100ms 
+2

+1 por mencionar los beneficios de definir la variable '$ gannt' fuera de la función. – Tomalak

+0

@galambalazs: Me encanta cómo mi comentario "+1" atrajo dos votos (uno de ellos es el suyo, supongo), pero su respuesta en sí misma todavía tiene +1. ;-) ¿No debería también votar la respuesta si estoy de acuerdo con un comentario de "+1"? Hmmm ... :-) – Tomalak

+0

@Tomalak Subí porque tenía un punto válido (setTimeout), lo cual pensé pero luego ignoré. Pero después de pensarlo un poco más, me di cuenta de que, incluso si nunca lo hiciera, una base de código de jQuery larga puede provocar bloqueos en el navegador si las funciones se reúnen en la pila de UI. Y desde que lo escribió, le di +1 porque debe estar resaltado. :) – galambalazs

3

Puede ejecutar su cheque cada pocos milisegundos, dicen que 50 ms, utilizando setInterval

window.setInterval (function() { 
    // do checks here 
}, 50); 

Es posible terminar con una gran cantidad de energía de la CPU si los cheques son demasiado frecuentes o demasiado complicado.

+0

Esta solución tiene la ventaja de que puede ejecutarse desde el cuerpo. –