J'ai un tableau HTML très simple avec 4 colonnes :
Facility Name, Phone #, City, Specialty
Je veux que l'utilisateur puisse trier par Nom de l'établissement et Ville seulement.
Comment puis-je coder cela en utilisant jQuery ?
J'ai un tableau HTML très simple avec 4 colonnes :
Facility Name, Phone #, City, Specialty
Je veux que l'utilisateur puisse trier par Nom de l'établissement et Ville seulement.
Comment puis-je coder cela en utilisant jQuery ?
J'ai trouvé ceci, et j'ai pensé que je pourrais y mettre mon grain de sel. Cliquez sur les en-têtes des colonnes pour les trier par ordre croissant, et à nouveau pour les trier par ordre décroissant.
Effectue un tri alpha et numérique - ascendant et descendant
$('th').click(function(){ var table = $(this).parents('table').eq(0) var rows = table.find('tr:gt(0)').toArray().sort(comparer($(this).index())) this.asc = !this.asc if (!this.asc){rows = rows.reverse()} for (var i = 0; i < rows.length; i++){table.append(rows[i])} }) function comparer(index) { return function(a, b) { var valA = getCellValue(a, index), valB = getCellValue(b, index) return $.isNumeric(valA) && $.isNumeric(valB) ? valA - valB : valA.toString().localeCompare(valB) } } function getCellValue(row, index){ return $(row).children('td').eq(index).text() }
table, th, td { border: 1px solid black; } th { cursor: pointer; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <table> <tr><th>Country</th><th>Date</th><th>Size</th></tr> <tr><td>France</td><td>2001-01-01</td><td>25</td></tr> <tr><td><a href=#>spain</a></td><td>2005-05-05</td><td></td></tr> <tr><td>Lebanon</td><td>2002-02-02</td><td>-17</td></tr> <tr><td>Argentina</td><td>2005-04-04</td><td>100</td></tr> <tr><td>USA</td><td></td><td>-6</td></tr> </table>
Juste un avertissement concernant la ligne 4 : l'extension de l'élément dom est considérée comme une mauvaise pratique. perfectionkills.com/whats-wrong-with-extending-the-dom
Je pense qu'une belle mise à jour pour ce script serait la suivante : var rows = table.find('tbody tr').toArray().sort(comparer($(this).index())) Spécialement pour les tableaux qui ont plus d'une ligne à l'intérieur du tableau.
@Q_ro, cela semble être un bon ajout, malheureusement toutes les tables n'ont pas tbody (sauf erreur de ma part ? !). Mais c'est un bel exemple pour les autres !
Si vous souhaitez éviter toutes les cloches et les sifflets, je vous suggère de ce simple sortElements
plugin . Utilisation :
var table = $('table');
$('.sortable th')
.wrapInner('<span title="sort this column"/>')
.each(function(){
var th = $(this),
thIndex = th.index(),
inverse = false;
th.click(function(){
table.find('td').filter(function(){
return $(this).index() === thIndex;
}).sortElements(function(a, b){
if( $.text([a]) == $.text([b]) )
return 0;
return $.text([a]) > $.text([b]) ?
inverse ? -1 : 1
: inverse ? 1 : -1;
}, function(){
// parentNode is the element we want to move
return this.parentNode;
});
inverse = !inverse;
});
});
Et une démo. (cliquez sur les en-têtes de colonne "ville" et "établissement" pour les trier)
La démo était cassée parce que l'emplacement du plugin avait changé. J'ai créé un correction de jsfiddle pour la démonstration de sortElements ce qui, au moins, semble fonctionner pour moi :) @999 peut-être pourriez-vous mettre à jour votre réponse pour faire un lien vers la démo corrigée ?
Que faire si vous avez plusieurs tableaux sur une page ? J'ai bifurqué sur jsfiddle jsfiddle.net/CM8bT
J'obtiens cette erreur Error: illegal character
le html n'est pas exactement le même, j'ai aussi thead et tboy, pouvez-vous m'aider sur ce point s'il vous plaît ?
La plus simple que j'ai utilisée est de loin la suivante : http://datatables.net/
C'est étonnamment simple... assurez-vous simplement que si vous suivez la voie du remplacement du DOM (c'est-à-dire que vous construisez une table et laissez DataTables la reformater), assurez-vous de formater votre table avec <thead>
et <tbody>
ou ça ne marchera pas. C'est à peu près le seul problème.
Il est également possible de prendre en charge AJAX, etc. Comme pour tous les bons morceaux de code, il est également TRÈS facile de tout désactiver. Vous seriez surpris de ce que vous pouvez utiliser, cependant. J'ai commencé avec une DataTable "nue" qui ne triait qu'un seul champ, puis j'ai réalisé que certaines des fonctionnalités étaient vraiment pertinentes pour ce que je fais. Les clients adorent les nouvelles fonctionnalités.
Points bonus pour DataTables pour le support complet de ThemeRoller....
J'ai également eu de la chance avec tablesorter, mais il n'est pas aussi facile, pas aussi bien documenté, et n'a que des fonctionnalités correctes.
Nous venons de commencer à utiliser cet outil astucieux : https://plugins.jquery.com/tablesorter/
Il existe une vidéo sur son utilisation à l'adresse suivante http://www.highoncoding.com/Articles/695_Sorting_GridView_Using_JQuery_TableSorter_Plug_in.aspx
$('#tableRoster').tablesorter({
headers: {
0: { sorter: false },
4: { sorter: false }
}
});
Avec un simple tableau
<table id="tableRoster">
<thead>
<tr>
<th><input type="checkbox" class="rCheckBox" value="all" id="rAll" ></th>
<th>User</th>
<th>Verified</th>
<th>Recently Accessed</th>
<th> </th>
</tr>
</thead>
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Mon vote - TinyTable