2010-07-07 7 views
6

Nous voulons savoir s'il est possible d'utiliser une fonction jQuery pour inspecter un certain nombre d'éléments et, en fonction des types qui leur sont assignés en un clic, effectuer d'autres fonctions. Fondamentalement, une fonction qui fonctionnerait pour toujours, alors que l'utilisateur n'actualise pas la page.Exécution de la fonction infinie jQuery

L'idée n'est pas de dépendre des clics d'événements pour effectuer une fonction, mais des classes affectées à un élément spécifique.

Par exemple:

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

ci-dessus est exécutée une fois, et nous avons besoin de courir tout le temps.

Répondre

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

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

Vous ne pouvez pas « laisser courir tout le temps » (comme, dans une boucle while(true)) parce que JavaScript est monothread et bloquer le fil signifie votre code autre ne fonctionnera jamais. setInterval() s'assure qu'il y a des «espaces» nécessaires pour que l'autre code s'exécute.

setInterval() renvoie un ID que vous pouvez stocker dans une variable et transmettre à clearInterval() à un certain point pour le faire s'arrêter à nouveau.


Si vous voulez vous assurer que chaque nouvelle itération de votre fonction ne démarre que après le précédent a vraiment fini, utilisez setTimeout() à la place:

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

Vous devriez probablement inclure un moyen de arrêter la répétition sans fin ici aussi, comme l'introduction d'un drapeau qui est vérifié avant l'appel setTimeout().

+0

+1 pour setTimeout() –

+0

Le délai d'expiration du site peut être de 1 ou moins – galambalazs

+0

Qu'en est-il de la consommation de bande passante? Performance sous IE? – betacar

0

Je ne sais pas exactement ce que vous essayez de faire, mais avez-vous essayé setInterval? Il continuera à fonctionner si c'est ce que vous voulez vraiment.

3

Il est possible, avec setInterval. Mon conseil serait de sélectionner l'élément en dehors de la fonction de répétition de manière à minimiser la surcharge .

Une boucle infinie se verrouiller le navigateur UI, car il est un environnement unique fileté . Définissez l'intervalle, mais laissez-vous ajouter des actions à la pile UI qui sera exécutée après une période donnée. Vous pouvez spécifier cette période dans le deuxième paramètre 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 pour avoir mentionné les avantages de la définition de la variable '$ gannt' en dehors de la fonction. – Tomalak

+0

@galambalazs: J'adore comment mon commentaire "+1" a attiré deux votes (l'un d'eux est le vôtre, je présume), mais votre réponse elle-même n'a encore que +1. ;-) Est-ce que je ne devrais pas aussi voter pour la réponse si je suis d'accord avec un commentaire "+1"? Hmmm ... :-) – Tomalak

+0

@Tomalak I mis à jour parce qu'il a un point valide (setTimeout), que j'ai pensé mais ensuite ignoré. Mais après y avoir réfléchi, je me suis rendu compte que même si je ne ferais jamais une telle chose, une longue base de code jQuery peut provoquer des blocages dans le navigateur si les fonctions se regroupent dans la pile de l'interface utilisateur. Et depuis que vous l'avez écrit, je vous ai donné +1 car il devrait être mis en évidence. :) – galambalazs

3

Vous pouvez exécuter votre chèque de quelques millisecondes, disent 50ms, en utilisant setInterval

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

Vous pourriez finir par utiliser beaucoup de puissance CPU si vos chèques sont trop fréquents ou trop compliqué.

+0

Cette solution a l'avantage de pouvoir être utilisée par le corps. –

Questions connexes