2009-01-16 8 views
6

J'utilise le plugin jquery tablesorter pour trier une table. Sur mon, les colonnes dans mon tableau montre la date au format mm/aa.Utiliser jQuery tablesorter pour trier les dates mm/aa

<tr> 
    <td class="col-name">...</td> 
    ... 
    <td rel="2000" class="col-dob">10/00</td> 
    ... 
</tr> 
<tr> 
    <td class="col-name">...</td> 
    ... 
    <td rel="1986" class="col-dob">11/86</td> 
    ... 
</tr> 

Note:

  • Chaque cellule a une classe unique
  • La date est affichée dans le format mm/aa
  • cellule avec la date reçoit l'année ainsi

Mon code jQuery est comme ci-dessous:

// add parser through the tablesorter addParser method 
$.tablesorter.addParser({ 
     // set a unique id 
     id: 'user-birthdate', 
     is: function(s) { 
       // return false so this parser is not auto detected 
       return false; 
     }, 
     format: function(s) { 
       // format your data for normalization 

       var dateSplit = s.split('/'); 

       if(2 !== dateSplit.length) 
         return 0; 

       return new Date(dateSplit[1], dateSplit[0], 1); 
     }, 
     // set type, either numeric or text 
     type: 'numeric' 
}); 

myClass.init = function() { 
     $('.module .user table').tablesorter({ 
       sortList: [[0,0]],  
      widgets: ['zebra'], 
       headers: { 
         5: { 
           sorter:'user-birthdate' 
         } 
       } 
     }); 
} 

myClass.init(); 

Mon problème est que le tableSorter interprète 00 comme année 1900 au lieu de 2000 et donc les données triées ne sont pas correctes.

Tout indice comment puis-je résoudre ce problème? J'utilise jQuery 1.2.6 et la dernière version de tablesorter.

Répondre

9

La documentation de tablesorter est souvent plutôt inutile, j'ai trouvé. Il ressemble comme il en dit beaucoup, mais il manque dans les détails.

Dans ce cas, il ne vous indique pas la signature de fonction pour un analyseur. Heureusement, vous pouvez lire the unminified code pour le trouver.

Il nous constatons que l'analyseur metadata fait ceci:

format: function(s,table,cell) { 

Cela signifie que vous pouvez ajuster votre méthode de format:

format: function(s, table, cell) { 
    // format your data for normalization 

    var dateSplit = s.split('/'); 
    var year = $(cell).attr('rel'); 

    if(2 !== dateSplit.length) 
     return 0; 

    return new Date(year, dateSplit[0], 1); 
}, 

Ou au moins similaire à celui. Je n'ai pas réellement testé cela. Mais il devrait être au moins très proche.

+0

Merci David. En attendant de tester cela lundi. Mettra à jour ici. – hitec

+0

Cette solution a résolu mon problème. Merci David. – hitec

+0

Cela a également été utile pour trier une colonne de date contenant des valeurs vides. Merci d'avoir posté cela. –

0

Je pense que vous constaterez que votre problème est le constructeur de la date et la chaîne de l'année à 2 chiffres que vous passez sans homonymie: new Date(dateSplit[1], dateSplit[0], 1);

Je ne pense pas que vous pouvez (facilement) avoir accès à Rel basé sur s dans l'analyseur. Est-ce que s contient tout le contenu de la cellule? Pouvez-vous faire quelque chose dans les données dans la cellule comme: <span style="display : none">CC</span>MM/YY, dépouiller les étiquettes, puis combiner CC avec YY dans votre analyse?

+0

Heureusement, la fonction d'analyseur passe également l'objet cellule. Vois ma réponse. :) – David