Ich denke, dass man zuerst definieren muss, was "am nächsten" bedeutet. Wenn Sie meinen, dass der Nachkommenknoten Ihren Kriterien entspricht und in Bezug auf die elterlichen Verbindungen die kürzeste Entfernung entfernt ist, funktioniert die Verwendung von ": first" oder ".eq (0)" nicht unbedingt:
<div id='start'>
<div>
<div>
<span class='target'></span>
</div>
</div>
<div>
<span class='target'></span>
</div>
</div>
In diesem Beispiel ist das zweite ".target" <span>-Element "näher" am "Start" <div>, da es nur einen elterlichen Sprung entfernt ist. Wenn Sie das mit "am nächsten" meinen, müssen Sie den Mindestabstand in einer Filterfunktion ermitteln. Die Ergebnisliste eines jQuery-Selektors befindet sich immer in DOM-Reihenfolge.
Vielleicht:
$.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;
};
Das ist eine Art Hack-Plugin, weil es das Ergebnisobjekt erstellt, aber die Idee ist, dass Sie aus allen übereinstimmenden Elementen, die Sie finden, den kürzesten elterlichen Pfad finden müssen. Dieser Code wird aufgrund der <Prüfung in Richtung der Elemente im DOM-Baum nach links verschoben. <=würde nach rechts voreingenommen sein.
.find("filter here").eq(0)?