Saya perhatikan saat memantau / mencoba menjawab pertanyaan jQuery umum, bahwa ada praktik tertentu menggunakan javascript, alih-alih jQuery, yang sebenarnya memungkinkan Anda untuk menulis lebih sedikit dan melakukan ... dengan jumlah yang sama. Dan mungkin juga menghasilkan manfaat kinerja.
Contoh spesifik
$(this)
vs. this
Di dalam acara klik referensi id objek yang diklik
jQuery
$(this).attr("id");
Javascript
this.id;
Apakah ada praktik umum lainnya seperti ini? Di mana operasi Javascript tertentu dapat dilakukan dengan lebih mudah, tanpa membawa jQuery ke dalam campuran. Atau ini kasus yang jarang terjadi? (dari "pintasan" jQuery sebenarnya membutuhkan lebih banyak kode)
EDIT: Sementara saya menghargai jawaban mengenai jQuery vs kinerja javascript biasa, saya sebenarnya mencari lebih banyak jawaban kuantitatif. Saat menggunakan jQuery , contoh di mana orang benar-benar akan lebih baik (keterbacaan / kekompakan) untuk menggunakan javascript biasa daripada menggunakan $()
. Selain contoh yang saya berikan dalam pertanyaan asli saya.
sumber
this.id
?Jawaban:
this.id
(seperti yang Anda ketahui)this.value
(pada sebagian besar tipe input. Hanya masalah yang saya tahu adalah IE ketika a<select>
tidak memilikivalue
properti yang ditetapkan pada<option>
elemen - elemennya, atau input radio di Safari.)this.className
untuk mendapatkan atau mengatur seluruh properti "kelas"this.selectedIndex
terhadap a<select>
untuk mendapatkan indeks yang dipilihthis.options
terhadap a<select>
untuk mendapatkan daftar<option>
elementhis.text
menentang<option>
untuk mendapatkan konten teksnyathis.rows
melawan a<table>
untuk mendapatkan koleksi<tr>
elementhis.cells
terhadap a<tr>
untuk mendapatkan selnya (td & th)this.parentNode
untuk mendapatkan orang tua langsungthis.checked
untuk mendapatkan status cek daricheckbox
Terimakasih @Tim Bawahthis.selected
untuk mendapatkan status terpilih darioption
Terimakasih @Tim Bawahthis.disabled
untuk mendapatkan status nonaktif dariinput
Terimakasih @Timthis.readOnly
untuk mendapatkan status readOnly dariinput
Thanks @Tim Downthis.href
terhadap<a>
elemen untuk mendapatkan nyahref
this.hostname
terhadap suatu<a>
elemen untuk mendapatkan domain-nyahref
this.pathname
terhadap<a>
elemen untuk mendapatkan path-nyahref
this.search
terhadap<a>
elemen untuk mendapatkan querystring-nyahref
this.src
terhadap elemen yang sah untuk memiliki asrc
... Saya pikir Anda mendapatkan ide.
Akan ada saat-saat ketika kinerja sangat penting. Seperti jika Anda melakukan sesuatu berulang kali, Anda mungkin ingin membuang jQuery.
Secara umum Anda dapat mengganti:dengan:Kata di atas buruk.
getAttribute
bukan pengganti, tetapi mengambil nilai atribut yang dikirim dari server, dan yang sesuaisetAttribute
akan mengaturnya. Diperlukan dalam beberapa kasus.Kalimat di bawah ini semacam menutupinya. Lihat jawaban ini untuk perawatan yang lebih baik.
... untuk mengakses atribut secara langsung. Perhatikan bahwa atribut tidak sama dengan properti (meskipun terkadang saling mencerminkan satu sama lain). Tentu saja ada
setAttribute
juga.Katakanlah Anda memiliki situasi ketika menerima halaman di mana Anda perlu membuka semua tag dari jenis tertentu. Ini singkat dan mudah dengan jQuery:
Tetapi jika ada banyak, Anda mungkin ingin melakukan sedikit API DOM asli:
Kode ini cukup singkat, performanya lebih baik daripada versi jQuery, dan dapat dengan mudah dijadikan fungsi yang dapat digunakan kembali di perpustakaan pribadi Anda.
Mungkin kelihatannya saya memiliki loop tak terhingga dengan terluar
while
karenawhile(spans[0])
, tetapi karena kita sedang berhadapan dengan "daftar hidup" itu akan diperbarui ketika kita melakukanparent.removeChild(span[0]);
. Ini adalah fitur yang sangat bagus yang kami lewatkan ketika bekerja dengan Array (atau objek seperti Array) sebagai gantinya.sumber
this.value
mana ada beberapa kebiasaan browser yang aneh dalam kasus tertentu. Itu semua tergantung kebutuhan Anda. Ada banyak teknik bagus yang mudah tanpa jQuery, terutama ketika kinerja sangat penting. Saya akan mencoba memikirkan lebih banyak.attr()
terlalu banyak digunakan. Jika Anda hanya berurusan dengan satu elemen maka Anda jarang membutuhkannyaattr()
. Dua favorit saya adalah kebingungan di sekitarchecked
properti kotak centang (segala macam mantra mistis sekitar satu bahwa:$(this).attr("checked", "checked")
,$(this).is(":checked")
dll) dan juga yangselected
milik<option>
elemen.getAttribute()
. Anda hampir tidak pernah membutuhkannya : itu rusak di IE, tidak selalu mencerminkan keadaan saat ini dan itu bukan apa yang jQuery lakukan. Cukup gunakan properti. stackoverflow.com/questions/4456231/…Jawaban yang benar adalah Anda akan selalu menerima penalti performa saat menggunakan jQuery alih-alih JavaScript asli 'polos lama'. Itu karena jQuery adalah Perpustakaan JavaScript. Ini bukan versi JavaScript baru yang mewah.
Alasan jQuery sangat kuat adalah karena ia membuat beberapa hal yang terlalu membosankan dalam situasi lintas-browser (AJAX adalah salah satu contoh terbaik) dan memperhalus ketidakkonsistenan antara berbagai browser yang tersedia dan menyediakan API yang konsisten. Ini juga dengan mudah memfasilitasi konsep-konsep seperti rantai, pengulangan tersirat, dll, untuk menyederhanakan bekerja pada kelompok elemen bersama-sama.
Belajar jQuery bukan pengganti untuk belajar JavaScript. Anda harus memiliki dasar yang kuat dalam yang terakhir sehingga Anda sepenuhnya menghargai apa yang mengetahui mantan membuat lebih mudah bagi Anda.
- Diedit untuk mencakup komentar -
Karena komentar cepat untuk menunjukkan (dan saya setuju dengan 100%) pernyataan di atas merujuk pada kode pembandingan. Solusi JavaScript 'asli' (dengan asumsi itu ditulis dengan baik) akan mengungguli solusi jQuery yang mencapai hal yang sama di hampir setiap kasus (saya ingin melihat contoh lain). jQuery mempercepat waktu pengembangan, yang merupakan manfaat signifikan yang saya tidak bermaksud mengecilkan. Ini memfasilitasi mudah dibaca, mudah untuk mengikuti kode, yang lebih dari beberapa pengembang mampu membuat sendiri.
Menurut pendapat saya, jawabannya tergantung pada apa yang ingin Anda capai. Jika, seperti yang saya duga berdasarkan referensi Anda untuk manfaat kinerja, Anda mengejar kecepatan terbaik dari aplikasi Anda, kemudian menggunakan jQuery memperkenalkan overhead setiap kali Anda menelepon
$()
. Jika Anda ingin keterbacaan, konsistensi, kompatibilitas lintas browser, dll, maka pasti ada alasan untuk memilih jQuery daripada JavaScript 'asli'.sumber
$()
. Jika Anda tidak melakukan panggilan itu, Anda menghemat waktu.Ada kerangka yang disebut ... oh coba tebak?
Vanilla JS
. Semoga Anda mendapatkan lelucon ...: D Ini mengorbankan keterbacaan kode untuk kinerja ... Membandingkannya dengan yang dijQuery
bawah ini Anda dapat melihat bahwa mengambilDOM
elemen hinggaID
hampir 35X lebih cepat. :)Jadi, jika Anda menginginkan kinerja, Anda sebaiknya mencoba Vanilla JS dan menarik kesimpulan sendiri. Mungkin Anda tidak akan mengalami JavaScript menggantung GUI peramban / mengunci utas UI selama kode intensif seperti di dalam
for
loop.Di beranda mereka ada beberapa perbandingan perf:
sumber
Sudah ada jawaban yang diterima tetapi saya yakin tidak ada jawaban yang diketik langsung di sini yang bisa komprehensif dalam daftar metode / atribut javascript asli yang secara praktis menjamin dukungan lintas-browser. Untuk itu saya dapat mengarahkan Anda ke quirksmode:
http://www.quirksmode.org/compatibility.html
Mungkin ini adalah daftar yang paling komprehensif tentang apa yang berfungsi dan apa yang tidak berfungsi pada browser apa saja di mana saja. Berikan perhatian khusus pada bagian DOM. Banyak membaca tetapi intinya bukan untuk membaca semuanya tetapi menggunakannya sebagai referensi.
Ketika saya mulai serius menulis aplikasi web, saya mencetak semua tabel DOM dan menggantungnya di dinding sehingga saya tahu sekilas apa yang aman untuk digunakan dan apa yang membutuhkan peretasan. Hari ini saya hanya google sesuatu seperti
quirksmode parentNode compatibility
ketika saya ragu.Seperti hal lainnya, penilaian sebagian besar adalah masalah pengalaman. Saya tidak akan benar-benar merekomendasikan Anda untuk membaca seluruh situs dan menghafal semua masalah untuk mencari tahu kapan harus menggunakan jQuery dan kapan harus menggunakan JS biasa. Sadarilah daftar itu. Cukup mudah untuk mencari. Seiring waktu, Anda akan mengembangkan naluri kapan JS biasa lebih disukai.
PS: PPK (penulis situs) juga memiliki buku yang sangat bagus yang saya rekomendasikan untuk dibaca
sumber
Kapan:
gunakan JavaScript. Kalau tidak, gunakan jQuery (jika Anda bisa).
Sunting : Jawaban ini berlaku baik ketika memilih untuk menggunakan jQuery secara keseluruhan dibandingkan meninggalkannya, serta memilih apakah akan menggunakan vanilla JS di dalam jQuery. Memilih antara
attr('id')
dan.id
bersandar mendukung JS, sementara memilih antararemoveClass('foo')
versus.className = .className.replace( new Regexp("(?:^|\\s+)"+foo+"(?:\\s+|$)",'g'), '' )
bersandar mendukung jQuery.sumber
.classList.remove('foo')
tampaknya berfungsi dengan baik di browser yang lebih baruJawaban orang lain terfokus pada pertanyaan luas "jQuery vs. plain JS." Menilai dari OP Anda, saya pikir Anda hanya bertanya-tanya kapan lebih baik menggunakan vanilla JS jika Anda sudah memilih untuk menggunakan jQuery. Contoh Anda adalah contoh sempurna kapan Anda harus menggunakan vanilla JS:
$(this).attr('id');
Apakah lebih lambat dan (menurut saya) kurang dapat dibaca daripada:
this.id
.Ini lebih lambat karena Anda harus memutar objek JS baru hanya untuk mengambil atribut dengan cara jQuery. Sekarang, jika Anda akan menggunakan
$(this)
untuk melakukan operasi lain, maka tentu saja, simpan objek jQuery dalam variabel dan beroperasi dengan itu. Namun, saya mengalami banyak situasi di mana saya hanya perlu atribut dari elemen (sukaid
atausrc
).Saya pikir kasus yang paling umum adalah yang Anda gambarkan dalam posting Anda; orang-orang yang membungkus
$(this)
objek jQuery tidak perlu. Saya paling sering melihat ini denganid
danvalue
(sebagai gantinya menggunakan$(this).val()
).Edit: Ini artikel yang menjelaskan mengapa menggunakan jQuery dalam
attr()
kasus ini lebih lambat. Pengakuan: mencurinya dari tag wiki, tapi saya pikir perlu disebutkan untuk pertanyaannya.Sunting lagi: Mengingat implikasi keterbacaan / kinerja dari hanya mengakses atribut secara langsung, saya akan mengatakan aturan praktis yang baik adalah mungkin mencoba untuk menggunakan
this.<attributename>
jika memungkinkan. Mungkin ada beberapa contoh di mana ini tidak akan berhasil karena inkonsistensi peramban, tetapi mungkin lebih baik untuk mencoba ini terlebih dahulu dan kembali ke jQuery jika tidak berfungsi.sumber
this.style.display = 'none'
. Apakah itu lebih baik daripada$(this).hide()
? Saya berpendapat bahwa yang terakhir lebih mudah dibaca, tetapi yang pertama cenderung lebih cepat. Tidak ada salahnya untuk melakukan percobaan sendiri untuk melihat apakah tindakan tertentu akan bekerja di browser tanpa jQuery - Ini biasanya apa yang saya lakukan sebelum membungkus elemen dalam objek jQuery untuk melakukan operasi.Jika Anda lebih mementingkan kinerja, contoh utama Anda mengenai kuku di kepala. Meminta jQuery secara tidak perlu atau berlebihan adalah, IMHO, penyebab utama kedua dari kinerja yang lambat (yang pertama adalah traversal DOM yang buruk).
Ini bukan benar-benar sebuah contoh dari apa yang Anda cari, tetapi saya melihat ini begitu sering bahwa beruang menyebutkan: Salah satu cara terbaik untuk mempercepat kinerja dari script jQuery Anda ke cache jQuery objek, dan / atau menggunakan chaining:
sumber
var something
, saya tidak benar-benar perlu men-cache objek jQuery (karena saya menggunakan chaining), tapi saya tetap melakukannya karena kebiasaan.$('.something')
dua kali berarti jQuery harus melintasi DOM dua kali untuk mencari semua elemen dengan pemilih itu.$(this)
mengurangi panggilan ke fungsi jQuery. Ini akan memberi Anda keuntungan terbesar dalam skenario loop.element
sama dengan$(this)
. Itu tidak mengandung banyak elemen.Saya menemukan ada tumpang tindih antara JS dan JQ. Kode yang Anda tunjukkan adalah contoh yang bagus untuk itu. Terus terang, alasan terbaik untuk menggunakan JQ over JS hanyalah kompatibilitas browser. Saya selalu condong ke JQ, bahkan jika saya bisa mencapai sesuatu di JS.
sumber
Ini adalah pandangan pribadi saya, tetapi karena jQuery adalah JavaScript, saya pikir secara teoritis tidak dapat melakukan lebih baik daripada vanilla JS.
Tetapi secara praktis ini mungkin berkinerja lebih baik daripada JS tulisan tangan, karena kode tulisan tangan seseorang mungkin tidak seefisien jQuery.
Intinya - untuk hal-hal kecil saya cenderung menggunakan vanilla JS, untuk proyek intensif JS Saya suka menggunakan jQuery dan tidak menemukan kembali roda - ini juga lebih produktif.
sumber
Daftar properti langsung jawaban pertama dari
this
sebagai elemen DOM cukup lengkap.Anda mungkin juga tertarik untuk mengenal beberapa orang lain.
Saat ini adalah dokumen:
this.forms
untuk mendapatkanHTMLCollection
formulir dokumen saat ini,this.anchors
untuk mendapatkanHTMLCollection
semuaHTMLAnchorElements
denganname
yang ditetapkan,this.links
untuk mendapatkanHTMLCollection
semuaHTMLAnchorElement
s denganhref
menjadi set,this.images
untuk mendapatkanHTMLCollection
semua dariHTMLImageElement
ituthis.applets
Ketika Anda bekerja dengan
document.forms
,document.forms[formNameOrId]
dapatkan formulir yang dinamai atau diidentifikasi.Saat ini formulir:
this[inputNameOrId]
untuk mendapatkan bidang yang dinamai atau diidentifikasiSaat ini adalah bidang formulir:
this.type
untuk mendapatkan jenis bidangSaat mempelajari penyeleksi jQuery, kita sering melewatkan pembelajaran properti elemen HTML yang sudah ada, yang sangat cepat diakses.
sumber
document.embeds
dandocument.plugins
juga didukung secara luas (DOM 0).document.scripts
juga merupakan koleksi yang mudah digunakan, didefinisikan dalam spesifikasi HTML5 , dan didukung secara luas (dan Firefox 9+ ).Seperti biasa aku datang terlambat ke pesta ini.
Bukan fungsionalitas tambahan yang membuat saya memutuskan untuk menggunakan jQuery, semenarik itu. Setelah semua tidak ada yang menghentikan Anda dari menulis fungsi Anda sendiri.
Itu adalah fakta bahwa ada begitu banyak trik untuk dipelajari ketika memodifikasi DOM untuk menghindari kebocoran memori (saya berbicara tentang Anda yaitu IE). Untuk memiliki satu sumber daya pusat yang mengelola semua masalah semacam itu untuk saya, ditulis oleh orang-orang yang jauh lebih baik daripada JS coders daripada yang pernah saya miliki, yang terus ditinjau, direvisi, dan diuji adalah tuhan kirim.
Saya kira ini semacam jatuh di bawah dukungan / abstraksi argumen lintas browser.
Dan tentu saja jQuery tidak menghalangi penggunaan JS lurus saat Anda membutuhkannya. Saya selalu merasa keduanya tampak bekerja bersama dengan mulus.
Tentu saja jika browser Anda tidak didukung oleh jQuery atau Anda mendukung lingkungan low-end (ponsel yang lebih lama?) Maka file .js yang besar mungkin menjadi masalah. Ingat ketika jQuery dulu kecil?
Tetapi biasanya perbedaan kinerja bukan masalah yang memprihatinkan. Itu hanya harus cukup cepat. Dengan siklus CPU Gigahertz yang akan terbuang setiap detik, saya lebih peduli dengan kinerja coders saya, satu-satunya sumber daya pengembangan yang tidak berlipat ganda daya setiap 18 bulan.
Yang mengatakan saya sedang mencari masalah aksesibilitas dan tampaknya .innerHTML sedikit tidak, tidak dengan itu. jQuery tentu saja tergantung pada .innerHTML, jadi sekarang saya sedang mencari kerangka kerja yang akan tergantung pada metode yang agak membosankan yang diizinkan. Dan saya bisa membayangkan kerangka kerja seperti itu akan berjalan lebih lambat daripada jQuery, tetapi selama kinerjanya cukup baik, saya akan senang.
sumber
Ini jawaban non-teknis - banyak pekerjaan mungkin tidak mengizinkan perpustakaan tertentu, seperti jQuery.
Faktanya, Faktanya, Google tidak mengizinkan jQuery dalam salah satu kodenya (atau Bereaksi, karena itu milik Facebook), yang mungkin belum Anda ketahui sampai pewawancara berkata, "Maaf, tapi Anda tidak bisa menggunakan jQuery, itu tidak ada di daftar yang disetujui di XYZ Corporation ". JavaScript Vanilla benar-benar berfungsi di mana-mana, setiap saat, dan tidak akan pernah memberi Anda masalah ini. Jika Anda mengandalkan perpustakaan ya Anda mendapatkan kecepatan dan kemudahan, tetapi Anda kehilangan universalitas.
Juga, berbicara tentang wawancara, kelemahan lainnya adalah bahwa jika Anda mengatakan Anda perlu menggunakan perpustakaan untuk menyelesaikan masalah JavaScript selama kuis kode, itu muncul seolah-olah Anda tidak benar-benar memahami masalah, yang terlihat agak buruk. Sedangkan jika Anda menyelesaikannya dalam JavaScript vanilla mentah itu menunjukkan bahwa Anda benar-benar mengerti dan dapat menyelesaikan setiap bagian dari masalah apa pun yang mereka lempar di depan Anda.
sumber
$(this)
berbeda denganthis
:Dengan menggunakan
$(this)
Anda memastikan prototipe jQuery sedang diteruskan ke objek.sumber