Jak znaleźć przodka elementu najbliższego drzewa, które ma określoną klasę, w czystym JavaScript ? Na przykład w takim drzewie:
<div class="far ancestor">
<div class="near ancestor">
<p>Where am I?</p>
</div>
</div>
Więc chcę, div.near.ancestor
jeśli spróbuję tego na p
i wyszukaj ancestor
.
javascript
html
dom
Rvighne
źródło
źródło
p
elementu. Jeśli faktycznie chcesz tylko uzyskać węzeł nadrzędny, możesz to zrobićele.parentNode
.Odpowiedzi:
Aktualizacja: teraz obsługiwane w większości głównych przeglądarek
Pamiętaj, że może to pasować do selektorów, a nie tylko klas
https://developer.mozilla.org/en-US/docs/Web/API/Element.closest
W przypadku starszych przeglądarek, które nie obsługują,
closest()
ale mająmatches()
takie, można zbudować dopasowywanie selektorów podobne do dopasowywania klas @ rvighne:źródło
closest
wieloma bardziej zaawansowanymi funkcjami przejścia DOM. Możesz pobrać tę implementację samodzielnie lub dołączyć cały pakiet, aby uzyskać wiele nowych funkcji w kodzie.To załatwia sprawę:
Pętla while czeka, aż będzie
el
miała pożądaną klasę, i ustawia sięel
nael
rodzica przy każdej iteracji, więc ostatecznie masz przodka z tą klasą lubnull
.Oto skrzypce , jeśli ktoś chce to poprawić. Nie będzie działać na starych przeglądarkach (tj. IE); zobacz tabelę zgodności dla classList .
parentElement
jest tutaj używany, ponieważparentNode
wymagałoby to więcej pracy, aby upewnić się, że węzeł jest elementem.źródło
.classList
można znaleźć na stronie stackoverflow.com/q/5898656/218196 .parentElement
jest raczej nową własnością (DOM poziom 4) iparentNode
istnieje od… na zawsze. WięcparentNode
działa również w starszych przeglądarkach,parentElement
ale może nie. Oczywiście możesz podać ten sam argument za / przeciwclassList
, ale nie ma prostej alternatywy, jakparentElement
ma. Właściwie zastanawiam się, dlaczegoparentElement
w ogóle istnieje, nie wydaje się, aby przynosiło to jakąkolwiek wartośćparentNode
.while (!el.classList.contains(cls) && (el = el.parentElement));
Użyj element.closest ()
https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
Zobacz ten przykład DOM:
Oto jak użyjesz elementu.closest:
źródło
Na podstawie odpowiedzi the8472 i https://developer.mozilla.org/en-US/docs/Web/API/Element/matches tutaj znajduje się międzyplatformowe rozwiązanie 2017:
źródło
Rozwiązanie @rvighne działa dobrze, ale jak stwierdzono w komentarzach
ParentElement
iClassList
oba mają problemy ze zgodnością. Aby uczynić go bardziej kompatybilnym, użyłem:parentNode
właściwość zamiastparentElement
właściwościindexOf
metoda naclassName
właściwości zamiastcontains
metody naclassList
właściwość.Oczywiście indexOf szuka po prostu obecności tego łańcucha, nie ma znaczenia, czy jest to cały łańcuch, czy nie. Więc jeśli miałbyś inny element z klasą „typ przodka”, nadal zwróciłby się jako znaleziony „przodek”, jeśli jest to dla ciebie problem, być może możesz użyć wyrażenia regularnego, aby znaleźć dokładne dopasowanie.
źródło