Saya memiliki beberapa fungsi seperti jquery:
function(elem) {
return $('> someselector', elem);
};
Pertanyaannya adalah bagaimana saya bisa melakukan hal yang sama querySelector()
?
Masalahnya adalah >
selector in querySelector()
membutuhkan induk untuk ditentukan secara eksplisit. Apakah ada solusi lain?
javascript
css-selectors
selectors-api
disfated
sumber
sumber
Jawaban:
Meskipun ini bukan jawaban lengkap, Anda harus tetap memperhatikan W3C Selector API v.2 yang sudah tersedia di sebagian besar browser, baik desktop maupun seluler, kecuali IE (Edge tampaknya mendukung): lihat daftar dukungan lengkap .
sumber
:scope
masih ditentukan di drafts.csswg.org/selectors-4/#the-scope-pseudo . Sejauh ini hanya<style scoped>
atribut yang dihapus; tidak jelas apakah itu juga akan menyebabkan:scope
penghapusan (karena<style scoped>
merupakan kasus penggunaan penting untuk:scope
).Tidak boleh. Tidak ada pemilih yang akan mensimulasikan titik awal Anda.
Cara jQuery melakukannya (lebih karena cara
qsa
berperilaku yang tidak sesuai dengan keinginan mereka), adalah mereka memeriksa untuk melihat apakahelem
memiliki ID, dan jika tidak, mereka menambahkan ID sementara, lalu membuat string pemilih lengkap.Pada dasarnya Anda akan melakukan:
Ini tentu saja bukan kode jQuery, tetapi dari apa yang saya ingat, pada dasarnya itulah yang mereka lakukan. Tidak hanya dalam situasi ini, tetapi dalam situasi apa pun di mana Anda menjalankan pemilih dari konteks elemen bertingkat.
Kode sumber untuk Sizzle
sumber
Lengkap: ruang lingkup polyfill
Seperti avetisk telah disebutkan Penyeleksi API 2 menggunakan
:scope
semu-pemilih.Untuk membuat ini berfungsi di semua browser (yang mendukung
querySelector
), inilah polyfillPemakaian
Untuk alasan historis, solusi saya sebelumnya
Berdasarkan semua jawaban
Pemakaian
sumber
Date.now()
tidak didukung oleh browser lama, dan dapat diganti dengannew Date().getTime()
Jika Anda ingin menemukan turunan langsung (dan bukan misalnya
> div > span
), Anda dapat mencoba Element.matches () :sumber
Jika Anda mengetahui nama tag dari elemen yang Anda cari, Anda dapat menggunakannya di selektor untuk mendapatkan apa yang Anda inginkan.
Misalnya jika Anda memiliki a
<select>
yang memiliki<option>
s dan<optgroups>
, dan Anda hanya menginginkan<option>
s yang merupakan anak langsungnya, bukan yang di dalamnya<optgoups>
:Jadi, dengan memiliki referensi ke elemen select, Anda bisa - secara mengejutkan - mendapatkan turunan langsungnya seperti ini:
Tampaknya berfungsi di Chrome, Safari, dan Firefox, tetapi tidak menguji di IE. = /
sumber
<ul id="start"> <li>A</li> <li> <ul> <li>b</li> <li>c</li> </ul> </li> </ul> var result = document.getElementById('start').querySelectorAll('ul>li');
-> Semua 4 elemen li akan dipilih!<select>
elemen dalam induk yang sama.KLAIM
Secara pribadi saya akan mengambil jawaban dari patrick dw, dan memberi +1 jawabannya, jawaban saya adalah untuk mencari solusi alternatif. Saya tidak berpikir itu layak mendapat suara negatif.
Inilah usaha saya:
lihat http://jsfiddle.net/Lgaw5/8/
sumber
querySelector
, yang artinya:eq()
tidak dapat digunakan. Bahkan jika bisa, pemilih Anda akan mengembalikan elemen yang ditampilkan:eq()
ke halaman, bukan:eq()
ke indeks induknya (di mana Anda mendapatkanidx
).elem
ada di indeks 4, tetapi ada saudara sebelumnya yang memiliki perbedaantagName
, tetapi di dalamnya telah disarangkan elemen dengan pencocokantagName
, elemen bertingkat itu akan disertakan dalam hasil sebelum yang Anda targetkan, sekali lagi membuang Indeks. Berikut ini contohnya$('> someselector', elem);
; o)Itu berhasil untuk saya:
Anda harus meneruskan @this keywork sebelum> ketika Anda ingin mencari anak langsung.
sumber
Berikut ini adalah disederhanakan, metode generik untuk menjalankan setiap CSS selector permintaan atas anak-anak hanya langsung - itu juga menyumbang query gabungan, seperti
"foo[bar], baz.boo"
:sumber
Ada lib query-relative , yang merupakan pengganti yang sangat berguna untuk query-selector . Ini mem-polyfill selektor anak
'> *'
dan:scope
(termasuk IE8), serta menormalkan:root
selektor. Juga menyediakan beberapa pseudos relatif khusus seperti:closest
,:parent
,:prev
,:next
, hanya dalam kasus.sumber
periksa apakah elemen memiliki id lain tambahkan id acak dan lakukan pencarian berdasarkan itu
akan melakukan hal yang sama seperti
sumber