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.

Était-ce utile?

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?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top