JQuery получить родительский брат только для этого элемента
Я не могу понять, как это записать.
См. мою структуру разметки, которая повторяется несколько раз на странице.
<div class="module">
<div class="archive-info">
<span class="archive-meta">
open
</span>
</div>
<div class="archive-meta-slide">
</div>
</div>
Как вы можете видеть внутри моей разметки, у меня есть <span>
, который является моим $metaButton
- при щелчке, он запускает анимацию на div.archive-meta-slide
- это достаточно просто, но я пытаясь запустить анимацию только в текущем div.module
, она анимирует все div с классом "archive-meta-slide"
, и я действительно пытаюсь анимировать только текущий div.archive-meta-slide
с помощью this
Было бы легко, если div.archive-meta-slide
находился внутри родительского div $metaButton
, но поскольку он вне этого родительского div, я не могу правильно пройти.
Смотрите мой script
var $metaButton = $("span.archive-meta"),
$metaSlide = $(".archive-meta-slide");
$metaButton.toggle(
function() {
$(this).parent().siblings().find(".archive-meta-slide").animate({ height: "0" }, 300);
$(this).parent().siblings().find(".archive-meta-slide").html("close");
},
function() {
$(this).parent().siblings().find(".archive-meta-slide").animate({ height: "43px" }, 300);
$(this).parent().siblings().find(".archive-meta-slide").html("open");
});
Может ли кто-нибудь помочь?
Спасибо
Джош
Ответы
Ответ 1
$(this).parent().siblings().find(".archive-meta-slide")
Это действительно близко. Это фактически говорит "найти элементы с классом archive-meta-slide
, которые являются потомками братьев и сестер этого родительского элемента". Вы хотите сказать "найти элементы с классом archive-meta-slide
, которые являются братьями и сестрами этого родителя элемента". Для этого используйте селектор при вызове siblings
:
$(this).parent().siblings(".archive-meta-slide")
Обратите внимание, что если разметка всегда является такой структурой, вы даже можете сделать $(this).parent().next()
.
См. API jQuery:
Ответ 2
Используйте $(this).closest(".module")
, чтобы найти родительский модуль, из которого происходит щелчок.
Возможно, вы также захотите использовать функцию завершения, чтобы изменить текст после анимации.
Самое приятное в .closest()
заключается в том, что он просто ищет родительскую цепочку настолько, насколько это необходимо, пока не найдет объект с правильным классом. Это намного менее хрупко, чем использование определенного количества ссылок .parent()
, если кто-то еще немного изменит ваш HTML-дизайн (добавляет еще один div или span или что-то подобное в родительской цепочке).
var $metaButton = $("span.archive-meta");
$metaButton.toggle(
function() {
var $slide = $(this).closest(".module").find(".archive-meta-slide");
$slide.animate({ height: "0" }, 300, function() {
$slide.html("close");
});
},
function() {
var $slide = $(this).closest(".module").find(".archive-meta-slide");
$slide.animate({ height: "43px" }, 300, function() {
$slide.html("open");
});
},
});
Вы также можете немного иссушить его и сделать общую функцию:
function metaToggleCommon(obj, height, text) {
var $slide = $(obj).closest(".module").find(".archive-meta-slide");
$slide.animate({ height: height}, 300, function() {
$slide.html(text);
});
}
var $metaButton = $("span.archive-meta");
$metaButton.toggle(
function() {metaToggleCommon(this, "0", "close")},
function() {metaToggleCommon(this, "43px", "open")}
);
Ответ 3
Вы ищете...
$(this).parent().next('.archive-meta-slide')
Если структура #module изменяется, это может быть более надежным:
$(this).closest('#module').children('.archive-meta-slide')
Ответ 4
Используйте
$(this).parent().parent().children('.archive-meta-slide')
Это так же хорошо, как поиск детей верхнего модуля div
$(это).parent(). Родитель()
будет вашим верхним
<div class="module">
Ответ 5
Используйте
jQuery(this).closest('.prev-class-name').find('.classname').first()
Ответ 6
Попробуйте closest, который позволит вам вернуться назад, пока не дойдете до родителя с указанным селектором.
$(this).closest(".module")