Je n'arrive pas à comprendre comment écrire cela.
Voir ma structure de balisage, qui est répétée plusieurs fois sur une page.
<div class="module">
<div class="archive-info">
<span class="archive-meta">
open
</span>
</div>
<div class="archive-meta-slide">
</div>
</div>
Comme vous pouvez le voir à l'intérieur de mon balisage, j'ai un <span>
qui est mon $metaButton
- lorsque vous cliquez dessus, il exécute l'animation sur le div.archive-meta-slide
- c'est assez simple, mais j'essaie d'exécuter l'animation uniquement sur le div.module
il anime toutes les divs avec la classe "archive-meta-slide"
, et j'ai vraiment du mal à n'animer que le courant div.archive-meta-slide
en utilisant this
Ce serait facile si le div.archive-meta-slide
était dans la division parent de $metaButton
, mais parce que c'est en dehors de cette div parent, je ne peux pas obtenir le droit de traversée.
Voir mon 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");
});
Quelqu'un peut-il aider?
Merci Josh
$(this).parent().siblings().find(".archive-meta-slide")
C'est vraiment proche. Cela dit en fait "trouver des éléments avec la classe archive-meta-slide
Qui sont des descendants de frères et sœurs du parent de cet élément". Vous voulez dire "trouver des éléments avec la classe archive-meta-slide
Qui sont les frères et sœurs du parent de cet élément". Pour cela, utilisez un sélecteur sur l'appel siblings
:
$(this).parent().siblings(".archive-meta-slide")
Notez que, si le balisage est toujours cette structure, vous pouvez même faire $(this).parent().next()
.
Voir l'API jQuery:
Utilisez $(this).closest(".module")
pour trouver le module parent d'où le clic se produit.
Vous voudrez probablement aussi utiliser une fonction de complétion pour changer le texte après avoir fait l'animation.
La bonne chose à propos de .closest()
est qu'il recherche juste la chaîne parent aussi loin que nécessaire jusqu'à ce qu'il trouve un objet avec la bonne classe. C'est beaucoup moins fragile que d'utiliser un nombre spécifique de références .parent()
si quelqu'un d'autre modifie un peu votre conception HTML (ajoute un autre div ou span ou quelque chose comme ça dans la chaîne parent).
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");
});
},
});
Vous pouvez également DRY augmenter un peu et créer une fonction commune:
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")}
);
Vous cherchez…
$(this).parent().next('.archive-meta-slide')
Si la structure de #module change, cela pourrait être plus robuste:
$(this).closest('#module').children('.archive-meta-slide')
Utilisation
jQuery(this).closest('.prev-class-name').find('.classname').first()
Utilisation
$(this).parent().parent().children('.archive-meta-slide')
C'est aussi bien que de rechercher des enfants de div de module supérieur
$ (this) .parent (). parent ()
sera ton top
<div class="module">
Essayez le plus proche qui vous permettra de revenir en arrière jusqu'à ce que vous atteigniez le parent avec le sélecteur spécifié.
$(this).closest(".module")