10
votes

Comment puis-je trier les colonnes ayant des éléments d'entrée?

J'ai une table comme ceci: xxx

où la colonne de mise à jour contient des cases à cocher .

L'état initial de la case à cocher est déterminé avant de raincre la table, mais une fois que les lignes sont extraites de la base de données (elle est basée sur un ensemble de conditions, sur le côté serveur).

La case à cocher peut être vérifiée par défaut, décochée par défaut ou désactivée ( désactivé = 'désactivé' comme entrée attribue). < P> J'utilise TableSorter de JQuery pour trier mes tables. Et j'aimerais pouvoir trier par la colonne contenant les cases. Comment est-il possible (je pourrais passer des attributs supplémentaires à mon d'entrée peut-être, si cela vous aiderait ...)?

Devrais-je écrire mon propre analyseur pour gérer cela?


0 commentaires

8 Réponses :


18
votes

Ajoutez une plage cachée juste avant l'entrée et y inclure un texte (qui sera utilisé pour trier la colonne). Quelque chose comme: xxx pré>

Si nécessaire, vous pouvez joindre un événement à la case à la case de sorte qu'il modifie le contenu de la frère précédente (la portée) lorsqu'il est coché / décoché: p>

$(document).ready(function() {

    $('#tableid input').click(function() {
         var order = this.checked ? '1' : '0';
         $(this).prev().html(order);
    })

})


2 commentaires

J'ai essayé cela et ça ne marche pas pour moi. D'autres colonnes trient mais la colonne Cochez la case ne fait pas. Chaque fois que la case à cocher est cochée / décochée, elle met à jour la valeur de la portée cachée 1/0. Je peux voir cela se produire en Firebug.


Ahh ... Le problème est que Tableporter met en cache les données formatées pour faire le tri rapide. Chaque fois que vous modifiez une entrée, vous devez appeler une fonction de mise à jour comme: $ (ceci) .parents ("table"). Déclencheur ("mise à jour");



1
votes

Vous pouvez ajouter un analyseur personnalisé à TableSorter, quelque chose comme ceci: xxx

puis utilisez-le dans votre table xxx


1 commentaires

Cela ne fonctionne que pour des tables dynamiques si vous modifiez l'appel de la fonction de format vers Fonction (S, tableau, noeud) et utilisez le nœud comme objet JQuery. Voir: ghidinelli.com/ 2008/03/25 / ...



12
votes

C'est la version la plus complète / correcte de la réponse de Haart. xxx


1 commentaires

Testé cela avec TableSorter 2.0.5 et Firefox 38. L'analyseur fonctionne bien, mais lorsque vous ajoutez la dernière trieuse.Bind () appelez Firefox se bloque ou donne un dépassement de pile / trop de message de récursivité. En conséquence, le tri de la table n'est valide que pour les valeurs de la case à cocher initiales.



5
votes

J'ajoute cette réponse parce que j'utilise une bibliothèque de tables JQuery pris en charge / forcée avec de nouvelles fonctionnalités. Une bibliothèque d'analyseurs optionnelle pour les champs d'entrée / sélection est incluse.

http://mottie.github.ioio / TableSorter / Docs / P>

Voici un exemple: http://mottie.github.io/tampères/docs/example-widget -Grouping.html et il est fait en incluant la bibliothèque d'entrée / Sélectionnez une bibliothèque d'analyseurs "Parser-Select-Select.js", ajoutant un objet en-têtes et déclarant les colonnes et le type d'analyse. P>

headers: {
  0: { sorter: 'checkbox' },
  3: { sorter: 'select' },
  6: { sorter: 'inputs' }
}


0 commentaires

4
votes

Vous pouvez utiliser le plug-in TableRter JQuery et ajouter un analyseur personnalisé capable de trier toutes les colonnes à cocher:

$.tablesorter.addParser({
        id: 'checkbox',
        is: function (s, table, cell) {
            return $(cell).find('input[type=checkbox]').length > 0;
        },
        format: function (s, table, cell) {
            return $(cell).find('input:checked').length > 0 ? 0 : 1;
        },
        type: "numeric"
    });


0 commentaires

0
votes

Une seule touche finale pour rendre la réponse d'Aaron complète et évitez les erreurs de débordement de la pile. Donc, en plus d'utiliser le $. Tableter.Parser () CODE> Fonctionnalité Comme décrit ci-dessus, je devais ajouter ce qui suit sur ma page pour qu'il fonctionne avec les valeurs de case à cocher mises à jour au moment de l'exécution.

    var checkboxChanged = false;

    $('input[type="checkbox"]').change(function(){
        checkboxChanged = true;
    });

    // sorterOptions is a variables that uses the parser and disables
    // sorting when needed
    $('#myTable').tablesorter(sorterOptions);
    // assign the sortStart event
    $('#myTable')..bind("sortStart",function() {
        if (checkboxChanged) {
            checkboxChanged = false;
            // force an update event for the table
            // so the sorter works with the updated check box values
            $('#myTable')..trigger('update');
        }
    });


0 commentaires

0
votes

//javascript
$(document).ready(function() {
$(".checkBoxSorting").hide();
});


0 commentaires

1
votes

J'ai essayé de multiples approches dans les autres réponses, mais j'ai fini par utiliser la réponse acceptée de Salgiza, avec le commentaire de Martin sur la mise à jour du modèle de table. Toutefois, lorsque je l'ai mis en œuvre pour la première fois, j'ai défini la ligne de mise à jour dans la case à cocher ONCHANGE déclencheur, comme le libellé suggéré. Cela a réarrangé mes lignes sur la coche de la vérification / décalage, que j'ai trouvée très déroutante. Les lignes ont juste sauté le clic. Donc, au lieu de cela, j'ai lié la fonctionnalité de mise à jour à l'en-tête de la colonne de case à cocher, de sorte que les lignes ne soient réorganisées que lorsque vous cliquez sur pour mettre à jour le tri. Cela fonctionne comme je le souhaite:

// checkbox-sorter is the assigned id of the th element of the checbox column
$("#checkbox-sorter").click(function(){ 
    $(this).parents("table").trigger("update");
});


0 commentaires