Bagaimana saya bisa menemukan leluhur elemen yang paling dekat dengan pohon yang memiliki kelas tertentu, dalam JavaScript murni ? Misalnya, di pohon seperti ini:
<div class="far ancestor">
<div class="near ancestor">
<p>Where am I?</p>
</div>
</div>
Maka saya ingin div.near.ancestor
jika saya mencoba ini p
dan mencari ancestor
.
javascript
html
dom
rvighne
sumber
sumber
p
elemen. Jika Anda benar-benar hanya ingin mendapatkan simpul induk, Anda bisa melakukannyaele.parentNode
.Jawaban:
Pembaruan: Sekarang didukung di sebagian besar browser utama
Perhatikan bahwa ini dapat mencocokkan penyeleksi, bukan hanya kelas
https://developer.mozilla.org/en-US/docs/Web/API/Element.closest
Untuk peramban lawas yang tidak mendukung
closest()
tetapi memilikinya,matches()
dapat membangun pencocokan pemilih yang mirip dengan pencocokan kelas @ rvighne:sumber
closest
banyak fitur traversal DOM yang lebih canggih. Anda dapat menarik implementasi itu sendiri atau menyertakan seluruh bundel untuk mendapatkan banyak fitur baru dalam kode Anda.Ini caranya:
Loop sementara menunggu hingga
el
memiliki kelas yang diinginkan, dan mengaturel
keel
orangtua setiap iterasi sehingga pada akhirnya, Anda memiliki leluhur dengan kelas itu ataunull
.Ini biola , jika ada yang ingin memperbaikinya. Ini tidak akan berfungsi pada browser lama (yaitu IE); lihat tabel kompatibilitas ini untuk classList .
parentElement
digunakan di sini karenaparentNode
akan melibatkan lebih banyak pekerjaan untuk memastikan bahwa simpul adalah elemen.sumber
.classList
, lihat stackoverflow.com/q/5898656/218196 .parentElement
adalah properti yang agak baru (DOM level 4) danparentNode
ada sejak ... selamanya. BegituparentNode
juga bekerja di browser lama, sedangkanparentElement
mungkin tidak. Tentu saja Anda dapat membuat argumen yang sama untuk / melawanclassList
, tetapi tidak memiliki alternatif yang sederhana, seperti yangparentElement
dimiliki. Saya benar-benar bertanya-tanya mengapaparentElement
ada sama sekali, sepertinya tidak menambah nilai lebihparentNode
.while (!el.classList.contains(cls) && (el = el.parentElement));
Gunakan element.closest ()
https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
Lihat contoh ini DOM:
Ini adalah bagaimana Anda akan menggunakan element.closest:
sumber
Berdasarkan jawaban the8472 dan https://developer.mozilla.org/en-US/docs/Web/API/Element/matches di sini adalah solusi cross-platform 2017:
sumber
Solusi @rvighne bekerja dengan baik, tetapi seperti yang diidentifikasi dalam komentar
ParentElement
danClassList
keduanya memiliki masalah kompatibilitas. Untuk membuatnya lebih kompatibel, saya telah menggunakan:parentNode
properti bukanparentElement
propertiindexOf
metode diclassName
properti bukancontains
metode diclassList
properti.Tentu saja, indexOf hanya mencari keberadaan string itu, tidak peduli apakah itu keseluruhan string atau tidak. Jadi jika Anda memiliki elemen lain dengan kelas 'leluhur-jenis' itu masih akan kembali sebagai telah menemukan 'leluhur', jika ini merupakan masalah bagi Anda, mungkin Anda dapat menggunakan regexp untuk menemukan pasangan yang tepat.
sumber