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.
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.
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.
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();
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 .
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?
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;}}
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.
Jawaban:
Setiap kali Anda melewatkan string HTML ke salah satu metode jQuery, inilah yang terjadi:
Elemen sementara dibuat, sebut saja x. x's
innerHTML
diatur ke string HTML yang telah Anda lewati. Kemudian jQuery akan mentransfer setiap node yang dihasilkan (yaitu, xchildNodes
) ke fragmen dokumen yang baru dibuat, yang kemudian akan di-cache untuk waktu berikutnya. Kemudian akan mengembalikan fragmenchildNodes
sebagai 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>
untukjQuery()
, jQuery akan mengambil jalan pintas dan cukup lakukandocument.createElement('div')
.EDIT : Untuk melihat jumlah pemeriksaan yang dilakukan jQuery, lihat di sini , di sini dan di sini .
innerHTML
adalah umumnya lebih cepat pendekatan, meskipun jangan biarkan yang mengatur apa yang Anda lakukan sepanjang waktu. Pendekatan jQuery tidak sesederhanaelement.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:
Ada juga masalah keterbacaan dan pemeliharaan untuk diperhitungkan.
Ini:
... jauh lebih sulit untuk dipertahankan daripada ini:
sumber
101
akan 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.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):
Dua Pembungkus jQuery (per contoh):
Anda memiliki beberapa kasus penggunaan berbeda yang terjadi. Jika Anda ingin mengganti konten,
.html
ini adalah panggilan yang bagus karena setara denganinnerHTML = "..."
. Namun, jika Anda hanya ingin menambahkan konten,$()
set bungkus tambahan tidak diperlukan.Gunakan hanya dua pembungkus jika Anda perlu memanipulasi yang ditambahkan
div
nanti. Bahkan dalam kasus itu, Anda mungkin hanya perlu menggunakannya:sumber
jika yang
.add
Anda maksudkan.append
, maka hasilnya sama jika#myDiv
kosong.apakah kinerjanya sama? tidak tahu
.html(x)
akhirnya melakukan hal yang sama seperti.empty().append(x)
sumber
Nah,
.html()
penggunaan.innerHTML
yang lebih cepat dari pembuatan DOM .sumber
Anda bisa mendapatkan metode kedua untuk mencapai efek yang sama dengan:
Luca menyebutkan bahwa
html()
hanya menyisipkan hte HTML yang menghasilkan kinerja lebih cepat.Namun dalam beberapa kesempatan, Anda akan memilih opsi kedua, pertimbangkan:
sumber
px
):$('<div />', { width: myWidth }).appendTo("#myDiv");
.html()
akan menggantikan semuanya..append()
hanya akan menambahkan di akhir.sumber
Selain jawaban yang diberikan, jika Anda memiliki sesuatu seperti ini:
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:
sumber
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.
.html
akhirnya akan menambahkan hanya objek terakhir ke elemen induk, sedangkan.append
akan menambahkan semua objek daftar sebagai anak-anak dari elemen induk.sumber