在我的javascript体验中,我发现这是一个非常常见的任务“搜索具有某些条件的元素的最近祖先(标记名称,类,......)”。 jquery的parents()方法可以完成这项工作吗? parent()的返回元素的顺序是可预测的吗?从上到下还是从下到上? 目前我使用这个效用函数:
function ancestor(elem, selector) {
var $elem = $( elem ).parent();
while( $elem.size() > 0 ) {
if( $elem.is( selector ) )
return $elem;
else
$elem = $elem.parent();
}
return null;
}
有人可以告诉我是否有聪明的方法来完成这项工作?
答案 0 :(得分:20)
编辑:自jQuery 1.3以来,它已作为closest()
函数内置。例如:$('#foo').closest('.bar');
是的 - 父母()穿过树。
<div id="a">
<div id="b">
<p id="c">
<a id="d"></a>
</p>
</div>
</div>
$('#d').parents("div:first");
将选择div b。
答案 1 :(得分:16)
添加到@ nickf的答案:
jQuery 1.3使用closest
简化了此任务。
给出一个DOM:
<div id="a">
<div id="b">
<p id="c">
<a id="d"></a>
</p>
</div>
</div>
你可以这样做:
$('#d').closest("div"); // returns [ div#b ]
[Closest返回一组] 包含最近父级的元素 与指定匹配的元素 选择器,起始元素 包括在内。
答案 2 :(得分:3)
您应该使用closest
,因为如果您使用多个元素,parents
将无法获得您期望的结果。例如,假设你有这个:
<div id="0">
<div id="1">test with <b>nested</b> divs.</div>
<div id="2">another div.</div>
<div id="3">yet <b>another</b> div.</div>
</div>
并且您想要将一个类添加到具有<b>
元素作为其直接子元素的div(即1和3)。如果使用$('b').parents('div')
,则得到div为0,1和3.如果使用$('b').parents('div:first')
,则只获得div 1.要获得1和3,而不是0,则必须使用{{1 }}
答案 3 :(得分:3)
nearest()从当前元素开始,如果您要查找的父元素与当前元素具有相同的标记(例如,两者都是div),请使用parent()。nearest()