jquery .html () vs .append ()

248

Nehmen wir an, ich habe ein leeres Div:

<div id='myDiv'></div>

Ist das:

$('#myDiv').html("<div id='mySecondDiv'></div>");

Das Gleiche wie:

var mySecondDiv=$("<div id='mySecondDiv'></div>");
$('#myDiv').append(mySecondDiv);
Argiropoulos Stavros
quelle
21
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.

Dies:

$('<div id="' + someID + '" class="foobar">' + content + '</div>');

... ist viel schwieriger zu pflegen als dies:

$('<div/>', {
    id: someID,
    className: 'foobar',
    html: content
});
James
quelle
5
jQuery (Array (101) .join ('<div> </ div>')); <- warum 101 statt 100?
Tacone
2
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.

Ein jQuery Wrapper (pro Beispiel):

$("#myDiv").html('<div id="mySecondDiv"></div>');

$("#myDiv").append('<div id="mySecondDiv"></div>');

Zwei jQuery Wrapper (pro Beispiel):

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();
Doug Neiner
quelle
Siehst du? Die String-Verkettung hat hier bereits zu einem Fehler geführt (uneingeschränktes Anführungszeichen). siehe meinen Beitrag: P
kizzx2
20

Wenn .addSie damit meinen .append, ist das Ergebnis dasselbe, wenn #myDives leer ist.

Ist die Leistung gleich? weiß nicht.

.html(x) macht am Ende das Gleiche wie .empty().append(x)

mkoryak
quelle
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.

Luca Matteis
quelle
7

Sie können die zweite Methode erhalten, um den gleichen Effekt zu erzielen, indem Sie:

var mySecondDiv = $('<div></div>');
$(mySecondDiv).find('div').attr('id', 'mySecondDiv');
$('#myDiv').append(mySecondDiv);

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:

// Clumsy string concat, error prone
$('#myDiv').html("<div style='width:'" + myWidth + "'px'>Lorem ipsum</div>");

// Isn't this a lot cleaner? (though longer)
var newDiv = $('<div></div>');
$(newDiv).find('div').css('width', myWidth);
$('#myDiv').append(newDiv);
kizzx2
quelle
5
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?
kizzx2
3

.html() wird alles ersetzen.

.append() wird nur am Ende angehängt.

daCoda
quelle
2

Abgesehen von den gegebenen Antworten, falls Sie so etwas haben:

<div id="test">
    <input type="file" name="file0" onchange="changed()">
</div>
<script type="text/javascript">
    var isAllowed = true;
    function changed()
    {
        if (isAllowed)
        {
            var tmpHTML = $('#test').html();
            tmpHTML += "<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
            $('#test').html(tmpHTML);
            isAllowed = false;
        }
    }
</script>

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;
        }
    }
Arianbakh
quelle
0

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.

Binita Bharati
quelle