Da ich mehrere Tags einfügen muss, scheint es sinnvoll zu sein, innerHTML zu verwenden.
Nur 'mehrere'? Dann ist Geschwindigkeit kein Problem. Wenn du hundert erzeugst, musst du darüber nachdenken, was du tust. Es ist nicht wirklich das Erstellen, das ist das Problem, es ist die Kind-Knotenliste Manipulation, die immer langsamer wird, wenn Sie jedes zusätzliche Element hinzufügen.
Zum Anhängen haben Sie eigentlich keine Wahl. Sie können innerHTML nicht festlegen, ohne den vorhandenen Inhalt zu verlieren. Wenn Sie also mit der Serialisierung und erneuten Analyse nicht zufrieden sind (was nicht serialisierbare Daten wie Formularinhalte, JavaScript-Eigenschaften/Verweise und Ereignishandler auslöscht), landen Sie Setzen Sie das innerHTML eines anderen Elements und verschieben Sie jedes Kind nacheinander. Dies ist, was viele Frameworks tun und es endet in der Regel sogar langsamer als manuell create-and-appendChild.
Abhängig von Ihrer Situation (insbesondere: wie viele Kindknoten sind bereits im Zielelement und wie viele werden Sie hinzufügen?), Kann es schneller sein, die Operation in kleinere Manipulationen an einem DocumentFragment, dessen Kinder kann auf einmal an alle Elemente eines Elements angehängt werden. Das ist viel schneller. Leider ist es nicht möglich, innerHTML
auf ein DocumentFragment zu setzen.
Es gibt auch schnellere Hacks mit Range-Objekten, um eine Last von HTML auf einmal zu verschieben, aber leider sind Ranges stark browserübergreifende Variable. Es scheint mir jedoch, dass jemand in der Lage sein sollte, ein schnelles append-html aus IE range.pasteHTML und W3 range.extractContents aufzubauen. Hat jemand Lust darauf?
Soweit ich das beurteilen kann, erstellen/anhängen Knoten einfach verhindert, dass Sie ungültigen Code Erstellen
Potenziell ungültige Markup bedeutet nicht nur Ihre Anwendung bricht in einigen Browsern. Wenn Sie blind HTML Spleißen zusammen, ohne wie ein Idiot zu entkommen:
element.innerHTML= '<a href="'+url+'">'+title+'</a>';
dann haben Sie eine clientseitige Cross-Site-Scripting-Sicherheitslücke, die man genauso schlecht wie eine Server-Seite ist.
Sie können natürlich Kompromisse eingehen, indem Sie die Elemente erstellen und ihre Inhalte in separaten Schritten festlegen. Zum Beispiel:
element.innerHTML= '<table>'+'<tr><td>X</td><td><a href="#">go</a></td></tr>'.repeated(urls.length)+'</table>';
for (var i= 0; i<urls.length; i++) {
var row= element.firstChild.rows[i];
row.cells[0].firstChild.data= urls[i];
row.cells[1].firstChild.href= urls[i];
}
(string.repeated ist JavaScript nicht Standard, aber seine Verwendung ist hier offensichtlich.)
Verwenden Sie den Speed-Test-Link innerHTML vs Fragmente auf Win7: - Firefox 10.0.2 beide Methoden durchgeführt etwa gleich (eine andere war jedes Mal etwas schneller!) - Chrome (16.0.912.75 m) innerHtml war durchweg 50% schneller. –