Creo que primero hay que definir qué significa "más cercano". Si te refieres al nodo descendiente que coincide con tus criterios que está a la distancia más corta en términos de enlaces parentales, entonces usar ": first" o ".eq (0)" no necesariamente funcionará:
<div id='start'>
<div>
<div>
<span class='target'></span>
</div>
</div>
<div>
<span class='target'></span>
</div>
</div>
En ese ejemplo, el segundo <span>
elemento ".target" está "más cerca" del "inicio" <div>
, porque está a solo un salto de los padres. Si eso es lo que quiere decir con "más cercano", necesitaría encontrar la distancia mínima en una función de filtro. La lista de resultados de un selector jQuery siempre está en orden DOM.
Tal vez:
$.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;
};
Es una especie de complemento de pirateo debido a la forma en que construye el objeto resultante, pero la idea es que tienes que encontrar la ruta parental más corta de todos los elementos coincidentes que encuentres. Este código se inclina hacia los elementos hacia la izquierda en el árbol DOM debido a la <
verificación; <=
sesgaría hacia la derecha.
.find("filter here").eq(0)
?