IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

jQuery Discussion :

filtrage de (gros) tableau sur plusieurs colonnes


Sujet :

jQuery

  1. #1
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut filtrage de (gros) tableau sur plusieurs colonnes
    Hello,

    Je suis en train de réaliser un projet qui contient notamment une page avec un tableau d'environ 200 lignes, ou plus.

    Mon soucis est de mettre en place un filtre optimisé, et sur toutes les colonnes à la fois, sur celui-ci.

    J'ai bien sur essayé uiTableFilter ; il ne filtre que sur une colonne à la fois.
    PicNet est plus adapté à mon besoin, mais il y a un bug fâcheux lorsqu'on saisit 'or' ou 'and' dans un champ de recherche...

    J'ai réalisé un petit script en jQuery qui fonctionne très bien lorsque je limite le nombre de lignes à quelques dizaines. Mais dès que je teste sur 200 ça mouline... longtemps.

    Voici la chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    var tabId = 'tableau';
    $('#'+tabId+' thead input').keyup(function(){
      $('#'+tabId+' tbody tr').show();
      $('#'+tabId+' tbody tr').each(function(){
        var numRow = $('#'+tabId+' tbody tr').parent().children().index($(this));
        $('#'+tabId+' thead input.filtre').each(function(){
          var numCol = $(this).parent().parent().children().index($(this).parent());
          var cellVal = $(this).val().toLowerCase();
          var boxVal = $('#'+tabId+' tbody tr:eq('+numRow+') td:eq('+numCol+') span').text().toLowerCase();
     
          if(cellVal!=''){
            if(boxVal.indexOf(cellVal) == -1){
              $('#'+tabId+' tbody tr:eq('+numRow+')').hide();
              return false;
            }
          }
        });
      });
    });
    Mon tableau étant sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    <table>
      <thead>
        <tr>
          <th>
            <span>col 1</span><br/>
            <input type="text" />
          </th>
          <th>
            <span>col 2</span><br/>
            <input type="text" />
          </th>
          <th>
            <span>col 3</span><br/>
            <input type="text" />
          </th>
          <th>
            <span>col 4</span><br/>
            <input type="text" />
          </th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>
            <span>texte</span>
          </td>
          <td>
            <span>texte</span>
          </td>
          <td>
            <span>texte</span>
          </td>
          <td>
            <span>texte</span>
          </td>
        </tr>
      </tbody>
    </table>
    Si quelqu'un a une idée pour optimiser mon code, et obtenir ainsi un temps d'exécution raisonnable sur 200 lignes, ou un autre script existant, je suis preneur.

    J'ai vu qu'il y avait un système de cache dans uiTableFilter, mais je n'ai pas très bien compris comment ça marchait.

    Merci.

  2. #2
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut
    Bonjour, j'ai déjà travaillé avec des milliers de données dans des tableaux javascript paginé et je n'ai pas eu de problème de performance..

    j'avais utilisé ça :
    http://www.datatables.net/

    Il en existe beaucoup d'autre.. si tu tape "datatable js" sur google.

    j'essayerais de testé ton cas ce soir.
    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  3. #3
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 656
    Points
    66 656
    Billets dans le blog
    1
    Par défaut
    TableSort ne pose pas non plus de souci
    Ma page Developpez - Mon Blog 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

    Venez sur le Chat de Développez !

  4. #4
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Golgotha Voir le message
    Bonjour, j'ai déjà travaillé avec des milliers de données dans des tableaux javascript paginé et je n'ai pas eu de problème de performance..

    j'avais utilisé ça :
    http://www.datatables.net/

    Il en existe beaucoup d'autre.. si tu tape "datatable js" sur google.

    j'essayerais de testé ton cas ce soir.
    Impressionnant la rapidité d'exécution de la démo comparé à mon script
    J'essaye de mettre ça en place.

    Merci bien.

  5. #5
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    En affichant la totalité de ma base DataTables a quand même un peu de mal avec un peu plus de 1300 lignes.

    En bloquant à 200 j'ai un temps de réponse de 2 à 3 secondes en filtrant. C'est pas mal du tout.

    Mais je ne vois pas la possibilité de mettre un filtre par colonne ?
    Ce qui me serait vraiment très très très utile.

  6. #6
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 656
    Points
    66 656
    Billets dans le blog
    1
    Par défaut
    TableSort ? tu n'en veux pas ?
    Ma page Developpez - Mon Blog 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

    Venez sur le Chat de Développez !

  7. #7
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    TableSort ? tu n'en veux pas ?
    TableSort fait bien du filtrage ?
    Car dans la description sur plugins.jquery.com ils n'en parlent pas
    tableSort is a very fast and unobtrusive table sorter

    * Striving to minimize the invasion in the original design
    * Sorts alternately ascending and descending
    * Sorts EVERY tbody, binds calling events to cells in definable row of thead
    * No markup changes, no bound events lost, only CSS classes changed
    * No support for colspan and rowspan (yet)

  8. #8
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 656
    Points
    66 656
    Billets dans le blog
    1
    Par défaut
    y'a pas grand chose à modifier pour filtrer si il ne le fait pas d'office
    Ma page Developpez - Mon Blog 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

    Venez sur le Chat de Développez !

  9. #9
    Membre expert
    Avatar de Golgotha
    Homme Profil pro
    Full-stack Web Developer
    Inscrit en
    Août 2007
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Full-stack Web Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2007
    Messages : 1 386
    Points : 3 531
    Points
    3 531
    Billets dans le blog
    1
    Par défaut
    Tu n'as pas la fibre optique commerciale SpaceFrog

    Consultant et développeur full-stack spécialiste du Web
    faq jQuery - règles du forum - faqs web

  10. #10
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 656
    Points
    66 656
    Billets dans le blog
    1
    Par défaut
    S'il te mordent ...

    Non je ne suis en effet pas commercial pour deux sous ...

    Mais je pensais a un truc plus simple pour filtrer
    il suffirait de basculer en display none les tr parents de tds avant pour contenu le filtre ( sur regexp par exemple ) au moyens des selecteur jquery ...

    je teste pour voir si je peux faire un exemple .
    Ma page Developpez - Mon Blog 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

    Venez sur le Chat de Développez !

  11. #11
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 656
    Points
    66 656
    Billets dans le blog
    1
    Par défaut
    Un petit code pas optimisé testé sur un tableau de 1000 lignes
    ça semble donner des resultats satisfaisants
    il suffit de rentrer une regex dans la zone de texte
    genre masquer toutes les lignes dont le contenu de la première cellule commence par a => ^a

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    <style type='text/css'>
    table td {border:solid 1px silver;}
    table   {      border-collapse: collapse; 
    		float:left; }
    </style>
    <script type='text/javascript' src='Scripts/jquery-1.4.2.min.js'></script>
    <script type='text/javascript'>
    function bar(){
    reg=new RegExp(document.getElementById('filtre').value)
    $("tr").each(function(){
    	this.style.display=(reg.test($(this).children('td').eq(0).text()))?'none':'';
    	})
    }
     
    </script>
    </head>
    <body >
    <table id="foo">
    <tr>
    	<td>a</td>
    	<td>kjhlkjh</td>
    </tr>	
    <tr>
    	<td>aaaa</td>
    	<td>kjhlkjh</td>
    </tr>	
    <tr>
    	<td>abe</td>
    	<td>kjhlkjh</td>
    </tr>	
    <tr>
    	<td>ddda</td>
    	<td>kjhlkjh</td>
    </tr>	
     
    ---/---
     
    <tr>
    	<td>gggga</td>
    	<td>kjhlkjh</td>
    </tr>	
    </table>
    <input type='text' id="filtre" value="" />
    <input type="button" onclick="bar()" value="test" />
    </body>
     
    </html>

    On peut bien entendu paramétrer la ou les colonnes à filtrer
    Ma page Developpez - Mon Blog 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

    Venez sur le Chat de Développez !

  12. #12
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Royaume-Uni

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

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 637
    Points : 66 656
    Points
    66 656
    Billets dans le blog
    1
    Par défaut
    de très bon résultats même
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    <style type='text/css'>
    table td {border:solid 1px silver;}
    table   {      border-collapse: collapse; 
    		float:left; }
    </style>
    <script type="text/javascript" src="JQScripts/jquery-1.4.3.min.js"></script>
    <script type='text/javascript'>
    function bar(col){
    reg=new RegExp(document.getElementById('filtre').value)
    $("tr").each(function(){
    	this.style.display=($(this).children('td').eq(col).text().match(reg))?'':'none';
    	})
    }
     
     
    /***************************
    * Speed Table By SpaceFrog *
    **************************/
     
    function BuildTable(DestObj,NrLines,NbrCells){
    var start=new Date();
    var BaliseTable=document.createElement('table');
    BaliseTable.id="foo"
    var BaliseTbody=document.createElement('tbody');
     
    for(i=0;i<NrLines;i++){
     new AddLine(BaliseTbody,NrLines,NbrCells, i)
     }
     
    BaliseTable.appendChild(BaliseTbody);
    DestObj.appendChild(BaliseTable);
    document.close();
    var End=new Date();
     
    //alert((End-start)/1000)
     
    }
     
    function AddLine(DestBody,NrLines,NbrCells, Contenu){
    var NewLine=document.createElement('tr');
    for(l=0;l<NbrCells;l++){
         new AddCells(NewLine,Contenu+'_'+l);
         }
    DestBody.appendChild(NewLine)      
     
    }
     
    function AddCells(DestLine,contenu){
    var newCell=document.createElement('td');
    newCell.style.border="solid 1px gray";
    newCell.appendChild(document.createTextNode('Cellule '+contenu));
    DestLine.appendChild(newCell);
    }
     
    </script>
    </head>
    <body onload="BuildTable(document.body,2900,3)">
    filtre:<input type='text' id="filtre" value="" /><br/>
    colonne: <input type='text' id="col" value="0" />
     
    <input type="button" onclick="bar(document.getElementById('col').value)" value="test" />
    </body>
     
    </html>
    si je tape par exemple : ^Cellule 1\d*_ dans l'input de filtre le résultat est très rapide
    moins de 2 secondes pour 5000 lignes

    A noter que j'ai inversé la logique d'affichage par rapport au script précédent, le filtre affiche les match sur la reg et en masquant le non match
    Ma page Developpez - Mon Blog 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

    Venez sur le Chat de Développez !

  13. #13
    Candidat au Club
    Inscrit en
    Février 2005
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    En effet ça a l'air sympa.

    Je passe le post en résolu, merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 04/01/2011, 15h14
  2. Réponses: 5
    Dernier message: 24/09/2009, 14h11
  3. [Tableaux] Afficher un tableau sur plusieurs colonnes
    Par sliderman dans le forum Langage
    Réponses: 5
    Dernier message: 04/01/2008, 15h46
  4. Réponses: 2
    Dernier message: 06/09/2007, 15h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo