Когда я хочу получить, например, родитель третьего уровня элемента, который должен написать $('#element').parent().parent().parent()
Есть ли более оптимальный метод для этого?
Как получить родительский элемент n-го уровня элемента в jQuery?
Ответ 1
Так как parents() возвращает элементы предка, упорядоченные из ближайших к внешним, вы можете связать их с eq():
$('#element').parents().eq(0); // "Father".
$('#element').parents().eq(2); // "Great-grandfather".
Ответ 2
В зависимости от ваших потребностей, если вы знаете, какой родитель вы ищете, вы можете использовать селектор .parents().
например: http://jsfiddle.net/HenryGarle/Kyp5g/2/
<div id="One">
<div id="Two">
<div id="Three">
<div id="Four">
</div>
</div>
</div>
</div>
var top = $("#Four").parents("#One");
alert($(top).html());
Пример с использованием индекса:
//First parent - 2 levels up from #Four
// I.e Selects div#One
var topTwo = $("#Four").parents().eq(2);
alert($(topTwo ).html());
Ответ 3
Более быстрый способ - использовать javascript напрямую, например.
var parent = $(innerdiv.get(0).parentNode.parentNode.parentNode);
В моем браузере это выполняется значительно быстрее, чем цепочка вызовов jQuery .parent()
.
Ответ 4
Вы можете указать целевому родительскому элементу идентификатор или класс (например, myParent), а ссылка - $('#element').parents(".myParent")
Ответ 5
Это просто. Просто используйте
$(selector).parents().eq(0);
где 0 является родительским уровнем (0 является родительским, 1 является родительским родителем и т.д.)
Ответ 6
Если вы планируете повторно использовать эту функциональность, оптимальным решением является создание плагина jQuery:
(function($){
$.fn.nthParent = function(n){
var $p = $(this);
while ( n-- >= 0 )
{
$p = $p.parent();
}
return $p;
};
}(jQuery));
Конечно, вы можете расширить его, чтобы включить дополнительный селектор и другие подобные вещи.
Одно примечание: для родителей используется индекс 0
, поэтому nthParent(0)
совпадает с вызовом parent()
. Если вы предпочитаете индексирование на основе 1
, используйте n-- > 0
Ответ 7
Просто добавьте селектор :eq()
следующим образом:
$("#element").parents(":eq(2)")
Вы просто указываете index, родительский: 0 для непосредственного родителя, 1 для grand-parent,...
Ответ 8
вы также можете использовать:
$(this).ancestors().eq(n)
ex: $(this).ancestors().eq(2)
→ родительский элемент родительского элемента this
.
Ответ 9
Вы можете использовать что-то вроде этого:
(function($) {
$.fn.parentNth = function(n) {
var el = $(this);
for(var i = 0; i < n; i++)
el = el.parent();
return el;
};
})(jQuery);
alert($("#foo").parentNth(2).attr("id"));
Ответ 10
с использованием eq, похоже, захватывает динамическую DOM, а используя .parent(). parent(), похоже, захватывает DOM, который был первоначально загружен (если это возможно).
Я использую их как на элементе, который имеет классы, применяемые в onmouseover. eq показывает классы while.parent(). parent() doesnt.
Ответ 11
Если у вас есть общий родительский div, вы можете использовать parentUntil() ссылка
например: $('#element').parentsUntil('.commonClass')
Преимущество в том, что вам не нужно помнить, сколько поколений существует между этим элементом и общим родителем (определяется общим классом).
Ответ 12
Как parent() возвращает список, это также работает
$('#element').parents()[3];
Ответ 13
Не нашел ответа, используя closest()
и я думаю, что это самый простой ответ, когда вы не знаете, сколько уровней соответствует требуемому элементу, поэтому отправляем ответ:
Вы можете использовать функцию closest()
в сочетании с селекторами, чтобы получить первый элемент, который соответствует при перемещении вверх от элемента:
('#element').closest('div') // returns the innermost 'div' in its parents
('#element').closest('.container') // returns innermost element with 'container' class among parents
('#element').closest('#foo') // returns the closest parent with id 'foo'