Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > JavaScript > Bibliothèques & Frameworks > jQuery
jQuery Forum d'entraide sur le framework jQuery. Avant de poster : Tutoriels jQuery, FAQ jQuery, Tous les tutoriels JavaScript, Toutes les FAQ 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 26/07/2011, 21h46   #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 Optimisation d'un filtre sur une table

Bonjour,

j'ai une grille editable (environ 150 lignes et 30 colonnes) sur laquelle je peux effectuer des filtres à partir de champs input.

par exemple
Code :
1
2
 
<input type="text" class="inputbleu"size="3" name="statut" onkeyup=javascript:filtre(this.value,22)

et une fonction filtre jquery



Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
 
    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();}
          }
 
}//fin de filtre
mon problème est que ce fitre n'est pas très reactif notamment sur des pc pas trop puissants et c'est encore plus criant lorsque j'y ajoute des calculs de sommes sur les colonnes.

j'ai fait la même chose avec dhtmlxgrid qui reagit bcp plus rapidement mais qui par ailleurs ne satisfait pas à tous mes besoins (en version gratuite).

y a t-il moyen d'optimiser ce code pour raccourcir le délai d'execution.

merci de vos idées.
flyingfr53 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 23h15   #2
Membre Expert
 
Avatar de gwinyam
 
Homme Mathieu ROBIN
Développeur Web
Inscription : mai 2006
Messages : 1 116
Détails du profil
Informations personnelles :
Nom : Homme Mathieu ROBIN
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2006
Messages : 1 116
Points : 2 142
Points : 2 142
En utilisant le cache, tu devrais gagner un peu :

Code :
1
2
3
4
5
6
7
8
9
10
11
function filtre(valeur,colonne)
{  
        for (i=0;i<nb_lots;i++)
          {
var taLigne = $("#matable tbody>tr:eq("+i+")");
          if (!taLigne.children("td:eq("+colonne+")").text().toLowerCase().match(valeur.toLowerCase())) 
                {taLigne.hide();}
           else {taLigne.show();}
          }
 
}
A tester et à confirmer mais bon de façon générale, tant que tu parcourras tout le tableau, tu seras toujours "lent".
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne.
Le bouton ne masse pas les pieds, mais ça aide la communauté.
gwinyam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 23h19   #3
Membre Expert
 
Avatar de gwinyam
 
Homme Mathieu ROBIN
Développeur Web
Inscription : mai 2006
Messages : 1 116
Détails du profil
Informations personnelles :
Nom : Homme Mathieu ROBIN
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2006
Messages : 1 116
Points : 2 142
Points : 2 142
En fait, l'idéal serait quand même qu'au moins tes TR ait toutes un ID. Comme ça tu les chopes toutes avec le sélecteur de base :
$("#taLigneI")

Traitement extrêmement rapide et surtout beaucoup plus rapide que de faire tout un tas de recherche dans le DOM comme tu le fais là. La raison de l'efficacité du sélecteur par ID vient directement du fait que la méthode getElementByID est native à tous les navigateurs qui maintient donc un index de ces ID. Alors qu'en traversant le DOM, tu le forces à parcourir divers tableaux.

Et rien ne t'interdis de rajouter un ID à chaque ligne avec JS. Ou si tu le peux côté serveur.
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne.
Le bouton ne masse pas les pieds, mais ça aide la communauté.
gwinyam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 09h10   #4
Membre éclairé
 
Homme
F5(){F5}
Inscription : avril 2008
Messages : 256
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : F5(){F5}
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2008
Messages : 256
Points : 320
Points : 320
Bonjour,
ca implique également d'avoir un id sur la colonne.
On peut cacher les noeuds html dans un tableau js.
et opérer sur le tableau js directos :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
//id, array d'indice
function cacheNodes(tableId, columns){
 var cells=[];
 var trs = $('#'+tableId+' tbody>tr');
 trs.each(function(i){
  cells[i]={};
  var tr = $(this);
  columns.forEach(function(y,j){
   cells[i][j] = tr.find('td')[y];
  });
 });
 return cells;//chaque ligne contient les tds aux indices désirés
}
et derrière, on accede directors dans cells
Code :
1
2
3
4
5
6
7
8
9
  function filtre(valeur,colonne)
{  
        for (i=0;i<nb_lots;i++)
          {
          if(cells[i][colonne].toLowerCase().match(valeur.toLowerCase())) {
             cells[i][colonne].toggle():
          } 
 
}//fin de filtre
galerien69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 09h35   #5
Rédacteur/Modérateur
 
Avatar de SpaceFrog
 
Homme
Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Inscription : mars 2002
Messages : 30 019
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Royaume-Uni

Informations professionnelles :
Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Analyste Programmeur
Secteur : Industrie

Informations forums :
Inscription : mars 2002
Messages : 30 019
Points : 45 114
Points : 45 114
http://javascript.developpez.com/faq...er#FiltreTable
__________________
Ma page Developpez
Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
Votre post est résolu ? Alors n'oubliez pas le Tag


réalisations :www.planet-languages.com|www.saftair.com| www.ouestisol.fr | www.sebemex.fr | www.extramiante.fr | www.sistac-alizay.fr | www.acoustishop.fr | www.litt.fr | www.ouestventil.fr
SpaceFrog est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/07/2011, 20h47   #6
Membre à l'essai
 
Inscription : septembre 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 34
Points : 21
Points : 21
merci de vos reponses je vais tester.

En fait j'avais supprimé les id sur les <tr> pour optimiser l'affichage du tableau initial mais je vais essayer de les remettre, je pense qu'effectivement ça doit ameliorer.
flyingfr53 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 07h52.


 
 
 
 
Partenaires

Hébergement Web