Tabellen sortieren
Das Skript macht eine HTML Tabelle sortierbar. Die Spalten können durch einen Klick auf die Titelzeile sortiert werden. Dazu ist es nur nötig, der gewünschten Tabelle die CSS-Klasse sortable zu zuweisen und den folgenden Javascript Code in die Seite einzufügen.
<script type="text/javascript" src="ltrim.js"></script> |
<script type="text/javascript" src="sort_table.js"></script> |
<script type="text/javascript" > |
window.onload = function() {
|
SortTable.init(); |
} |
</script> |
Der Aufruf von SortTable.init() erzeugt alle notwendigen Events für die jeweiligen Tabellen. Die Header Zeilen können angeklickt werden und die Spalte wird sortiert. Das Skript sortiert nach folgenden Daten in den Tabellenzellen:
- Zeichenketten (Umlaute werden erkannt)
- Zahlen (Mit dem Punkt als Dezimalzeichen)
- Zeichenketten und Zahlen in HTML Tags - zum sortieren werden die Tags intern gelöscht
- Zeichenketten und Zahlen in Formularfeldern
- Datum -
Das Datum kann entweder ein Format sein, das mit Date.parse() umgewandelt werden kann oder das in Deutschland häufig übliche Format:
DD.MM.YYYY. Die Formate können beliebig gemischt werden
Konfiguration
Die Konfiguration des Skriptes kann angepasst werden. Dazu müssen folgende Werte überschrieben werden.
// Die Bezeichnung der Klasse der Tabelle |
SortTable.className = 'sortable'; |
// Das Element das angezeigt wird, wenn die Spalte abwärts sortiert ist |
SortTable.up = String.fromCharCode(9650); |
// Das Element das angezeigt wird, wenn die Spalte aufwärts sortiert ist |
SortTable.down = String.fromCharCode(9660); |
SortTable.alt_up = 'Abwärts sortieren'; |
SortTable.alt_down = 'Aufwärts sortieren'; |
// Farbe des Zeichens in der aktiven Spalte |
SortTable.pointer_color = '#222'; |
Spalten nicht sortieren
Die Klasse no_sort im Headerelement (TH oder TD) verhindert, das die entsprechende Spalte sortiert werden kann.
Sortierwerte, unabhängig vom Feldinhalt
Mit dem Attribut my_key in einer bestimmten Zelle kann
ein Sortierwert, unabhängig vom Inhalt verwendet werden. (Der Code ist dadurch nicht mehr valide)
z.b:
<td my_Key="10">zehn</td>
Groß- und Kleinschreibung ignorieren
Hat das title-Attribut der Headerzeile den Wert ignore_case oder ein Attribut mit dem gleichen Namen, wird ohne Berücksichtigung der Groß- und Kleinschreibung sortiert.
<th title="ignore_case">... </td> |
Reihen nicht sortieren
Alle Reihen, die entweder nicht in einem tbody Element stehen
oder in einem tfoot Element, werden nicht sortiert.
Alle Werte wie eine Zeichenktte sortieren
Wenn in einer Spalte Zahlen und Zeichenketten stehen, wird diese falsch sortiert. Deshalb kann die Spalte im Header markiert werden, dann werden alle Werte wie Zeichneketten behandelt und entsprechend sortiert.
<th class="sort_string">... </td> |
Events
Es können die Event Handler onstart und onsort benutzt werden. Den Events wird als Parameter die aktuelle Zeit übergeben und die Referenz der Tabellenzelle, auf die geklickt wurde (Änderung vom 11.2.2011).
window.onload = function () { |
SortTable.init().forEach( |
function(el) { |
el.onstart = function(t) { |
this.diff = t; |
} |
el.onsort = function(t) { |
alert('sortiert ' + this.length() + ' Zeilen in ' + (t - this.diff) + 'ms'); |
} |
} |
); |
} |
Tabelle beim anzeigen sortieren
Um die Tabelle direkt sortiert anzuzeigen, muss bei der Initialisierung, die Methode sort() aufgerufen werden.
SortTable.init().forEach(function(el) { |
el.sort(spalte); |
} |
); |
Beispiel
Das Beispiel zeigt eine Tabelle mit einigen unterschiedlichen Feldern, einer Fußzeile und eine Spalte, die nicht sortiert werden kann und einem my_key Wert in einer Zelle. Ausserdem wurden die oben gezeigten Events eingebaut.
| mit einem Inputfeld | Zahlen | unsortierbar | mit einem Link u. ohne Groß/Klein | Datum |
|---|---|---|---|---|
| ---------- | 234.2 | zx wert 1 | BB wert | 2007/11/12 |
| 11. | 101 | wert 3 | wert 74 | 2007/11/12 |
| 2. | 100 | owert 3 | wert 34 | 2007/11/11 |
| 3. | 75 | owert 2 | wert 24 | 12.12.2007 |
| 4. | 666 | wert 3 | wert 04 (my_key:zzzz) | 2007/11/12 |
| 234 | wert -3 | wert 14 | 2007/11/1 | |
| 6. | 234.1 | x wert 1 | ba wert | 2007/11/12 |
| 7. | 234.01 | bb wert 1 | ab wert | 2006/11/12 |
| 8. | 234.02 | zy wert 1 | Ba wert | 2007/11/12 |
| 9. | 234.15 | zz wert 1 | bb wert | 2007/11/12 |
Grosse Tabelle
Nachfolgend noch eine etwas größere Tabelle, um die Geschwindigkeit des Sortierers zu zeigen. Ausserdem enthält eine Spalte mit Umlauten, seit der Version 2.9.2 werden diese richtig sortiert.
Download
Die folgenden zwei Javascript Dateien müssen eingebunden werden:
sort_table.js
ltrim.js
Ähnliche Artikel
27685 mal gelesen.


183 Comments
Einen Kommentar hinterlassen »
Kommentare
« Zurück 1 ... 6 7 8 9 10 Weiter »-
141.
von TheWolf
-
-
142.
von TheWolf
-
-
143.
von Struppi
-
-
144.
von Burkhard
-
-
145.
von Struppi
-
-
146.
von Burkhard
-
-
147.
von eky79
-
-
148.
von Struppi
-
-
149.
von Chewbacca
-
-
150.
von Chewbacca
-
-
151.
von Chewbacca
-
-
152.
von Chewbacca
-
-
153.
von Sortieren einer XML in PHP - php.de
-
-
154.
von Erich
-
-
155.
von Erich
-
-
156.
von Mustapha
-
-
157.
von Someone
-
-
158.
von Ralf
-
-
159.
von Struppi
-
-
160.
von Ralf
-
« Zurück 1 ... 6 7 8 9 10 Weiter »Sonntag 5.Dezember 2010: 22:03
Hallo,
ich bekomme in Firebug immer den Fehler 'header.rows[0] is undefined' (var th = header.rows[0].cells;) in Zeile 114 der sort_table.js. Woran kann das liegen? Ich verstehs nicht wirklich...
Vielen Dank und lg
Sonntag 5.Dezember 2010: 22:07
Hab jetzt nochmal etwas rumprobiert und es scheint an meinem zu liegen....hier der Code:
Code
Anrede
Name
Firma
....
Wenn ich den rausnehme, gehts auf einmal...werden header nicht untersützt? :-O
Sonntag 5.Dezember 2010: 22:40
Doch, der Beispielcode benutzt auch ein head-Element.
Dienstag 28.Dezember 2010: 10:14
Hallo
mit dieser Funkion wird meine Tabelle aufwärts sortiert
SortTable.init().forEach( function(el) {el.sort(3);});
wie bekomme ich es hin diese Spalte 3 oder generell absteigend, beim aufruf der Seite,
sortieren zu lassen.
Danke im Vorraus
Burkhard
Freitag 31.Dezember 2010: 15:04
Im Prinzip müßte das gehen, in dem du die Funktion zweimal aufrufst.
Sonntag 2.Januar 2011: 06:25
Hab´s so gelöst: sort _table Zeile 134 in var desc = -1; ändern
Freitag 11.Februar 2011: 11:01
Gibt es eine Möglichkeit, die Hintergrundfarbe bzw. ein Hintergrundbild in dem aktiven Spaltenkopf einzufügen?
Freitag 11.Februar 2011: 13:38
Ja, diese Möglichkeit habe ich gerade integriert. Der event
onstartübergibt nun, die Referenz auf die Zelle, die angeklickt wurde. Das kann z.b. so integriert werden:var old;tb.onstart = function(t, z) {
this.diff = t;
if(old) old.style.color = '';
z.style.color = 'red'
old = z;
}
Mittwoch 30.März 2011: 10:42
Hey Struppi,
erstmal sehr cool dass du hier auch nach Jahren noch Support gibst. Ich habe meine HTML Tabelle nach deiner Anleitung sortierbar gemacht, was super funktioniert hat. Was ich gemacht habe:
1.sort_table.js und ltrim.js runtergeladen
2.
window.onload = function() {
SortTable.init();
}
3.
Jetzt möchte ich dass die Tabelle sofort beim anzeigen nach einer Spalte sortiert ist. Dafür muss ja
SortTable.init().forEach(function(el) {
el.sort(meinespalte);
}
);
eingefügt werden. Nur irgendwie verstehe ich nicht ganz wo genau das hin muss.
Mittwoch 30.März 2011: 10:44
Hey Struppi,
erstmal sehr cool dass du hier auch nach Jahren noch Support gibst. Ich habe meine HTML Tabelle nach deiner Anleitung sortierbar gemacht, was super funktioniert hat. Was ich gemacht habe:
1.sort_table.js und ltrim.js runtergeladen
2.
window.onload = function() {
SortTable.init();
}
in header.php
3.
window.onload = function() {
SortTable.init();
}
Vor die Tabelle. Danach war die sortiert! So weit so gut...
Jetzt möchte ich dass die Tabelle sofort beim anzeigen nach einer Spalte sortiert ist. Dafür muss ja
SortTable.init().forEach(function(el) {
el.sort(meinespalte);
}
);
eingefügt werden. Nur irgendwie verstehe ich nicht ganz wo genau das hin muss. Hab alles versucht. Den Code alleine in den Header geschrieben, vor die Tabelle, hinter der Tabelle, mit/ohne
window.onload = function() {
SortTable.init();
}
und sogar aus beiden einen Hybridcode gebastelt aber nichts hat funktioniert
Wooo muss man das hinschreiben?
MfG
Mittwoch 30.März 2011: 10:46
Huch falsch kopiert zu 2. kommt noch
"
"
Mittwoch 30.März 2011: 10:47
"script type="text/javascript" src="ltrim.js"></script"
Freitag 6.Mai 2011: 17:17
[...] sowas auch vor kurzem gesucht und das hier gefunden: Sortieren mit CSS Hoffe das hilft [...]
Samstag 9.Juli 2011: 17:10
Hallo
ich habe dein hervorragendes Script seit ca. 2 Jahren installiert. Funktionierte einwandfrei. Jetzt habe ich auf den neuesten Stand updated. Und es funktioniert nur noch teilweise:
FF OK, Opera OK, IE8 geht nichts!, Google Chrome geht nichts, Safari geht nichts. Bei keinem der nicht funktionierenden Browsern gibt es eine Fehlermeldung, ausser :
var tmp = this.stripNL().ltrim().rtrim(); aus Ltrim.js, "this.stripNL is not a function"
ausserdem habe ich den onload in den body genommen:
hat jemand dasselbe Problem und eine Idee?
Gruss Erich
Samstag 9.Juli 2011: 20:04
Hallo
das Problem ist z.T. gelöst. Ich hatte den SortTable.init(); im body-tag. Dass es bei einigen Browsern nicht funktionierte lag am init. Den habe ich nun vor das schliessende body-tag gesetzt.
Die Sortierung funktioniert aber bei allen Browsern noch nicht, weil beim erweiterten ltrim immer noch der Fehler :
var tmp = this.stripNL().ltrim().rtrim(); aus Ltrim.js, "this.stripNL is not a function" erscheint.
Nimmt man die alte ltrim.js dann geht die Sortierung nun in allen Browsern.
Gruss Erich
Dienstag 4.Oktober 2011: 15:56
Hallo,
ich habe mein problem hiermit nicht lösen können. Gibt es irgend eine Modifikation, mit welcher man mit AJAX geladene Tabellen sortieren kann?
Danke im Voraus
Mustapha
Freitag 7.Oktober 2011: 07:02
Das Script funktioniert schön schnell. Allerdings habe ich am Anfang übersehen das man der Tabelle der Klasse sortable zuordnen muss (@Mustapha).
An dem Script habe ich eine Änderung für mich noch vorgenommen: Ich habe statt der my_key Eigenschaft abbr verwendet, damit mein HTML Standardkonform bleibt.
Samstag 15.Oktober 2011: 19:38
Moin,
das Sortieren funktioniert leider nicht, wenn ein COLSPAN in einer TD eingetragen ist.
Das COLSPAN benötige ich aber zum Gruppieren.
Gibt es eine Möglichkeit, das zu ändern?
Besten Dank und schöne Grüße
Ralf
Mittwoch 19.Oktober 2011: 12:23
Das Skript funktioniert eigentlich mit colspan.
Mittwoch 19.Oktober 2011: 23:05
Hallo Struppi,
danke für die Antwort.
Die Spalten vor dem Colspan werden sortiert. wenn ich aber eine zustäzliche Reihe habe, wo die erste Zelle ein Colspan über die gesamte Breite habe, dann ist nur die erste Zelle der ganzen tabelle sortierbar. Danach erscheint ein Fehler: Zeile 193, Objekt ist Null.
Beispiel
Spalte 1Spalte 2
Daten 1Daten 1
Daten 2Daten 2
Gruppe 1
Daten 3Daten 3
Spalte 1 ist sortierbar, Spalte 2 im IE 8 ist es nicht.
Kannst Du das bestätigen?
Einen Kommentar hinterlassen