Tôi nghĩ rằng trước tiên bạn phải xác định "gần nhất" nghĩa là gì. Nếu bạn có nghĩa là nút con cháu phù hợp với tiêu chí của bạn là khoảng cách ngắn nhất về các liên kết của cha mẹ, thì sử dụng ": đầu tiên" hoặc ".eq (0)" sẽ không nhất thiết phải hoạt động:
<div id='start'>
<div>
<div>
<span class='target'></span>
</div>
</div>
<div>
<span class='target'></span>
</div>
</div>
Trong ví dụ đó, <span>
phần tử ".target" thứ hai " gần" hơn với "bắt đầu" <div>
, bởi vì nó chỉ cách một bước nhảy của cha mẹ. Nếu đó là những gì bạn muốn nói là "gần nhất", bạn cần tìm khoảng cách tối thiểu trong chức năng lọc. Danh sách kết quả từ bộ chọn jQuery luôn theo thứ tự DOM.
Có lẽ:
$.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;
};
Đó là một loại plugin hack vì cách nó xây dựng đối tượng kết quả, nhưng ý tưởng là bạn phải tìm ra con đường ngắn nhất của cha mẹ trong số tất cả các yếu tố phù hợp bạn tìm thấy. Mã này thiên về các phần tử bên trái trong cây DOM vì <
kiểm tra; <=
sẽ thiên vị ngay.
.find("filter here").eq(0)
?