Saya refactoring beberapa kode JavaScript lama dan ada banyak manipulasi DOM yang terjadi.
var d = document;
var odv = d.createElement("div");
odv.style.display = "none";
this.OuterDiv = odv;
var t = d.createElement("table");
t.cellSpacing = 0;
t.className = "text";
odv.appendChild(t);
Saya ingin tahu apakah ada cara yang lebih baik untuk melakukan ini menggunakan jQuery. Saya telah bereksperimen dengan:
var odv = $.create("div");
$.append(odv);
// And many more
Tetapi saya tidak yakin apakah ini lebih baik.
Jawaban:
Inilah contoh Anda di baris "satu".
Pembaruan : Saya pikir saya akan memperbarui posting ini karena masih mendapat sedikit lalu lintas. Dalam komentar di bawah ini ada beberapa diskusi tentang
$("<div>")
vs$("<div></div>")
vs$(document.createElement('div'))
sebagai cara membuat elemen baru, dan mana yang "terbaik".Saya mengumpulkan patokan kecil , dan di sini kira-kira hasil mengulangi opsi di atas 100.000 kali:
jQuery 1.4, 1.5, 1.6
jQuery 1.3
jQuery 1.2
Saya pikir ini bukan kejutan besar, tetapi
document.createElement
metode tercepat. Tentu saja, sebelum Anda pergi dan mulai refactoring seluruh basis kode Anda, ingatlah bahwa perbedaan yang kita bicarakan di sini (dalam semua kecuali versi kuno dari jQuery) menyamakan sekitar 3 milidetik per seribu elemen tambahan .Perbarui 2
Diperbarui untuk jQuery 1.7.2 dan menempatkan patokan
JSBen.ch
yang mungkin sedikit lebih ilmiah daripada tolok ukur primitif saya, ditambah lagi dapat crowdsourced sekarang!http://jsben.ch/#/ARUtz
sumber
$('div')
yang secara visual sangat mirip, tetapi secara fungsional terpisah.$(document.createElement('div'))
dan itu harus menjadi yang tercepat?Cukup dengan menyediakan elemen HTML yang ingin Anda tambahkan ke konstruktor jQuery
$()
akan mengembalikan objek jQuery dari HTML yang baru dibangun, cocok untuk ditambahkan ke DOM menggunakanappend()
metode jQuery .Sebagai contoh:
Anda bisa mengisi tabel ini secara terprogram, jika mau.
Ini memberi Anda kemampuan untuk menentukan sembarang HTML yang Anda suka, termasuk nama kelas atau atribut lainnya, yang mungkin Anda temukan lebih ringkas daripada menggunakan
createElement
dan kemudian menyetel atribut seperticellSpacing
danclassName
melalui JS.sumber
$(htmlStr)
diimplementasikan sebagaidocument.createElement("div").innerHTML = htmlStr
. Dengan kata lain, itu memanggil parser HTML browser. HTML yang rusak rusak secara berbeda di IE vs browser lain.get
fungsi yang mengembalikan elemen DOM asli. (Saya tahu topik ini sudah lama, tetapi saya menambahkannya untuk referensi. ;-))[dom element].appendChild($('<html>')[0]);
Membuat elemen DOM baru adalah fitur inti dari
jQuery()
metode ini, lihat:sumber
$('<a>')
tidak bisa diurungkan!Saya melakukan seperti itu:
sumber
karena
jQuery1.8
, menggunakan$.parseHTML()
untuk membuat elemen adalah pilihan yang lebih baik.ada dua manfaat:
1.Jika Anda menggunakan cara lama, yang mungkin seperti
$(string)
, jQuery akan memeriksa string untuk memastikan Anda ingin memilih tag html atau membuat elemen baru. Dengan menggunakan$.parseHTML()
, Anda memberi tahu jQuery bahwa Anda ingin membuat elemen baru secara eksplisit, sehingga kinerjanya mungkin sedikit lebih baik.2.Hal yang lebih penting adalah Anda mungkin menderita serangan lintas situs ( info lebih lanjut ) jika Anda menggunakan cara lama. jika Anda memiliki sesuatu seperti:
orang jahat bisa memberi masukan
<script src="xss-attach.js"></script>
untuk menggoda Anda. untungnya,$.parseHTML()
hindari rasa malu ini untuk Anda:Namun, harap perhatikan bahwa itu
a
adalah objek jQuery sementarab
merupakan elemen html:sumber
parseHTML
baik untuk html yang berasal dari sumber eksternal, tetapi bahwa " semua dorongan hilang setelah membungkus hasil dalam objek jQuery baru ". Artinya, jika Anda ingin membuat kode keras pembuatan elemen html baru yang dibungkus jQuery,$("<div>stuff</div>")
gaya tampaknya masih menang.MEMPERBARUI
Pada versi terbaru jQuery, metode berikut ini tidak menetapkan properti yang diteruskan di Objek kedua
Jawaban sebelumnya
Saya merasa menggunakan
document.createElement('div')
bersama denganjQuery
lebih cepat:sumber
Meskipun ini adalah pertanyaan yang sangat lama, saya pikir akan baik untuk memperbaruinya dengan informasi terbaru;
Sejak jQuery 1.8 ada fungsi jQuery.parseHTML () yang sekarang menjadi cara yang lebih disukai untuk membuat elemen. Juga, ada beberapa masalah dengan parsing HTML via
$('(html code goes here)')
, misalnya situs web jQuery resmi menyebutkan hal berikut di salah satu catatan rilis mereka :Untuk berhubungan dengan pertanyaan aktual, contoh yang diberikan dapat diterjemahkan ke:
yang sayangnya kurang nyaman daripada hanya menggunakan
$()
, tetapi itu memberi Anda lebih banyak kontrol, misalnya Anda dapat memilih untuk mengecualikan tag skrip (itu akan meninggalkan skrip inline sepertionclick
meskipun):Juga, inilah tolok ukur dari jawaban teratas yang disesuaikan dengan kenyataan baru:
Tautan JSbin
jQuery 1.9.1
Sepertinya
parseHTML
jauh lebih dekatcreateElement
daripada$()
, tetapi semua dorongan hilang setelah membungkus hasil dalam objek jQuery barusumber
sumber
Merupakan cara terpendek / termudah untuk membuat elemen DIV di jQuery.
sumber
Saya baru saja membuat plugin jQuery kecil untuk itu: https://github.com/ern0/jquery.create
Ini mengikuti sintaks Anda:
ID simpul DOM dapat ditentukan sebagai parameter kedua:
Apakah ini serius? Tidak. Tapi sintaks ini lebih baik dari $ ("<div> </div>") , dan itu adalah nilai yang sangat baik untuk uang itu.
Saya pengguna jQuery baru, beralih dari DOMAssistant, yang memiliki fungsi serupa: http://www.domassistant.com/documentation/DOMAssistantContent-module.php
Plugin saya lebih sederhana, saya pikir attrs dan konten lebih baik untuk ditambahkan dengan metode chaining:
Juga, ini adalah contoh yang baik untuk jQuery-plugin sederhana (yang ke-100).
sumber
Semuanya lurus ke depan! Berikut beberapa contoh cepat ...
sumber
Tidak disebutkan dalam jawaban sebelumnya, jadi saya menambahkan contoh kerja bagaimana membuat elemen elemen dengan jQuery terbaru, juga dengan atribut tambahan seperti konten, kelas, atau panggilan balik klik:
sumber
jQuery di luar kotak tidak memiliki yang setara dengan createElement. Bahkan sebagian besar pekerjaan jQuery dilakukan secara internal menggunakan innerHTML alih-alih manipulasi DOM murni. Seperti yang disebutkan Adam di atas, ini adalah bagaimana Anda dapat mencapai hasil yang serupa.
Ada juga plugin yang tersedia yang menggunakan DOM lebih dari innerHTML seperti appendDOM , DOMEC dan FlyDOM hanya untuk beberapa nama. Dari segi kinerja, jquery asli masih merupakan yang paling berkinerja (terutama karena menggunakan innerHTML)
sumber