Saya ingin tahu apa sebenarnya perbedaan antara querySelector
dan querySelectorAll
melawan getElementsByClassName
dan getElementById
?
Dari tautan ini saya dapat mengumpulkan bahwa dengan querySelector
saya dapat menulis document.querySelector(".myclass")
untuk mendapatkan elemen dengan kelas myclass
dan document.querySelector("#myid")
untuk mendapatkan elemen dengan ID myid
. Tapi saya sudah bisa melakukan itu getElementsByClassName
dan getElementById
. Yang mana yang lebih disukai?
Saya juga bekerja di XPages di mana ID dihasilkan secara dinamis dengan titik dua dan terlihat seperti ini view:_id1:inputText1
. Jadi ketika saya menulis document.querySelector("#view:_id1:inputText1")
itu tidak berhasil. Tetapi menulis document.getElementById("view:_id1:inputText1")
berhasil. Ada ide mengapa?
sumber
document.querySelectorAll(".myclass")
? Menggunakandocument.querySelector(".myclass")
hanya akan mengembalikan elemen pertama yang cocok.Jawaban:
Sintaks dan dukungan browser.
querySelector
lebih berguna ketika Anda ingin menggunakan penyeleksi yang lebih kompleks.mis. Semua item daftar diturunkan dari elemen yang merupakan anggota kelas foo:
.foo li
The
:
karakter memiliki arti khusus dalam pemilih. Anda harus menghindarinya. (Karakter pemilih melarikan diri memiliki arti khusus dalam string JS juga, jadi Anda harus melarikan diri itu juga).sumber
getElementById
dangetElementsByClassName
. Pilihan className bisa menjadi beberapa ratus kali lebih lambat tanpagetElementsByClassName
.mengumpulkan dari Dokumentasi Mozilla:
Antarmuka NodeSelector Spesifikasi ini menambahkan dua metode baru ke objek yang mengimplementasikan antarmuka Dokumen, DocumentFragment, atau Elemen:
kueriSelektor
querySelectorAll
dan
sumber
Tentang perbedaan, ada yang penting dalam hasil antara
querySelectorAll
dangetElementsByClassName
: nilai kembali berbeda.querySelectorAll
akan mengembalikan koleksi statis, sementaragetElementsByClassName
mengembalikan koleksi langsung. Ini dapat menyebabkan kebingungan jika Anda menyimpan hasil dalam variabel untuk digunakan nanti:querySelectorAll
akan berisi elemen yang memenuhi pemilih pada saat metode dipanggil .getElementsByClassName
akan berisi elemen-elemen yang memenuhi pemilih ketika digunakan (yang mungkin berbeda dari saat metode dipanggil).Sebagai contoh, perhatikan bagaimana bahkan jika Anda belum menetapkan ulang variabel
aux1
danaux2
, mereka mengandung nilai yang berbeda setelah memperbarui kelas:sumber
document.getElementsByName
,document.getElementsByTagNameNS
ataudocument.getElementsByTagName
akan menunjukkan perilaku yang sama.document.getElementById()
tidak mengembalikan simpul hidup. Ini lebih cepat daripadadocument.querySelector('#id_here')
mungkin karenaquerySelector
harus mengurai pemilih CSS terlebih dahulu.Untuk jawaban ini, saya lihat
querySelector
danquerySelectorAll
sebagai querySelector * dangetElementById
,getElementsByClassName
,getElementsByTagName
, dangetElementsByName
sebagai getElement *.Perbedaan utama
querySelector
dangetElementById
keduanya mengembalikan elemen tunggal.querySelectorAll
dangetElementsByName
keduanya mengembalikan NodeLists, menjadi fungsi yang lebih baru yang ditambahkan setelah HTMLCollection keluar dari mode. Yang lebih tuagetElementsByClassName
dangetElementsByTagName
keduanya mengembalikan HTMLCollections. Sekali lagi, ini pada dasarnya tidak relevan dengan apakah unsur-unsurnya hidup atau statis.Konsep-konsep ini dirangkum dalam tabel berikut.
Detail, Tip, dan Contoh
HTMLCollections tidak seperti array seperti NodeLists dan tidak mendukung .forEach (). Saya menemukan operator spread berguna untuk mengatasi ini:
[...document.getElementsByClassName("someClass")].forEach()
Setiap elemen, dan global
document
, memiliki akses ke semua fungsi ini kecuali untukgetElementById
dangetElementsByName
, yang hanya diimplementasikan padadocument
.Memanggil panggilan getElement * alih-alih menggunakan querySelector * akan meningkatkan kinerja, terutama pada DOM yang sangat besar. Bahkan pada DOM kecil dan / atau dengan rantai yang sangat panjang, umumnya lebih cepat. Namun, kecuali Anda tahu Anda membutuhkan kinerja, keterbacaan kueriSelektor * harus lebih disukai.
querySelectorAll
seringkali lebih sulit untuk ditulis ulang, karena Anda harus memilih elemen dari NodeList atau HTMLCollection di setiap langkah. Misalnya, kode berikut ini tidak berfungsi:document.getElementsByClassName("someClass").getElementsByTagName("div")
document.getElementById("someId").getElementsByClassName("someClass")[0].getElementsByTagName("div")[0]
Karena semua elemen memiliki akses ke panggilan querySelector * dan getElement *, Anda dapat membuat rantai menggunakan kedua panggilan, yang dapat berguna jika Anda menginginkan beberapa peningkatan kinerja, tetapi tidak dapat menghindari querySelector yang tidak dapat ditulis dalam hal panggilan getElement * .
Meskipun umumnya mudah untuk mengetahui apakah pemilih dapat ditulis hanya menggunakan panggilan getElement *, ada satu kasus yang mungkin tidak jelas:
document.querySelectorAll(".class1.class2")
dapat ditulis ulang sebagai
document.getElementsByClassName("class1 class2")
Menggunakan getElement * pada elemen statis yang diambil dengan querySelector * akan menghasilkan elemen yang hidup sehubungan dengan subset statis DOM yang disalin oleh querySelector, tetapi tidak hidup sehubungan dengan dokumen lengkap DOM ... ini adalah tempat sederhana interpretasi langsung / statis elemen mulai berantakan. Anda mungkin harus menghindari situasi di mana Anda harus khawatir tentang hal ini, tetapi jika Anda melakukannya, ingat bahwa querySelector * memanggil elemen copy yang mereka temukan sebelum mengembalikan referensi kepada mereka, tetapi panggilan getElement * mengambil referensi langsung tanpa menyalin.
Baik API menentukan elemen mana yang harus dipilih terlebih dahulu jika ada beberapa kecocokan.
Karena querySelector * berulang melalui DOM sampai menemukan kecocokan (lihat Perbedaan Utama # 2), hal di atas juga menyiratkan bahwa Anda tidak dapat mengandalkan posisi elemen yang Anda cari di DOM untuk memastikan bahwa itu ditemukan dengan cepat - the browser dapat beralih melalui DOM mundur, maju, mendalam pertama, luasnya pertama, atau sebaliknya. getElement * masih akan menemukan elemen dalam jumlah waktu yang kira-kira sama terlepas dari penempatannya.
sumber
Saya datang ke halaman ini murni untuk mengetahui metode yang lebih baik untuk digunakan dalam hal kinerja - yaitu yang lebih cepat:
dan saya menemukan ini: https://jsperf.com/getelementsbyclassname-vs-queryselectorall/18
Ini menjalankan tes pada 2 x contoh di atas, ditambah chuck dalam tes untuk pemilih setara jQuery juga. hasil tes saya adalah sebagai berikut:
sumber
querySelectorAll
membutuhkan kerja tambahan di belakang layar (termasuk parsing ekspresi pemilih, akuntansi untuk elemen semu, dll.), SementaragetElementsByClassName
itu hanyalah objek traversal rekursif.querySelector
bisa berupa CSS lengkap (3) -Pilih dengan ID dan Kelas dan Pseudo-Kelas bersama-sama seperti ini:dengan
getElementByClassName
Anda bisa mendefinisikan kelasdengan
getElementById
Anda bisa mendefinisikan idsumber
:first
pemilih CSS, sekarang?:first-class
, atau:first-of-type
mungkin, tapi saya pikir:first
itu penambahan JavaScript / jQuery / Sizzle.:first
, jelas, tidak:first-child
.querySelector
danquerySelectorAll
merupakan API yang relatif baru, sedangkangetElementById
dangetElementsByClassName
telah bersama kami lebih lama. Itu berarti bahwa apa yang Anda gunakan sebagian besar akan bergantung pada browser yang Anda perlukan.Adapun
:
, itu memiliki makna khusus sehingga Anda harus menghindarinya jika Anda harus menggunakannya sebagai bagian dari ID / nama kelas.sumber
querySelectorAll
tersedia di IE8, sedangkangetElementsByClassName
tidak.querySelectorAll
... pada dasarnya semua: caniuse.com/#search=querySelectorAllquerySelector
adalah dari w3c Selector APIgetElementBy
adalah dari w3c DOM APIIMO perbedaan yang paling menonjol adalah bahwa tipe kembalinya
querySelectorAll
adalah daftar simpul statis dan untukgetElementsBy
itu adalah daftar simpul langsung. Karena itu perulangan di demo 2 tidak pernah berakhir karenalis
live dan memperbarui sendiri selama setiap iterasi.sumber
Perbedaan antara "querySelector" dan "querySelectorAll"
sumber
Lihat ini
getElementById tercepat dari querySelector pada 25%
jquery paling lambat
sumber
Perbedaan utama antara querySelector dan getlementbyID (Claassname, Tagname dll) adalah jika ada lebih dari satu elemen yang memuaskan kondisi querySelector akan mengembalikan hanya satu output sedangkan getElementBy * akan mengembalikan semua elemen.
Mari kita pertimbangkan contoh untuk membuatnya lebih jelas.
Kode di bawah ini akan menjelaskan perbedaannya
Inshort jika kita ingin memilih elemen tunggal untuk queryslector atau jika kita ingin banyak elemen, getElement
sumber