Я думаю, що спочатку ви повинні визначити, що означає «найближчий». Якщо ви маєте на увазі низхідний вузол, що відповідає вашим критеріям, що є найменшою відстані з точки зору батьківських посилань, то використання ": 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)?