jQuery-Tabellensortierung

175

Ich habe eine sehr einfache HTML-Tabelle mit 4 Spalten:

Facility Name, Phone #, City, Specialty

Ich möchte, dass der Benutzer nur nach Name der Einrichtung und Stadt sortieren kann .

Wie kann ich dies mit jQuery codieren?

Tony Noriega
quelle
Meine Stimme - TinyTable
redsquare

Antworten:

150

Wenn Sie alle Schnickschnack vermeiden möchten, kann ich dieses einfache sortElementsPlugin vorschlagen . Verwendung:

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;

        });

    });

Und eine Demo. (Klicken Sie zum Sortieren auf die Spaltenüberschriften "Stadt" und "Einrichtung".)

James
quelle
6
Die Demo war kaputt, weil sich der Speicherort des Plugins geändert hatte. Ich habe eine feste jsfiddle zur Demo sortElements gegabelt, die zumindest für mich zu funktionieren scheint :) @ 999 Vielleicht könnten Sie Ihre Antwort aktualisieren, um auf die feste Demo zu verlinken?
Jake Worrell
2
Was ist, wenn Sie mehrere Tabellen auf einer Seite haben? Ich gabelte die jsfiddle jsfiddle.net/CM8bT
Marc
1
Ich bekomme diesen Fehler, Error: illegal characterdas HTML ist nicht genau das gleiche, ich habe auch Thead und Tboy, können Sie mir bitte dabei helfen?
Pahnin
1
Die obige Funktion funktioniert bei Groß- und Kleinschreibung nicht. In diesem Plugin 'a'! = 'A'. Es würde funktionieren, wenn Sie den Text in Groß- oder Kleinbuchstaben konvertieren und dann überprüfen und vergleichen. ZB: Anstatt zu $.text([a]) == $.text([b])verwenden, $.text([a]).toUpperCase() == $.text([b]).toUpperCase()wird es behoben.
NBK
1
Ziemlich bald werden Sie feststellen, dass das Sortieren überhaupt kein tabellenspezifisches Problem ist. Wenn Sie dies tun, finden Sie hier mein winziges jQuery-Plug-In, mit dem Listen, Tabellen, Divs oder andere Elemente in aufsteigender oder absteigender Reihenfolge sortiert werden. Ich habe es auch verwendet, um nach verschiedenen Datentypen wie Währung oder Jahr zu sortieren - stellen Sie einfach Ihre eigene Funktion bereit, die die zu sortierenden Daten zurückgibt. (Ich mag es, diese Funktionen getrennt zu halten und ihnen aussagekräftige Namen zu geben, um meine eigene kleine Bibliothek mit "Möglichkeiten zum Sortieren von Dingen" zu erstellen, die für die von mir erstellte Lösung spezifisch sind.)
mindplay.dk
183

Ich bin darauf gestoßen und dachte, ich würde meine 2 Cent einwerfen. Klicken Sie auf die Spaltenüberschriften, um aufsteigend und erneut absteigend zu sortieren.

  • Funktioniert in Chrome, Firefox, Opera UND IE (8)
  • Verwendet nur JQuery
  • Sortiert alphanumerisch - aufsteigend und absteigend

$('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>

** Update: 2018

Nick Grealy
quelle
10
Fantastisch! Beachten Sie nur, dass, wenn Sie Links in den tds haben, z. B. <a href="#">Test</a>die Sortierung die <a.... Um nur nach Text zu sortieren, müssen Sie html()in der letzten Zeile zu ändern text().
Kai Noack
1
@wubblyjuggly - was hast du versucht? Derzeit verwendet die Tabelle die Zellendaten (z. B. HTML-Wert), um den Datentyp (dh Nummer oder Zeichenfolge) zu bestimmen. Da Datumszeichenfolgen in vielen Formaten comparer(..)vorliegen , ist es unpraktisch, einen generischen Datumsdetektor / Parser zu schreiben (Sie können ihn neu schreiben, wenn Sie genau wissen, welches Format Sie unterstützen möchten). In der Zwischenzeit , wenn Sie verwenden yyyy-MM-dd, „ string“ Sortierung werden die Daten für Sie bestellen. zB jsbin.com/pugedip/1
Nick Grealy
1
Dieses Beispiel funktionierte perfekt für mich, wo die gewählte Lösung nicht funktionierte. Die gewählte Antwort funktionierte nicht für mich; Ich bin mir nicht sicher, ob es daran liegt, dass ich einen Thead / Tbody verwende oder nicht (die jsfiddle ohne diese Tags hat funktioniert).
RalphTheWonderLlama
1
Danke @Jan, ich habe Ihren Vorschlag in die Lösung aufgenommen!
Nick Grealy
1
@NickGrealy Du hast Recht meine Vorschläge im Kommentar wo genau die abgelehnte Bearbeitung. Vergleichen Sie jsfiddle.net/gn1vtcLq/2 (meine Version) mit jsfiddle.net/0a15ky9u (Ihre Version). Klicken Sie mehrmals auf die Überschrift "Geschlecht", um zu sehen, wie die IDs oder Namen anschließend die Reihenfolge in Ihrer Version ändern, während die ursprüngliche Reihenfolge in meiner Version beibehalten wird.
Markus s
39

Das mit Abstand einfachste, das ich verwendet habe, ist: http://datatables.net/

Erstaunlich einfach ... Stellen Sie einfach sicher, dass Sie Ihre Tabelle mit formatieren <thead>und <tbody>sie nicht funktioniert , wenn Sie den DOM-Ersetzungsweg gehen (IE, Erstellen einer Tabelle und Neuformatieren von DataTables) . Das ist ungefähr das einzige Problem.

Es gibt auch Unterstützung für AJAX usw. Wie bei allen wirklich guten Codeteilen ist es auch SEHR einfach, alles auszuschalten. Sie wären jedoch überrascht, was Sie verwenden könnten. Ich begann mit einer "nackten" Datentabelle, die nur ein Feld sortierte, und stellte dann fest, dass einige der Funktionen für meine Arbeit wirklich relevant waren. Kunden lieben die neuen Funktionen.

Bonuspunkte für DataTables für die vollständige Unterstützung von ThemeRoller ....

Ich hatte auch gutes Glück mit Tablesorter, aber es ist bei weitem nicht so einfach, nicht ganz so gut dokumentiert und hat nur gute Funktionen.

bpeterson76
quelle
4
Einverstanden ist es ein nettes funktionsreiches Plugin, das jedoch möglicherweise in Bezug auf Komplexität und Größe für die Anforderungen des OP übertrieben ist.
Redsquare
2
+1 für die Verfügbarkeit auf NuGet: nuget.org/List/Packages/jquery.datatables
Frank van Eykelen
1
Ich stimme auch zu, datatables.net ist der beste Tabellensortierer / Paginizer / Sucher da draußen. Die umfangreichen Funktionen haben mir viel Zeit gespart. Ich bedauere nur die Zeit, die ich damit verbracht habe, das Tablesorter2-Plugin in meine Codes zu integrieren, bevor ich etwas über Datentabellen herausgefunden habe ...
Logan
2
Ich weiß, dass dies ein alter Thread ist, aber diese Antwort gilt immer noch. Wahrscheinlich das einfachste Plugin, das ich je benutzt habe. Es dauerte 5 Minuten, um aufzustehen und meinen Tisch zu sortieren. Danke dir!
Trucktech
Sehr einfach einzurichten, am besten habe ich verwendet.
Rog
18

Wir haben gerade angefangen, dieses Slick-Tool zu verwenden: https://plugins.jquery.com/tablesorter/

Es gibt ein Video zu seiner Verwendung unter: http://www.highoncoding.com/Articles/695_Sorting_GridView_Using_JQuery_TableSorter_Plug_in.aspx

    $('#tableRoster').tablesorter({
        headers: {
            0: { sorter: false },
            4: { sorter: false }
        }
    });

Mit einem einfachen Tisch

<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>&nbsp;</th>
                  </tr>
        </thead>
Ravi Ram
quelle
15

Meine Antwort wäre "Vorsicht". Viele Add-Ons zum Sortieren von jQuery-Tabellen sortieren nur das, was Sie an den Browser übergeben. In vielen Fällen müssen Sie berücksichtigen, dass Tabellen dynamische Datensätze sind und möglicherweise zig Millionen Datenzeilen enthalten können.

Sie erwähnen, dass Sie nur 4 Spalten haben, aber viel wichtiger ist, dass Sie nicht erwähnen, über wie viele Zeilen wir hier sprechen.

Wenn Sie 5000 Zeilen aus der Datenbank an den Browser übergeben und wissen, dass die tatsächliche Datenbanktabelle 100.000 Zeilen enthält, lautet meine Frage: Was bringt es, die Tabelle sortierbar zu machen? Um eine ordnungsgemäße Sortierung durchzuführen, müssen Sie die Abfrage an die Datenbank zurücksenden und die Datenbank (ein Tool zum Sortieren von Daten) die Sortierung für Sie durchführen lassen.

Als direkte Antwort auf Ihre Frage ist Ingrid das beste Sortier-Add-On, auf das ich gestoßen bin. Es gibt viele Gründe, warum ich dieses Add-On nicht mag ("unnötige Schnickschnack ...", wie Sie es nennen), aber eine der besten Eigenschaften in Bezug auf die Art ist, dass es Ajax verwendet und nicht. Es wird nicht davon ausgegangen, dass Sie bereits alle Daten übergeben haben, bevor die Sortierung durchgeführt wird.

Ich erkenne, dass diese Antwort für Ihre Anforderungen wahrscheinlich übertrieben (und über 2 Jahre zu spät) ist, aber ich ärgere mich, wenn Entwickler in meinem Bereich diesen Punkt übersehen. Ich hoffe also, dass jemand anderes es aufgreift.

Ich fühle mich jetzt besser.

cartbeforehorse
quelle
6

Ich liebe diese akzeptierte Antwort, aber selten erhalten Sie Anforderungen zum Sortieren von HTML und müssen keine Symbole hinzufügen, die die Sortierrichtung angeben. Ich habe das Verwendungsbeispiel der Antwort akzeptiert und dies schnell behoben, indem ich einfach Bootstrap zu meinem Projekt hinzugefügt und den folgenden Code hinzugefügt habe:

<div></div>

in jedem, <th>so dass Sie einen Platz haben, um das Symbol zu setzen.

setIcon(this, inverse);

aus der Verwendung der akzeptierten Antwort unter der Zeile:

th.click(function () {

und durch Hinzufügen der setIcon-Methode:

function setIcon(element, inverse) {

        var iconSpan = $(element).find('div');

        if (inverse == false) {
            $(iconSpan).removeClass();
            $(iconSpan).addClass('icon-white icon-arrow-up');
        } else {
            $(iconSpan).removeClass();
            $(iconSpan).addClass('icon-white icon-arrow-down');
        }
        $(element).siblings().find('div').removeClass();
    }

Hier ist eine Demo . - Sie müssen entweder die Demo in Firefox oder IE ausführen oder die MIME-Typprüfung von Chrome deaktivieren, damit die Demo funktioniert. Dies hängt vom sortElements-Plugin ab, das durch die akzeptierte Antwort als externe Ressource verknüpft ist. Nur ein Kopf hoch!


quelle
6

Dies ist eine gute Möglichkeit, eine Tabelle zu sortieren:

$(document).ready(function () {
                $('th').each(function (col) {
                    $(this).hover(
                            function () {
                                $(this).addClass('focus');
                            },
                            function () {
                                $(this).removeClass('focus');
                            }
                    );
                    $(this).click(function () {
                        if ($(this).is('.asc')) {
                            $(this).removeClass('asc');
                            $(this).addClass('desc selected');
                            sortOrder = -1;
                        } else {
                            $(this).addClass('asc selected');
                            $(this).removeClass('desc');
                            sortOrder = 1;
                        }
                        $(this).siblings().removeClass('asc selected');
                        $(this).siblings().removeClass('desc selected');
                        var arrData = $('table').find('tbody >tr:has(td)').get();
                        arrData.sort(function (a, b) {
                            var val1 = $(a).children('td').eq(col).text().toUpperCase();
                            var val2 = $(b).children('td').eq(col).text().toUpperCase();
                            if ($.isNumeric(val1) && $.isNumeric(val2))
                                return sortOrder == 1 ? val1 - val2 : val2 - val1;
                            else
                                return (val1 < val2) ? -sortOrder : (val1 > val2) ? sortOrder : 0;
                        });
                        $.each(arrData, function (index, row) {
                            $('tbody').append(row);
                        });
                    });
                });
            });
            table, th, td {
            border: 1px solid black;
        }
        th {
            cursor: pointer;
        }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
        <tr><th>id</th><th>name</th><th>age</th></tr>
        <tr><td>1</td><td>Julian</td><td>31</td></tr>
        <tr><td>2</td><td>Bert</td><td>12</td></tr>
        <tr><td>3</td><td>Xavier</td><td>25</td></tr>
        <tr><td>4</td><td>Mindy</td><td>32</td></tr>
        <tr><td>5</td><td>David</td><td>40</td></tr>
    </table>

Die Geige finden Sie hier:
https://jsfiddle.net/e3s84Luw/

Die Erklärung finden Sie hier: https://www.learningjquery.com/2017/03/how-to-sort-html-table-using-jquery-code

julianisch
quelle
2

Die Antwort von @Nick Grealy ist großartig, berücksichtigt jedoch nicht mögliche rowspanAttribute der Tabellenkopfzellen (und wahrscheinlich tun es auch die anderen Antworten nicht). Hier ist eine Verbesserung der Antwort von @Nick Grealy, die das behebt. Basierend auch auf dieser Antwort (danke @Andrew Orlov).

Ich habe die $.isNumericFunktion auch durch eine benutzerdefinierte ersetzt (danke @zad), damit sie mit älteren jQuery-Versionen funktioniert.

Um es zu aktivieren, fügen Sie class="sortable"es dem <table>Tag hinzu.

$(document).ready(function() {

    $('table.sortable th').click(function(){
        var table = $(this).parents('table').eq(0);
        var column_index = get_column_index(this);
        var rows = table.find('tbody tr').toArray().sort(comparer(column_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 isNumber(valA) && isNumber(valB) ? valA - valB : valA.localeCompare(valB);
    }
}
function getCellValue(row, index){ return $(row).children('td').eq(index).html() };

function isNumber(n) {
  return !isNaN(parseFloat(n)) && isFinite(n);
}

function get_column_index(element) {
    var clickedEl = $(element);
    var myCol = clickedEl.closest("th").index();
    var myRow = clickedEl.closest("tr").index();
    var rowspans = $("th[rowspan]");
    rowspans.each(function () {
        var rs = $(this);
        var rsIndex = rs.closest("tr").index();
        var rsQuantity = parseInt(rs.attr("rowspan"));
        if (myRow > rsIndex && myRow <= rsIndex + rsQuantity - 1) {
            myCol++;
        }
    });
    // alert('Row: ' + myRow + ', Column: ' + myCol);
    return myCol;
};
Dennis Golomazov
quelle
Was ist, wenn Sie nach Datum sortieren?
Wubblyjuggly
@wubblyjuggly Sie können die Vergleichsfunktion durch eine ersetzen, die Daten vergleicht, siehe z. B. stackoverflow.com/questions/10636779/jquery-date-sorting
Dennis Golomazov
1
Bravo, ich habe Dutzende von Sortierern ausprobiert, deins ist das einzige, das für mich funktioniert. Übrigens sind meine Daten im Textformat (2020.02.23), daher ist das für mich kein Problem
Manny Ramirez
2

Sie können ein jQuery-Plugin ( Breedjs ) verwenden, das Sortieren, Filtern und Paginieren bietet:

HTML:

<table>
  <thead>
    <tr>
      <th sort='name'>Name</th>
      <th>Phone</th>
      <th sort='city'>City</th>
      <th>Speciality</th>
    </tr>
  </thead>
  <tbody>
    <tr b-scope="people" b-loop="person in people">
      <td b-sort="name">{{person.name}}</td>
      <td>{{person.phone}}</td>
      <td b-sort="city">{{person.city}}</td>
      <td>{{person.speciality}}</td>
    </tr>
  </tbody>
</table>

JS:

$(function(){
  var data = {
    people: [
      {name: 'c', phone: 123, city: 'b', speciality: 'a'},
      {name: 'b', phone: 345, city: 'a', speciality: 'c'},
      {name: 'a', phone: 234, city: 'c', speciality: 'b'},
    ]
  };
  breed.run({
    scope: 'people',
    input: data
  });
  $("th[sort]").click(function(){
    breed.sort({
      scope: 'people',
      selector: $(this).attr('sort')
    });
  });
});

Arbeitsbeispiel zur Geige

João Paulo
quelle
2

Dieser legt den / die Browser nicht auf, einfach weiter konfigurierbar:

var table = $('table');

$('th.sortable').click(function(){
    var table = $(this).parents('table').eq(0);
    var ths = table.find('tr:gt(0)').toArray().sort(compare($(this).index()));
    this.asc = !this.asc;
    if (!this.asc)
       ths = ths.reverse();
    for (var i = 0; i < ths.length; i++)
       table.append(ths[i]);
});

function compare(idx) {
    return function(a, b) {
       var A = tableCell(a, idx), B = tableCell(b, idx)
       return $.isNumeric(A) && $.isNumeric(B) ? 
          A - B : A.toString().localeCompare(B)
    }
}

function tableCell(tr, index){ 
    return $(tr).children('td').eq(index).text() 
}
Raubvogel
quelle
1
Dies scheint die beste Lösung zu sein. Es ist kein Plugin erforderlich. In der ersten Zeile, die Sie löschen können, fügen Sie in Ihrem Dokument den Block $ ('th.sortable') ein. Klicken Sie auf den Block (...). Geben Sie Tabellenüberschriften die sortierbare Klasse und Sie sind fertig. <th class = 'sortable> title </ th>. Funktioniert charmant für Spalten mit Text oder Zahlen.
Pizzamonster
1

Auf die Antwort von James werde ich nur die Sortierfunktion ändern, um sie universeller zu machen. Auf diese Weise werden Text alphabetisch und Zahlen wie Zahlen sortiert.

if( $.text([a]) == $.text([b]) )
    return 0;
if(isNaN($.text([a])) && isNaN($.text([b]))){
    return $.text([a]) > $.text([b]) ? 
       inverse ? -1 : 1
       : inverse ? 1 : -1;
}
else{
    return parseInt($.text([a])) > parseInt($.text([b])) ? 
      inverse ? -1 : 1
      : inverse ? 1 : -1;
}
Kaloyan Iliev
quelle
1

Ein weiterer Ansatz zum Sortieren von HTML-Tabellen. (basierend auf W3.JS HTML Sort )

/* Facility Name */
$('#bioTable th:eq(0)').addClass("control-label pointer");
/* Phone # */
$('#bioTable th:eq(1)').addClass("not-allowed");
/* City */
$('#bioTable th:eq(2)').addClass("control-label pointer");
/* Specialty */
$('#bioTable th:eq(3)').addClass("not-allowed");


var collection = [{
  "FacilityName": "MinION",
  "Phone": "999-8888",
  "City": "France",
  "Specialty": "Genetic Prediction"
}, {
  "FacilityName": "GridION X5",
  "Phone": "999-8812",
  "City": "Singapore",
  "Specialty": "DNA Assembly"
}, {
  "FacilityName": "PromethION",
  "Phone": "929-8888",
  "City": "San Francisco",
  "Specialty": "DNA Testing"
}, {
  "FacilityName": "iSeq 100 System",
  "Phone": "999-8008",
  "City": "Christchurch",
  "Specialty": "gDNA-mRNA sequencing"
}]

$tbody = $("#bioTable").append('<tbody></tbody>');

for (var i = 0; i < collection.length; i++) {
  $tbody = $tbody.append('<tr class="item"><td>' + collection[i]["FacilityName"] + '</td><td>' + collection[i]["Phone"] + '</td><td>' + collection[i]["City"] + '</td><td>' + collection[i]["Specialty"] + '</td></tr>');
}
.control-label:after {
  content: "*";
  color: red;
}

.pointer {
  cursor: pointer;
}

.not-allowed {
  cursor: not-allowed;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://www.w3schools.com/lib/w3.js"></script>
<link href="https://www.w3schools.com/w3css/4/w3.css" rel="stylesheet" />
<p>Click the <strong>table headers</strong> to sort the table accordingly:</p>

<table id="bioTable" class="w3-table-all">
  <thead>
    <tr>
      <th onclick="w3.sortHTML('#bioTable', '.item', 'td:nth-child(1)')">Facility Name</th>
      <th>Phone #</th>
      <th onclick="w3.sortHTML('#bioTable', '.item', 'td:nth-child(3)')">City</th>
      <th>Specialty</th>
    </tr>
  </thead>
</table>

Penny Liu
quelle
1

Am Ende habe ich Nicks Antwort (die beliebteste, aber nicht akzeptierte) https://stackoverflow.com/a/19947532/5271220 verwendet

und kombinierte es mit https://stackoverflow.com/a/16819442/5271220 , wollte dem Projekt jedoch keine Symbole oder Schriftarten hinzufügen. Die CSS-Stile für Sortierspalte aufsteigend / absteigend habe ich Farbe, Auffüllen, abgerundeten Rand gemacht.

Ich habe es auch so modifiziert, dass es eher nach Klassen als nach Klassen sortiert ist, damit wir steuern können, welche sortierbar sind. Dies könnte sich auch später als nützlich erweisen, wenn zwei Tabellen vorhanden sind, obwohl dafür weitere Änderungen erforderlich wären.

Körper:

 html += "<thead>\n";
    html += "<th></th>\n";
    html += "<th class=\"sort-header\">Name <span></span></i></th>\n";
    html += "<th class=\"sort-header\">Status <span></span></th>\n";
    html += "<th class=\"sort-header\">Comments <span></span></th>\n";
    html += "<th class=\"sort-header\">Location <span></span></th>\n";
    html += "<th nowrap class=\"sort-header\">Est. return <span></span></th>\n";
    html += "</thead>\n";
    html += "<tbody>\n"; ...

... weiter unten im Körper

$("body").on("click", ".sort-header", function (e) {
    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]) }

    setIcon(e.target, this.asc);
});

Funktionen:

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()
    }

    function setIcon(element, inverse) {

        var iconSpan = $(element).find('span');

        if (inverse == true) {
            $(iconSpan).removeClass();
            $(iconSpan).addClass('sort-column-asc');
            $(iconSpan)[0].innerHTML = " &#8593 " // arrow up
        } else {
            $(iconSpan).removeClass();
            $(iconSpan).addClass('sort-column-desc');
            $(iconSpan)[0].innerHTML = " &#8595 " // arrow down 
        }

        $(element).siblings().find('span').each(function (i, obj) {
            $(obj).removeClass();
            obj.innerHTML = "";
        });
    }
blinder Skwirl
quelle
-3

Meine Wahl! jquery.sortElements.js und einfache jquery
Sehr einfach, sehr einfach, danke nandhp ...

            $('th').live('click', function(){

            var th = $(this), thIndex = th.index(), var table = $(this).parent().parent();

                switch($(this).attr('inverse')){
                case 'false': inverse = true; break;
                case 'true:': inverse = false; break;
                default: inverse = false; break;
                }
            th.attr('inverse',inverse)

            table.find('td').filter(function(){
                return $(this).index() === thIndex;
            }).sortElements(function(a, b){
                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;     
            });

Dei uma melhorada do código
Ein Kabeljau besser! Funktion für alle Tabellen in allen Th in allen Zeiten ... Schau es dir an!
DEMO

Filipe Rudá
quelle
2
Abgesehen davon, dass ich kein Wort verstehen kann, würde ich dringend davon abraten .live().
Inkarnation