jquery .html () vs .append ()

248

Katakanlah saya punya div kosong:

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

Apakah ini:

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

Sama seperti:

var mySecondDiv=$("<div id='mySecondDiv'></div>");
$('#myDiv').append(mySecondDiv);
Argiropoulos Stavros
sumber
21
tidak, yang kedua tidak memiliki id, jadi teks yang sama tidak akan ditampilkan.
Matt Ellen
.html jauh lebih cepat setelah Anda menjalankannya pertama kali. mungkin butuh beberapa detik saat Anda menjalankannya pertama kali.
sukhjit dhot

Jawaban:

316

Setiap kali Anda melewatkan string HTML ke salah satu metode jQuery, inilah yang terjadi:

Elemen sementara dibuat, sebut saja x. x's innerHTMLdiatur ke string HTML yang telah Anda lewati. Kemudian jQuery akan mentransfer setiap node yang dihasilkan (yaitu, x childNodes) ke fragmen dokumen yang baru dibuat, yang kemudian akan di-cache untuk waktu berikutnya. Kemudian akan mengembalikan fragmen childNodessebagai koleksi DOM segar.

Perhatikan bahwa sebenarnya jauh lebih rumit dari itu, karena jQuery melakukan banyak pemeriksaan lintas-browser dan berbagai optimisasi lainnya. Misalnya, jika Anda lulus hanya <div></div>untuk jQuery(), jQuery akan mengambil jalan pintas dan cukup lakukan document.createElement('div').

EDIT : Untuk melihat jumlah pemeriksaan yang dilakukan jQuery, lihat di sini , di sini dan di sini .


innerHTMLadalah umumnya lebih cepat pendekatan, meskipun jangan biarkan yang mengatur apa yang Anda lakukan sepanjang waktu. Pendekatan jQuery tidak sesederhana element.innerHTML = ...- seperti yang saya sebutkan, ada banyak pemeriksaan dan optimisasi yang terjadi.


Teknik yang benar sangat tergantung pada situasi. Jika Anda ingin membuat sejumlah besar elemen yang identik, maka hal terakhir yang ingin Anda lakukan adalah membuat loop besar, membuat objek jQuery baru di setiap iterasi. Misalnya cara tercepat untuk membuat 100 div dengan jQuery:

jQuery(Array(101).join('<div></div>'));

Ada juga masalah keterbacaan dan pemeliharaan untuk diperhitungkan.

Ini:

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

... jauh lebih sulit untuk dipertahankan daripada ini:

$('<div/>', {
    id: someID,
    className: 'foobar',
    html: content
});
James
sumber
5
jQuery (Array (101) .join ('<div> </div>')); <- mengapa 101 bukannya 100?
tacone
2
Hanya ingin menambahkan datapoint. Melakukan beberapa pengujian kinerja pada aplikasi yang memuat batch besar (10K +) <li> ke dalam <ul> dan melihat peningkatan waktu render (bukan beban) dari ~ 12s -> .25s dengan mengganti .append ( giantListHTMLAsASingleString) ke .html (giantListHTMLAsASingleString). Jika Anda sudah melakukan trik 'gabung' atau membuat string html besar di daftar Anda, pasti ada perbedaan dalam kedua metode ini.
omnisis
9
@tacone Karena "lem" yang bergabung diterapkan di antara elemen-elemen array. 101akan memiliki 100 lem diterapkan, seperti bergabung dengan 3 elemen akan memiliki 2 lem: EL-glue-EL-glue-EL. Dalam contoh James, elemen array "kosong" sehingga bergabung dengan N elemen kosong menghasilkan N-1 lem berurutan.
Fabrício Matté
5
Bagi mereka yang tertarik pada referensi untuk sintaks jquery yang digunakan di atas dan apa yang diizinkan lihat api.jquery.com/jquery/#jQuery-html-attributes .
Thaddeus Albers
1
Ada perbedaan besar dalam hal kehilangan data apa pun yang dilampirkan pada kubah.
Adrian Bartholomew
68

Mereka tidak sama. Yang pertama menggantikan HTML tanpa membuat objek jQuery lain terlebih dahulu. Yang kedua membuat pembungkus jQuery tambahan untuk div kedua, lalu menambahkannya ke yang pertama.

Satu Pembungkus jQuery (per contoh):

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

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

Dua Pembungkus jQuery (per contoh):

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

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

Anda memiliki beberapa kasus penggunaan berbeda yang terjadi. Jika Anda ingin mengganti konten, .htmlini adalah panggilan yang bagus karena setara dengan innerHTML = "...". Namun, jika Anda hanya ingin menambahkan konten, $()set bungkus tambahan tidak diperlukan.

Gunakan hanya dua pembungkus jika Anda perlu memanipulasi yang ditambahkan divnanti. Bahkan dalam kasus itu, Anda mungkin hanya perlu menggunakannya:

var mySecondDiv = $("<div id='mySecondDiv'></div>").appendTo("#myDiv");
// other code here
mySecondDiv.hide();
Doug Neiner
sumber
Kamu melihat? Rangkaian string sudah menyebabkan kesalahan di sini (kutipan tidak terhapuskan). lihat posting saya: P
kizzx2
20

jika yang .addAnda maksudkan .append, maka hasilnya sama jika #myDivkosong.

apakah kinerjanya sama? tidak tahu

.html(x) akhirnya melakukan hal yang sama seperti .empty().append(x)

mkoryak
sumber
Juga, yang pertama jelas akan memiliki id mySecondDiv sementara yang lain tidak memiliki id di atasnya. Dan sintaksnya harus berupa .html ("<div id = 'mySecondDiv'> </div>") menggunakan tanda kutip ganda agar dapat menggunakan tanda kutip tunggal.
ryanulit
9

Nah, .html()penggunaan .innerHTMLyang lebih cepat dari pembuatan DOM .

Luca Matteis
sumber
7

Anda bisa mendapatkan metode kedua untuk mencapai efek yang sama dengan:

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

Luca menyebutkan bahwa html()hanya menyisipkan hte HTML yang menghasilkan kinerja lebih cepat.

Namun dalam beberapa kesempatan, Anda akan memilih opsi kedua, pertimbangkan:

// 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
sumber
5
Ini adalah kode jQuery yang sangat tidak efisien (dan rusak). Jika Anda ingin menghindari penggabungan, lakukan ini: (perlu diperhatikan juga px):$('<div />', { width: myWidth }).appendTo("#myDiv");
Doug Neiner
3
Bagaimana ini "tidak berguna"? Poster meminta "perbedaan" (kata kunci adalah "vs") jadi saya katakan perbedaannya. Kode ini verbose tetapi saya tidak akan mengatakan "tidak efisien" hanya karena fakta bahwa itu bukan satu baris. Tidakkah seharusnya kita menjadi verbose ketika menjelaskan barang kepada orang-orang?
kizzx2
3

.html() akan menggantikan semuanya.

.append() hanya akan menambahkan di akhir.

daCoda
sumber
2

Selain jawaban yang diberikan, jika Anda memiliki sesuatu seperti ini:

<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>

artinya Anda ingin secara otomatis menambahkan satu lagi upload file jika ada file yang diunggah, kode yang disebutkan tidak akan berfungsi, karena setelah file diunggah, elemen unggahan file pertama akan dibuat kembali dan oleh karena itu file yang diunggah akan dihapus dari sana. . Anda harus menggunakan .append () sebagai gantinya:

    function changed()
    {
        if (isAllowed)
        {
            var tmpHTML = "<input type=\"file\" name=\"file1\" onchange=\"changed()\">";
            $('#test').append(tmpHTML);
            isAllowed = false;
        }
    }
Arianbakh
sumber
0

Ini pernah terjadi pada saya . Versi jquery: 3.3. Jika Anda mengulang daftar objek, dan ingin menambahkan setiap objek sebagai anak dari beberapa elemen dom induk, maka .html dan .append akan berperilaku sangat berbeda. .htmlakhirnya akan menambahkan hanya objek terakhir ke elemen induk, sedangkan .appendakan menambahkan semua objek daftar sebagai anak-anak dari elemen induk.

Binita Bharati
sumber