Itu mengganggu saya yang tidak bisa saya lakukan document.querySelectorAll(...).map(...)
bahkan di Firefox 3.6, dan saya masih tidak dapat menemukan jawaban, jadi saya pikir saya akan posting silang di SO pertanyaan dari blog ini:
http://blowery.org/2008/08/29/yay-for-queryselectorall-boo-for-staticnodelist/
Adakah yang tahu tentang alasan teknis mengapa Anda tidak mendapatkan Array? Atau mengapa StaticNodeList tidak mewarisi dari Array dengan cara seperti yang dapat Anda gunakan map
, concat
, etc?
(BTW jika itu hanya satu fungsi yang Anda inginkan, Anda dapat melakukan sesuatu seperti NodeList.prototype.map = Array.prototype.map;
... tetapi sekali lagi, mengapa fungsi ini (sengaja?) Diblokir sejak awal?)
Jawaban:
Saya yakin ini adalah keputusan filosofis W3C. Desain [spesifikasi] W3C DOM cukup ortogonal dengan desain JavaScript, karena DOM dimaksudkan untuk menjadi platform dan bahasa yang netral.
Keputusan seperti "
getElementsByFoo()
mengembalikan urutanNodeList
" atau "querySelectorAll()
mengembalikanStaticNodeList
" sangat disengaja, sehingga implementasi tidak perlu khawatir tentang menyelaraskan struktur data yang dikembalikan berdasarkan implementasi yang bergantung pada bahasa (seperti.map
tersedia di Array di JavaScript dan Ruby, tetapi tidak ada dalam Daftar di C #).W3C Tujuan rendah: mereka akan mengatakan
NodeList
harus berisi readonly.length
properti jenis unsigned panjang karena mereka percaya setiap pelaksanaan kaleng setidaknya dukungan yang , tetapi mereka tidak akan mengatakan secara eksplisit bahwa[]
Operator indeks harus kelebihan beban untuk mendukung mendapatkan elemen posisi, karena mereka tidak ingin menghalangi beberapa bahasa kecil yang buruk yang ingin diterapkangetElementsByFoo()
tetapi tidak dapat mendukung kelebihan beban operator. Ini adalah filosofi umum yang ada di sebagian besar spesifikasi.John Resig telah menyuarakan opsi yang sama seperti milik Anda, yang dia tambahkan :
Saya agak berempati. Jika DOM ditulis secara khusus dengan mempertimbangkan fitur JavaScript, itu akan menjadi jauh lebih tidak canggung dan lebih intuitif untuk digunakan. Pada saat yang sama, saya memahami keputusan desain W3C.
sumber
StaticNodeList
ke sebuah array. Saya akan mendukung jawaban @ mck89 sebagai cara untuk mengubah aNodeList
/StaticNodeList
ke Array asli, tetapi itu akan gagal di IE (8 obv) dengan kesalahan JScript, karena objek tersebut di-host / "khusus".document
,window
dll. IE sering mengimplementasikan "khusus" ini (misalnya sebagai objek COM) yang terkadang tidak sesuai dengan penggunaan normal, dengan cara yang kecil dan halus, sepertiArray.prototype.slice.call
membom ketika diberiStaticNodeList
;)Anda dapat menggunakan operator penyebaran ES2015 (ES6) :
[...document.querySelectorAll('div')]
akan mengubah StaticNodeList menjadi Array of items.
Berikut ini contoh cara menggunakannya.
sumber
Array.from(document.querySelectorAll('div')).map(x => console.log(x.innerHTML))
Saya tidak tahu mengapa ini mengembalikan daftar node daripada array, mungkin karena seperti getElementsByTagName itu akan memperbarui hasil ketika Anda memperbarui DOM. Bagaimanapun, metode yang sangat sederhana untuk mengubah hasil itu menjadi array sederhana adalah:
dan kemudian Anda dapat melakukan:
sumber
slice
garis sekalipun.Hanya untuk menambah apa yang dikatakan Crescent,
Jangan lakukan ini! Sama sekali tidak dijamin berhasil.
Tidak ada standar JavaScript atau DOM / BOM yang menentukan bahwa fungsi
NodeList
konstruktor bahkan ada sebagai global /window
properti, atau yangNodeList
dikembalikan olehquerySelectorAll
akan mewarisi darinya, atau bahwa prototipe-nya dapat ditulis, atau bahwa fungsiArray.prototype.map
tersebut benar-benar akan berfungsi pada NodeList.NodeList diizinkan untuk menjadi 'objek host' (dan merupakan salah satunya, di IE dan beberapa browser lama). The
Array
metode didefinisikan sebagai diizinkan untuk beroperasi pada 'objek asli' setiap JavaScript yang mengekspos numerik danlength
properti, tapi mereka tidak diharuskan untuk bekerja pada objek host (dan di IE, mereka tidak).Sangat menjengkelkan karena Anda tidak mendapatkan semua metode array pada daftar DOM (semuanya, bukan hanya StaticNodeList), tetapi tidak ada cara yang dapat diandalkan untuk memutarnya. Anda harus mengonversi setiap daftar DOM yang Anda dapatkan kembali ke Array secara manual:
sumber
new Array(n)
hanya memberi JS terp petunjuk tentang berapa lama array akan berakhir. Itu bisa memungkinkannya untuk mengalokasikan jumlah ruang itu sebelumnya, yang berpotensi menghasilkan percepatan karena beberapa realokasi memori dapat dihindari saat array bertambah. Saya tidak tahu apakah itu benar-benar membantu di peramban modern ... Saya kira tidak dapat diukur.Saya pikir Anda cukup mengikuti
Ini bekerja sempurna untuk saya
sumber
Ini adalah opsi yang ingin saya tambahkan ke berbagai kemungkinan lain yang disarankan oleh orang lain di sini. Ini dimaksudkan untuk kesenangan intelektual saja dan tidak disarankan .
Hanya untuk iseng , berikut cara untuk "memaksa"
querySelectorAll
berlutut dan membungkuk kepada Anda:Sekarang rasanya menyenangkan untuk melangkah ke seluruh fungsi itu, menunjukkan siapa bosnya. Sekarang saya tidak tahu apa yang lebih baik, membuat pembungkus fungsi bernama baru dan kemudian meminta semua kode Anda menggunakan nama aneh itu (cukup banyak gaya jQuery) atau menimpa fungsi seperti di atas sekali sehingga sisa kode Anda masih bisa untuk menggunakan nama metode DOM asli
querySelectorAll
.sumber