Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript
JavaScript Forum programmation JavaScript. Lire : Cours JavaScript, FAQ JavaScript, Toutes les FAQ JavaScript et Sources JavaScript
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/07/2011, 19h49   #1
Membre à l'essai
 
Inscription : septembre 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 34
Points : 21
Points : 21
Par défaut relancer une fonction en cours d'execution

Bonjour,

Sur un tableau j'applique un filtre. la valeur du filtre est déterminée par un champ input et se lance par onkeyup. A chaque fois que l'utilisateur rajoute une lettre dans l'input le tableau est refiltré.


Code :
1
2
3
4
5
6
7
8
9
 
     function filtre(valeur,colonne)
{  
        for (i=0;i<nb_lots;i++)
    {
    if (!$("#matable tbody>tr:eq("+i+")>td:eq("+colonne+")").text().toLowerCase().match(valeur.toLowerCase())) 
          {$("#matable tbody>tr:eq("+i+")").hide();}
     else {$("#matable tbody>tr:eq("+i+")").show();}
        }
cette fonction est activée par
Code :
1
2
 
<input type="text"class="inputbleu" size="6" name="xxx" onkeyup=javascript:filtre(this.value,22)>

mon pb est que si l'utilisateur rentre plusieurs lettres à la suite la fonction filtre est en train de tourner et comme le tableau est un peu long il faut attendre que le filtre soit terminé pour que la lettre suivante soit acceptée et que le filtre se remette en route.

je voudrais donc en cas de 2 frappes de touche rapprochées interompre ma fonction et la relancer immédiatement.

merci de vos idées.
flyingfr53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/07/2011, 20h52   #2
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 421
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 421
Points : 2 809
Points : 2 809
NON !
la fonction ne tourne pas déjà quant elle est relancée.

sur tous les systèmes graphique (et le HTML n'y déroge pas) les événements sont mis en file d'attente.

la méthode qui traite un événement doit être terminée pour que l'événement suivant dans la file soit pris en charge. et il n'y a qu'une seule est unique file pour tout le système.

Pour couper court au protestations sur le parallélisme
La méthode lancé par le gestionnaire d'événement peut lancer une exécution en // (thread par exemple)
le process ainsi lancé peut continuer indépendamment de la méthode elle-même mais l'événement suivant sera traité par le gestionnaire que lorsque elle retournera sa valeur.

dans HTML/JS pas de thread le traitement doit donc être terminé pour que l'événement suivant soit pris en charge.

dans ton cas ce ne sera même pas le keyUp suivant car avant ça le gestionnaire va traiter au moins le keyDown

il n'y a donc aucune tempo à mettre en oeuvre. la fonction doit se terminer pour que le système traite la touche suivante.

A+JYT
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/07/2011, 22h41   #3
Membre à l'essai
 
Inscription : septembre 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 34
Points : 21
Points : 21
ok merci je m'en doutais un peu.

On doit pouvoir quand même mettre une petite tempo avant le lancement de la fonction et ca devrait regler le pb.
flyingfr53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2011, 09h13   #4
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 421
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 421
Points : 2 809
Points : 2 809
réponse : non

mais tu peut t'y prendre différemment
tu fait une fonction filter
tu définit une variable indiquant si une demande de filtre est active que tu position à false ua départ

sur l'ajout d'une touche si la variable est à false tu lance un timer et pas ta variable à true sinon tu rends la main

lorsque le timer arrive à expiration tu mets la variable à false appelle ta fonction filter

ainsi tu filtreras toutes les touches entrées durant le temps du timer.
si une touche est enfoncée durant le filtre il faut attendre la fin du filtre


l’inconvénient est que si tu fais ça lorsque on appuis sur une seule touche il te faut attendre le temps du timer plus le temps du filtre.

avant d'envisager un truc pareil je révérais mas fonction filtre.
par exemple tu récupère à l'avance toutes les valeurs dans un tableau
ainsi le filtre n'a pas à refaire une requête dans le DOM à chaque appel du filtre de même tu peux à l'avance garder un référence sur chaque objet du DOM correspondant au tr que tu veux afficher ou masquer

ainsi ton filtre n'a plus qu'a vérifier la présence d'une valeur dans un tableau (ce qui beaucoup plus rapide que de parcourir le DOM)
puis à afficher ou masquer une référence sans avoir à la chercher.

JQuery et très trompeur sur sa syntaxe
Code :
$('#matable tbody>tr:eq('+i+')'
est un appel de fonction qui sera exécuté à chaque passage de la boucle et à chaque appel du filtre.

ce n'est pas un référence à un objet ou une liste d'objet
A+JYT
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h18.


 
 
 
 
Partenaires

Hébergement Web