Nein, der zweite hat keine ID, daher wird nicht derselbe Text ausgegeben.
Matt Ellen
.html ist viel schneller, nachdem Sie es zum ersten Mal ausgeführt haben. Es kann ungefähr eine Sekunde dauern, wenn Sie es zum ersten Mal ausführen.
Sukhjit Dhot
Antworten:
316
Immer wenn Sie eine HTML-Zeichenfolge an eine der Methoden von jQuery übergeben, geschieht Folgendes:
Ein temporäres Element wird erstellt, nennen wir es x. x's innerHTMLwird auf die HTML-Zeichenfolge gesetzt, die Sie übergeben haben. Dann überträgt jQuery jeden der erzeugten Knoten (dh x childNodes) auf ein neu erstelltes Dokumentfragment, das dann für das nächste Mal zwischengespeichert wird. Das Fragment wird dann childNodesals neue DOM-Sammlung zurückgegeben.
Beachten Sie, dass es tatsächlich viel komplizierter ist, da jQuery eine Reihe von browserübergreifenden Überprüfungen und verschiedenen anderen Optimierungen durchführt. Wenn Sie beispielsweise nur <div></div>an übergeben jQuery(), nimmt jQuery eine Verknüpfung und tut dies einfach document.createElement('div').
BEARBEITEN : Um zu sehen, wie viele Überprüfungen von jQuery durchgeführt werden, schauen Sie hier , hier und hier .
innerHTMList im Allgemeinen der schnellere Ansatz, obwohl dies nicht die ganze Zeit regeln darf, was Sie tun. Der Ansatz von jQuery ist nicht ganz so einfach wie element.innerHTML = ...- wie bereits erwähnt, gibt es eine Reihe von Überprüfungen und Optimierungen.
Die richtige Technik hängt stark von der Situation ab. Wenn Sie eine große Anzahl identischer Elemente erstellen möchten, müssen Sie als letztes eine massive Schleife erstellen und bei jeder Iteration ein neues jQuery-Objekt erstellen. ZB der schnellste Weg, um mit jQuery 100 Divs zu erstellen:
jQuery(Array(101).join('<div></div>'));
Es sind auch Fragen der Lesbarkeit und Wartung zu berücksichtigen.
Ich wollte nur einen Datenpunkt hinzufügen. Durchführen einiger Leistungstests mit einer App, die einen großen (10K +) Stapel von <li> in ein <ul> lädt und die Renderzeit (nicht Ladezeit) von ~ 12s -> .25s durch Umschalten von .append ( RiesenListHTMLAsASingleString) bis .html (RiesenListHTMLAsASingleString). Wenn Sie bereits den 'Join'-Trick ausführen oder eine große HTML-Zeichenfolge auf Ihrer Liste aufbauen, gibt es definitiv einen Leistungsunterschied zwischen diesen beiden Methoden.
Omnisis
9
@tacone Da der Verbindungskleber zwischen den Array-Elementen aufgetragen wird . 101Es werden 100 Klebstoffe aufgetragen, genau wie beim Verbinden von 3 Elementen 2 Klebstoffe verwendet werden : EL-glue-EL-glue-EL. In James 'Beispiel sind die Array-Elemente "leer", so dass das Verbinden von N leeren Elementen zu N-1 aufeinanderfolgenden Klebstoffen führt.
Fabrício Matté
5
Für diejenigen, die an einer Referenz für die oben verwendete jquery-Syntax interessiert sind und wissen möchten, was erlaubt ist, siehe api.jquery.com/jquery/#jQuery-html-attributes .
Thaddeus Albers
1
Es gibt einen großen Unterschied darin, dass alle Daten verloren gehen, die an die Doms angehängt wurden.
Adrian Bartholomew
68
Sie sind nicht gleich. Der erste ersetzt den HTML-Code, ohne zuerst ein anderes jQuery-Objekt zu erstellen. Der zweite erstellt einen zusätzlichen jQuery-Wrapper für den zweiten Div und hängt ihn dann an den ersten an.
var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').html(mySecondDiv);var mySecondDiv=$('<div id="mySecondDiv"></div>');
$('#myDiv').append(mySecondDiv);
Sie haben einige verschiedene Anwendungsfälle. Wenn Sie den Inhalt ersetzen möchten, .htmlist dies ein guter Anruf, da er dem entspricht innerHTML = "...". Wenn Sie jedoch nur Inhalte anhängen möchten, ist das zusätzliche $()Wrapper-Set nicht erforderlich.
Verwenden Sie nur zwei Wrapper, wenn Sie die divspäter hinzugefügten bearbeiten müssen . Selbst in diesem Fall müssen Sie möglicherweise nur einen verwenden:
var mySecondDiv = $("<div id='mySecondDiv'></div>").appendTo("#myDiv");// other code here
mySecondDiv.hide();
Außerdem hätte der erste offensichtlich eine ID von mySecondDiv, während der andere keine ID hätte. Und die Syntax müsste .html ("<div id = 'mySecondDiv'> </ div>") mit doppelten Anführungszeichen sein, um die einfachen Anführungszeichen verwenden zu können.
Ryanulit
9
Nun, .html()verwendet, .innerHTMLdie schneller ist als die DOM- Erstellung.
Dies ist äußerst ineffizienter (und fehlerhafter) jQuery-Code. Wenn Sie eine Verkettung vermeiden möchten, gehen Sie folgendermaßen vor: (Hinweis pxist ebenfalls nicht erforderlich):$('<div />', { width: myWidth }).appendTo("#myDiv");
Doug Neiner
3
Wie ist das "nicht nützlich"? Das Poster fragte nach dem "Unterschied" (Stichwort ist "vs"), also erzähle ich ihm den Unterschied. Der Code ist ausführlich, aber ich würde nicht "ineffizient" sagen, nur weil es kein Einzeiler ist. Sollten wir nicht wortreich sein, wenn wir Menschen Dinge erklären?
Dies bedeutet, dass Sie automatisch einen weiteren Datei-Upload hinzufügen möchten, wenn Dateien hochgeladen wurden. Der genannte Code funktioniert nicht, da nach dem Hochladen der Datei das erste Element zum Hochladen von Dateien neu erstellt und daher die hochgeladene Datei gelöscht wird . Sie sollten stattdessen .append () verwenden:
function changed(){if(isAllowed){var tmpHTML ="<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
$('#test').append(tmpHTML);
isAllowed =false;}}
Das ist mir passiert. Jquery-Version: 3.3. Wenn Sie eine Liste von Objekten durchlaufen und jedes Objekt als untergeordnetes Element eines übergeordneten dom-Elements hinzufügen möchten, verhalten sich .html und .append sehr unterschiedlich. .htmlAm Ende wird nur das letzte Objekt zum übergeordneten Element hinzugefügt, während .appendalle Listenobjekte als untergeordnete Elemente des übergeordneten Elements hinzugefügt werden.
Antworten:
Immer wenn Sie eine HTML-Zeichenfolge an eine der Methoden von jQuery übergeben, geschieht Folgendes:
Ein temporäres Element wird erstellt, nennen wir es x. x's
innerHTML
wird auf die HTML-Zeichenfolge gesetzt, die Sie übergeben haben. Dann überträgt jQuery jeden der erzeugten Knoten (dh xchildNodes
) auf ein neu erstelltes Dokumentfragment, das dann für das nächste Mal zwischengespeichert wird. Das Fragment wird dannchildNodes
als neue DOM-Sammlung zurückgegeben.Beachten Sie, dass es tatsächlich viel komplizierter ist, da jQuery eine Reihe von browserübergreifenden Überprüfungen und verschiedenen anderen Optimierungen durchführt. Wenn Sie beispielsweise nur
<div></div>
an übergebenjQuery()
, nimmt jQuery eine Verknüpfung und tut dies einfachdocument.createElement('div')
.BEARBEITEN : Um zu sehen, wie viele Überprüfungen von jQuery durchgeführt werden, schauen Sie hier , hier und hier .
innerHTML
ist im Allgemeinen der schnellere Ansatz, obwohl dies nicht die ganze Zeit regeln darf, was Sie tun. Der Ansatz von jQuery ist nicht ganz so einfach wieelement.innerHTML = ...
- wie bereits erwähnt, gibt es eine Reihe von Überprüfungen und Optimierungen.Die richtige Technik hängt stark von der Situation ab. Wenn Sie eine große Anzahl identischer Elemente erstellen möchten, müssen Sie als letztes eine massive Schleife erstellen und bei jeder Iteration ein neues jQuery-Objekt erstellen. ZB der schnellste Weg, um mit jQuery 100 Divs zu erstellen:
Es sind auch Fragen der Lesbarkeit und Wartung zu berücksichtigen.
Dies:
... ist viel schwieriger zu pflegen als dies:
quelle
101
Es werden 100 Klebstoffe aufgetragen, genau wie beim Verbinden von 3 Elementen 2 Klebstoffe verwendet werden :EL-glue-EL-glue-EL
. In James 'Beispiel sind die Array-Elemente "leer", so dass das Verbinden von N leeren Elementen zu N-1 aufeinanderfolgenden Klebstoffen führt.Sie sind nicht gleich. Der erste ersetzt den HTML-Code, ohne zuerst ein anderes jQuery-Objekt zu erstellen. Der zweite erstellt einen zusätzlichen jQuery-Wrapper für den zweiten Div und hängt ihn dann an den ersten an.
Ein jQuery Wrapper (pro Beispiel):
Zwei jQuery Wrapper (pro Beispiel):
Sie haben einige verschiedene Anwendungsfälle. Wenn Sie den Inhalt ersetzen möchten,
.html
ist dies ein guter Anruf, da er dem entsprichtinnerHTML = "..."
. Wenn Sie jedoch nur Inhalte anhängen möchten, ist das zusätzliche$()
Wrapper-Set nicht erforderlich.Verwenden Sie nur zwei Wrapper, wenn Sie die
div
später hinzugefügten bearbeiten müssen . Selbst in diesem Fall müssen Sie möglicherweise nur einen verwenden:quelle
Wenn
.add
Sie damit meinen.append
, ist das Ergebnis dasselbe, wenn#myDiv
es leer ist.Ist die Leistung gleich? weiß nicht.
.html(x)
macht am Ende das Gleiche wie.empty().append(x)
quelle
Nun,
.html()
verwendet,.innerHTML
die schneller ist als die DOM- Erstellung.quelle
Sie können die zweite Methode erhalten, um den gleichen Effekt zu erzielen, indem Sie:
Luca erwähnte, dass
html()
nur das HTML eingefügt wird, was zu einer schnelleren Leistung führt.In einigen Fällen entscheiden Sie sich jedoch für die zweite Option. Beachten Sie Folgendes:
quelle
px
ist ebenfalls nicht erforderlich):$('<div />', { width: myWidth }).appendTo("#myDiv");
.html()
wird alles ersetzen..append()
wird nur am Ende angehängt.quelle
Abgesehen von den gegebenen Antworten, falls Sie so etwas haben:
Dies bedeutet, dass Sie automatisch einen weiteren Datei-Upload hinzufügen möchten, wenn Dateien hochgeladen wurden. Der genannte Code funktioniert nicht, da nach dem Hochladen der Datei das erste Element zum Hochladen von Dateien neu erstellt und daher die hochgeladene Datei gelöscht wird . Sie sollten stattdessen .append () verwenden:
quelle
Das ist mir passiert. Jquery-Version: 3.3. Wenn Sie eine Liste von Objekten durchlaufen und jedes Objekt als untergeordnetes Element eines übergeordneten dom-Elements hinzufügen möchten, verhalten sich .html und .append sehr unterschiedlich.
.html
Am Ende wird nur das letzte Objekt zum übergeordneten Element hinzugefügt, während.append
alle Listenobjekte als untergeordnete Elemente des übergeordneten Elements hinzugefügt werden.quelle