Utilisation de jQuery tablesorter pour trier les dates mm / yy
-
19-08-2019 - |
Question
J'utilise le plugin jquery tablesorter pour trier une table. Une des colonnes de mon tableau indique la date au format 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>
Remarque:
- Chaque cellule a une classe unique
- La date est affichée au format mm / aa
- La cellule avec la date reçoit également l'année
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 tableSorter interprète 00 comme une année 1900 au lieu de 2000 et que, par conséquent, 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.
La solution
J'ai trouvé que la documentation de tablesorter est souvent plutôt inutile. Il semble que cela en dit long, mais manque de détails.
Dans ce cas, il ne vous indique pas la signature de fonction pour un analyseur. Heureusement, vous pouvez lire le code non modifié pour le trouver.
Nous constatons ici que l’analyseur metadata
effectue cette opération:
format: function(s,table,cell) {
Cela signifie que vous pouvez ajuster votre méthode de formatage à:
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 du moins semblable à cela. Je n'ai pas vraiment testé cela. Mais il devrait être au moins très proche.
Autres conseils
Je pense que vous constaterez que votre problème est lié au constructeur Date et à la chaîne d'année à deux chiffres que vous passez sans la désambiguïsation: new Date(dateSplit[1], dateSplit[0], 1);
Je ne pense pas que vous puissiez (facilement) avoir accès à rel, en vous basant sur s dans l’analyseur. Est-ce que s contient tout le contenu de la cellule? Pouvez-vous créer quelque chose dans les données de la cellule, par exemple: <span style="display : none">CC</span>MM/YY
, supprimez les balises, puis combinez CC et YY dans votre analyse?