Есть ли функция, аналогичная, jQuery
.closest()
но для обхода потомков и возврата только самых близких?
Я знаю, что .find()
функция есть, но она возвращает все возможные совпадения, а не самые близкие.
Редактировать:
Вот определение ближайшего (по крайней мере, для меня) :
Сначала пересекаются все дети, затем пересекаются отдельные дети.
В приведенном ниже примере id='2'
- ближайшие .closest
потомкиid="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>
См. Ссылку JSfiddle .
.find("filter here").eq(0)
?:first
фильтр?Ответы:
Согласно вашему определению
closest
, я написал следующий плагин:источник
.closest()
функции jQuery , она также соответствует элементу, к которому она была вызвана. См. Мой jsfiddle . При изменении на$currentSet = this.children(); // Current place
это начнется с его дочернимиЕсли под «ближайшим» потомком вы имеете в виду первого ребенка, вы можете:
Или:
Или, чтобы найти первое появление определенного элемента, вы можете сделать:
Или:
На самом деле нам нужно твердое определение того, что означает «ближайший потомок».
Например
Что
<span>
бы$('#foo').closestDescendent('span')
вернуться?источник
$('#foo').find('.whatever').first();
«в ширину» или «в глубину»Вы можете использовать
find
с:first
селектором:Вышеупомянутая строка найдет первый
<p>
элемент в потомках#parent
.источник
find('whatever:first')
.А как насчет этого подхода?
Этот "прямой дочерний" селектор у меня работает.
источник
Чистое решение JS (с использованием ES6).
пример
Учитывая следующую структуру:
Показать фрагмент кода
источник
while
Выражение с побочными эффектами. 2) Использование.matches
чека на двух строках вместо одной.Если кто-то ищет чистое JS-решение (используя ES6 вместо jQuery), вот то, которое я использую:
источник
matches
дважды бегать тоже меня немного раздражает). +1 для вас :)Я думаю, что сначала нужно определить, что означает «ближайший». Если вы имеете в виду подчиненный узел, соответствующий вашим критериям, который является кратчайшим расстоянием с точки зрения родительских ссылок, то использование ": first" или ".eq (0)" не обязательно будет работать:
В этом примере второй
<span>
элемент «.target» находится «ближе» к «началу»<div>
, потому что до него всего один родительский переход. Если это то, что вы подразумеваете под «ближайшим», вам нужно будет найти минимальное расстояние в функции фильтра. Список результатов из селектора jQuery всегда находится в порядке DOM.Может быть:
Это своего рода хакерский плагин из-за того, как он создает объект результата, но идея состоит в том, что вам нужно найти кратчайший родительский путь из всех совпадающих элементов, которые вы найдете. Этот код смещается в сторону элементов влево в дереве DOM из-за
<
проверки;<=
будет смещаться вправо.источник
Я приготовил это, пока нет реализации для позиционных селекторов (их нужно больше, чем просто
matchesSelector
):Демо: http://jsfiddle.net/TL4Bq/3/
Хотя, вероятно, есть некоторые ошибки, не очень много тестировал.
источник
Ответ Роба У меня не совсем сработал. Я адаптировал его к этому, и это сработало.
источник
.find(filter).first()
, только медленнее;)Я бы использовал следующее, чтобы включить саму цель, если она соответствует селектору:
Разметка:
источник
Несмотря на то, что это старая тема, я не смог удержаться от реализации моего closestChild. Доставляет первого найденного потомка с наименьшим количеством путешествий (сначала дыхание). Один рекурсивный (личный фаворит), другой использует список задач без рекурсии в качестве расширений jQquery.
Надеюсь, кому-то это выгодно.
Примечание: рекурсивный метод вызывает переполнение стека, и я улучшил другой, теперь аналогичный предыдущему приведенному ответу.
источник
Следующий плагин возвращает n ближайших потомков.
источник
Я искал аналогичное решение (мне нужны были все ближайшие потомки, т.е. сначала ширина + все совпадения, независимо от того, на каком уровне оно существует), вот что я в итоге сделал:
Надеюсь, это поможет.
источник
Вы можете просто сказать:
источник
Есть отличная статья, в которой указывается, что то, что требует OP, может быть легко достигнуто с помощью ближайших [Компьютерщиков для компьютерных фанатов]
1 https://www.geeksforgeeks.org/jquery-closest-with-examples/
источник
у вас есть много вариантов, но
$("#parent").children(".child");
это самый быстрый. проверьте эту статью для получения подробной информации и тестовисточник