Я думаю, что сначала нужно определить, что означает «ближайший». Если вы имеете в виду подчиненный узел, соответствующий вашим критериям, который является кратчайшим расстоянием с точки зрения родительских ссылок, то использование ": first" или ".eq (0)" не обязательно будет работать:
<div id='start'>
<div>
<div>
<span class='target'></span>
</div>
</div>
<div>
<span class='target'></span>
</div>
</div>
В этом примере второй <span>элемент «.target» находится «ближе» к «началу» <div>, потому что до него всего один родительский переход. Если это то, что вы подразумеваете под «ближайшим», вам нужно будет найти минимальное расстояние в функции фильтра. Список результатов из селектора jQuery всегда находится в порядке DOM.
Может быть:
$.fn.closestDescendant = function(sel) {
var rv = $();
this.each(function() {
var base = this, $base = $(base), $found = $base.find(sel);
var dist = null, closest = null;
$found.each(function() {
var $parents = $(this).parents();
for (var i = 0; i < $parents.length; ++i)
if ($parents.get(i) === base) break;
if (dist === null || i < dist) {
dist = i;
closest = this;
}
});
rv.add(closest);
});
return rv;
};
Это своего рода хакерский плагин из-за того, как он создает объект результата, но идея состоит в том, что вам нужно найти кратчайший родительский путь из всех совпадающих элементов, которые вы найдете. Этот код смещается в сторону элементов влево в дереве DOM из-за <проверки; <=будет смещаться вправо.
.find("filter here").eq(0)?