Ближайший предка node в jQuery
В моем опыте javascript я обнаружил, что это очень распространенная задача: "Поиск ближайшего предка элемента с некоторым условием (имя тега, класс,...)".
Может ли метод jQuery 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;
}
Может ли кто-нибудь сказать мне, есть ли умный способ выполнить эту работу?
Ответы
Ответ 1
Изменить. Начиная с jQuery 1.3, это было встроено в качестве функции closest()
. например: $('#foo').closest('.bar');
yep - parent() пересекает дерево.
<div id="a">
<div id="b">
<p id="c">
<a id="d"></a>
</p>
</div>
</div>
$('#d').parents("div:first");
выберет div b.
Ответ 2
Добавление в @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 возвращает] набор элементы, содержащие ближайший родитель элемент, который соответствует указанному селектор, стартовый элемент включен.
Ответ 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>
и вы хотите добавить класс к divs, у которых есть элемент <b>
в качестве своего непосредственного дочернего элемента (т.е. 1 и 3). Если вы используете $('b').parents('div')
, вы получите divs 0, 1 и 3. Если вы используете $('b').parents('div:first')
, вы получите только div 1. Чтобы получить 1 и 3, но не 0, вы должны использовать $('b').closest(elem)
.
Ответ 4
ближайший() начинается с текущего элемента, если родительский объект, который вы ищете, имеет тот же тег, что и текущий (например, оба являются div), используйте parent(). closeest()