$() <- wird einfach für alles benutzt.
Nein, es wird benutzt, wo es nötig ist. Manche jQuery-Anfänger meinen, alles mögliche und jede Zeile erst einmal mit einmal $() zu beginnen.
Egal ob ich ein Element erstelle, getElementById haben will oder einen CSS-Selektor-Query, fast alles läuft über diese eine Funktion.
Das stimmt. Das sind ja zusammengefasst nur zwei Anwendungsfälle. Ein wichtiger dritter ist vielleicht noch das manuelle Wrappen von Elementen, z.B. $(this) in Event-Handlern und Iteratoren.
var tbl = $('#grosseTabelle');
var i, k;
for (i=0; i<100; i++) {
var tr = $('<tr></tr>'); // tr's erstellen
for (k=0; k<100; k++) {
tr.append($('<td></td>')); // td's hinzufügen
}
tbl.append(tr); // tr an die Tabelle hängen
}
[/code]
Vielleicht könnt ihr mir dabei helfen dieses kleine Beispiel "schön" zu machen.
Es ist so schön, wie jQuery es vorsieht. Es ist aber nicht performant. DOM-Operationen wie diese, wo du riesige Tabellen zusammenbaust, sollten nicht am Live-DOM stattfinden. Mit 100 mal 100 Zellen frierst du den Browser ein, weil er nach jeder Operation das DOM aktualisiert und layoutet.
Besser ist es, die grosseTabelle z.B. erst mittels detach aus dem DOM zu lösen, dann daran zu arbeiten und sie letztlich wieder einzuhängen.
Was mir vor allem nicht gefällt ist dabei das $('<tr></tr>')
. Eine Funktion wie document.createElement(...) konnte ich für jQuery leider nicht finden :-/
Wenn du low-level arbeiten willst, kannst du das tun, aber jQuery vereinfacht es dir nicht. $('<td></td>') bzw. $('<td/>') so »unschön« aus, weil dieser Fall unglaublich selten vorkommt. Wann erzeugt man schon ein leeres Element? Diese Schreibweise ist darauf ausgelegt, dass man dem Element gleich noch Inhalt mitgibt. Gerne auch komplexen Inhalt mit weiteren Elementen. Wenn du es einfach willst, kannst du, wie Matti auch sagt, mit dem konventionellen DOM arbeiten und jQuery nur nutzen, wenn du dessen Methoden brauchst. In deinem Beispiel nutzt du jQuery nicht wirklich - du hättest ohne viel Mehraufwand document.createElement und appendChild schreiben können.
Dein Beispiel ist insofern total gestellt und nicht verwunderlich, dass haargenau diese Vorgehensweise mit eine Bibliothek nicht sonderlich eleganter oder kürzer umgesetzt werden kann. jQuery ist nicht dafür gedacht, in solchen Beispielen gut auszusehen, sondern die API ist für üblichere DOM-Operationen ausgelegt. Das ist bei Prototype im Grunde nicht anders. Ein new Element('td') hat gegenüber low-level-DOM document.createElement('td') keine großen Vorteile, vielmehr legt es ein globales Objekt an, das möglicherweise einen eingebauten Konstruktor überschreibt. Die Vorteile ergeben sich bei komplexeren DOM-Operationen und etwa beim Event-Handling.
Und gibt es eine Art DocumentFragment?
jQuery arbeitet intern sehr viel mit Document-Fragments. Wie gesagt kannst du detach verwenden, wenn du viele DOM-Operationen an bestehenden Elementen erledigen musst. Wobei sich dann die Frage ergibt: Warum und warum auf diese Weise? Auch dafür gibt es andere und bessere Lösungen, z.B. Template-Engines. Unmengen an HTML rendert man ohnehin meist auf dem Server oder transformiert sie clientseitig aus JSON mittels eines Templates in HTML.
Die 100 Zeilen und Spalten sind jetzt nur ein Beispiel, wenn es mehr würden wäre es ja wahrscheinlich besser alle auf einmal ins DOM einzuspeisen. Kann man das mit jQuery irgendwie?
Wie gesagt kannst du das HTML als String zusammenbauen und dann in einem Rutsch mit append o.ä. ins DOM einfügen. Fast alle Methoden zur DOM-Manipulation akzeptieren jQuery-Objekte, Elemente-Objekte sowie HTML-Strings. Es ist daher einfach, die kürzeste Schreibweise zu wählen, ohne darauf verzichten zu müssen, die jQuery-Methoden jederzeit anwenden zu können.
Mathias