Pregunta

Estoy usando el complemento jquery tablesorter para ordenar una tabla. Una de mis columnas en mi tabla muestra la fecha en formato 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>

Nota:

  • Cada celda tiene una clase única
  • La fecha se muestra en formato mm / aa
  • La celda con fecha también recibe el año

Mi código jQuery es el siguiente:

// 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();

Mi problema es que tableSorter interpreta 00 como año 1900 en lugar de 2000 y, por lo tanto, los datos ordenados no son correctos.

Alguna pista, ¿cómo puedo resolver esto? Estoy usando jQuery 1.2.6 y la última versión de tablesorter.

¿Fue útil?

Solución

La documentación del clasificador de tablas es a menudo bastante inútil, he encontrado. parece como dice mucho, pero le faltan detalles.

En este caso, no le indica la firma de la función para un analizador sintáctico. Afortunadamente, puede leer el código nominificado para encontrarlo.

Allí encontramos que el analizador metadata hace esto:

format: function(s,table,cell) {

Esto significa que puede ajustar su método de formato a:

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);
},

O al menos similar a eso. En realidad no he probado esto. Pero debería estar al menos muy cerca.

Otros consejos

Creo que encontrará que su problema es el constructor de fecha y la cadena de año de 2 dígitos que está pasando sin desambiguación: new Date(dateSplit[1], dateSplit[0], 1);

No creo que pueda (fácilmente) obtener acceso a rel basado en s en el analizador. ¿Contiene s todo el contenido de la celda? ¿Puede hacer algo en los datos de la celda como: <span style="display : none">CC</span>MM/YY, eliminar las etiquetas y luego combinar CC con YY en su análisis?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top