Когда я хочу получить, например, 3-го уровня родителя элемента, я должен написать $('#element').parent().parent().parent()
Есть ли более оптимальный метод для этого?
javascript
jquery
parent
Артур Кейан
источник
источник
Ответы:
Так как parent () возвращает элементы-предки, упорядоченные от ближайших к внешним, вы можете связать их в eq () :
источник
$('.element').first().parents().eq(num);
[2]
вернет базовый элемент DOM, использованиеeq(2)
вернет объект jQuery.Зависит от ваших потребностей, если вы знаете, какого родителя вы ищете, вы можете использовать селектор .parents ().
Например: http://jsfiddle.net/HenryGarle/Kyp5g/2/
Пример использования индекса:
источник
Вы можете дать целевому родителю идентификатор или класс (например, myParent), а ссылка на
$('#element').parents(".myParent")
источник
Более быстрый способ - использовать javascript напрямую, например.
Это работает значительно быстрее в моем браузере, чем цепочка
.parent()
вызовов jQuery .Смотрите: http://jsperf.com/jquery-get-3rd-level-parent
источник
Не нашел никакого ответа с помощью,
closest()
и я думаю, что это самый простой ответ, когда вы не знаете, на сколько уровней требуется требуемый элемент, поэтому отправка ответа:вы можете использовать
closest()
функцию в сочетании с селекторами, чтобы получить первый элемент, который соответствует при движении вверх от элемента:источник
Это просто. Просто используйте
где 0 - родительский уровень (0 - родительский, 1 - родительский и т. д.)
источник
Просто добавьте
:eq()
селектор вот так:Вы просто указываете, какой родитель: 0 для непосредственного родителя, 1 для деда, ...
источник
Если вы планируете использовать эту функциональность повторно, оптимальным решением будет создать плагин jQuery:
Конечно, вы можете расширить его, чтобы включить дополнительный селектор и другие подобные вещи.
Одно замечание: здесь используется
0
основанный индекс для родителей, такnthParent(0)
же, как и вызовparent()
. Если вы предпочитаете1
индексирование на основе, используйтеn-- > 0
источник
var p = 1 + n; while (p--) { $p = $p.parent(); }
и если вы хотите изменить на 1, Javascript - это «falsey», который вы можете использовать:while (n--) { $p = $p.parent();}
сохранение условной проверкиnthParent(-2)
? Ваш пример сломан.(function($) { $.fn.nthParent = function(n) { return $(this).parents().eq(n); }; }(jQuery));
parents
который будет неправильным для выборов с более чем одним элементом.var p = n >? (1 + n):1;
вместо этого вернет первого родителя в этом случае, а не «ничего» - или где это прерывает цикл в моем примере. ТАК, наверное, так и должно быть:(function($) { $.fn.nthParent = function(n) { var $p = $(this); if (!(n > -0)) { return $() }; var p = 1 + n; while (p--) { $p = $p.parent(); } return $p; }; }(jQuery));
если вы не хотите ничего возвращать.Если у вас есть общий родительский DIV можно использовать parentsUntil () ссылка
например:
$('#element').parentsUntil('.commonClass')
Преимущество заключается в том, что вам не нужно запоминать, сколько поколений существует между этим элементом и общим родителем (определяется общим классом).
источник
Вы также можете использовать:
пример:
$(this).ancestors().eq(2)
-> родитель родителяthis
.источник
Вы можете использовать что-то вроде этого:
http://jsfiddle.net/Xeon06/AsNUu/
источник
использование eq похоже для захвата динамического DOM, а использование .parent (). parent () - для захвата DOM, который был изначально загружен (если это вообще возможно).
Я использую их оба для элемента, к которому применены классы для onmouseover. eq показывает классы, а .parent (). parent () - нет.
источник
Как родители () возвращает список, это также работает
источник