Czy istnieje funkcja podobna do jQuery
.closest()
przemierzania potomków i zwracania tylko najbliższych?
Wiem, że jest .find()
funkcja, ale zwraca wszystkie możliwe dopasowania, a nie najbliższe.
Edytować:
Oto definicja najbliższego (przynajmniej dla mnie) :
W pierwszej kolejności przechodzą wszystkie dzieci, następnie przechodzą poszczególne dzieci.
W podanym poniżej przykładzie id='2'
są najbliżsi .closest
potomkowieid="find-my-closest-descendant"
<div id="find-my-closest-descendant">
<div>
<div class="closest" Id='1'></div>
</div>
<div class="closest" Id='2'></div>
</div>
Proszę zobaczyć link JSfiddle .
.find("filter here").eq(0)
?:first
filtr?Odpowiedzi:
Zgodnie z twoją definicją
closest
napisałem następującą wtyczkę:źródło
.closest()
funkcji jQuery , to pasuje również do elementu, do którego została wywołana. Zobacz mój jsfiddle . Zmiana na$currentSet = this.children(); // Current place
to zacznie się od jego dzieci zamiast jsfiddleJeśli mówiąc „najbliższy” potomek masz na myśli pierwsze dziecko, możesz:
Lub:
Lub, aby wyszukać pierwsze wystąpienie określonego elementu, możesz zrobić:
Lub:
Jednak naprawdę potrzebujemy solidnej definicji tego, co oznacza „najbliższy potomek”.
Na przykład
Który
<span>
byłby$('#foo').closestDescendent('span')
powrót?źródło
$('#foo').find('.whatever').first();
jest to „najpierw wszerz”, czy „najpierw w głąb”Możesz użyć
find
z:first
selektorem:Powyższa linia znajdzie pierwszy
<p>
element w potomkach#parent
.źródło
find('whatever:first')
.A co z tym podejściem?
Ten selektor „bezpośredniego dziecka” działa dla mnie.
źródło
Czysty roztwór JS (przy użyciu ES6).
Przykład
Biorąc pod uwagę następującą strukturę:
Pokaż fragment kodu
źródło
while
Wyrażenie mające skutki uboczne. 2) Użycie.matches
czeku w dwóch wierszach zamiast tylko jednego.W przypadku, gdy ktoś szuka czystego rozwiązania JS (używając ES6 zamiast jQuery), oto ten, którego używam:
źródło
matches
dwukrotne bieganie też trochę mnie irytuje). +1 dla Ciebie :)Myślę, że najpierw musisz zdefiniować, co oznacza „najbliższy”. Jeśli masz na myśli węzeł podrzędny spełniający Twoje kryteria, czyli najkrótszą odległość pod względem linków rodzicielskich, użycie „: first” lub „.eq (0)” niekoniecznie zadziała:
W tym przykładzie drugi
<span>
element „.target” jest „bliżej” „początku”<div>
, ponieważ dzieli go tylko jeden przeskok rodzicielski. Jeśli to właśnie masz na myśli mówiąc „najbliżej”, musisz znaleźć minimalną odległość w funkcji filtra. Lista wyników z selektora jQuery jest zawsze w kolejności DOM.Może:
To coś w rodzaju wtyczki hakerskiej ze względu na sposób, w jaki buduje obiekt wynikowy, ale chodzi o to, że musisz znaleźć najkrótszą ścieżkę rodzicielską ze wszystkich pasujących elementów, które znajdziesz. Ten kod kieruje się w stronę elementów w lewo w drzewie DOM z powodu
<
sprawdzania;<=
odchyliłby się w prawo.źródło
Ugotowałem to, nie ma jeszcze implementacji dla selektorów pozycyjnych (potrzebują czegoś więcej niż tylko
matchesSelector
):Demo: http://jsfiddle.net/TL4Bq/3/
Prawdopodobnie jest jednak kilka błędów, nie testowałem tego zbytnio.
źródło
Odpowiedź Roba W. nie do końca mi odpowiadała. Dostosowałem to do tego, co zadziałało.
źródło
.find(filter).first()
, tylko wolniej;)Użyłbym poniższego, aby dołączyć cel, jeśli pasuje do selektora:
Narzut:
źródło
Mimo, że jest to stary temat, nie mogłem się oprzeć realizacji mojego najbliższego Dziecka. Dostarcza pierwszego znalezionego potomka z najmniejszą podróżą (najpierw oddech). Jedna jest rekurencyjna (osobista ulubiona), druga używa listy rzeczy do zrobienia, więc bez rekurencji jako rozszerzenia jQquery.
Mam nadzieję, że ktoś skorzysta.
Uwaga: rekurencyjny dostaje przepełnienie stosu, a ja poprawiłem drugą, teraz podobną do poprzedniej podanej odpowiedzi.
źródło
Następująca wtyczka zwraca n-tego najbliższego potomka.
źródło
Szukałem podobnego rozwiązania (chciałem wszystkich najbliższych potomków, czyli najpierw szerokość + wszystkie dopasowania niezależnie od tego, na jakim poziomie istnieje), oto co zrobiłem:
Mam nadzieję, że to pomoże.
źródło
Możesz po prostu powiedzieć,
źródło
Jest doskonały artykuł, który wskazuje, że to, czego wymaga PO, można łatwo osiągnąć dzięki najbliższym [Geeks for Geeks]
1 https://www.geeksforgeeks.org/jquery-closest-with-examples/
źródło
masz wiele opcji, ale
$("#parent").children(".child");
jest szybszy. sprawdź ten artykuł, aby uzyskać szczegółowe informacje i testy porównawczeźródło