2017-05-05 3 views
0

J'ai regardé beaucoup de questions sur ce sujet et il y a des réponses similaires qui devraient fonctionner, mais cela ne fonctionne pas pour moi. J'admets que DOM traversal n'est pas mon point fort, donc si vous avez une solution et que vous pouvez donner un peu de contexte, cela m'aiderait vraiment à comprendre pourquoi les autres solutions ne fonctionnaient pas.La bascule de glissière ne s'activera pas sur la classe

J'ai un div avec un bouton et sur un clic de bouton (ce bouton apparaît seulement sur mobile) il devrait glisser vers le bas seulement le contenu div actuel. Je peux obtenir cela au travail, mais le problème est qu'il ouvre tout le contenu divs. Je ne peux cependant pas l'obtenir pour ouvrir la carte spécifique même en utilisant des solutions telles que $ (this), $ (next), $ (prev) ou $ (find).

Le code que je poste ci-dessous ne l'ouvre pas du tout, et j'utilise cette version du code car elle ressemble beaucoup aux réponses sur Stack Overflow.

$(document).ready(function(){ 
 
\t 
 
\t $('.mobile-icon').on('click', function(){ 
 
\t \t event.preventDefault(); 
 
\t \t $(this).next().find('.card-bottom').slideToggle(); 
 
\t \t console.log('hi there'); //this does print 
 

 
\t }); 
 

 

 
    });
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 

 

 
    <!-- FIRST CARD --> 
 
    <div class="card"> 
 
     <div class="card-top"> 
 
\t  <h1 class="card-title">Headline</h1> 
 
\t \t <a href="#" class="mobile-icon"> <span class="glyphicon glyphicon-plus"></span> </a> 
 
\t \t <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.</p> 
 
\t </div> 
 
\t <!-- END CARD-TOP --> 
 
\t \t \t \t 
 
     <div class="card-bottom"> 
 
\t  <p>Content to be toggled</p> 
 
\t </div> 
 
     <!-- END CARD BOTTOM --> 
 
    </div> 
 
    <!-- END CARD --> 
 

 
    <!-- SECOND CARD --> 
 
    <div class="card"> 
 
     <div class="card-top"> 
 
\t  <h1 class="card-title">Headline</h1> 
 
\t \t <a href="#" class="mobile-icon"> <span class="glyphicon glyphicon-plus"></span> </a> 
 
\t \t <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.</p> 
 
\t </div> 
 
\t <!-- END CARD-TOP --> 
 
\t \t \t \t 
 
     <div class="card-bottom"> 
 
\t  <p>Content to be toggled</p> 
 
\t </div> 
 
     <!-- END CARD BOTTOM --> 
 
    </div> 
 
    <!-- END CARD -->

+0

Vous devez passer 'event' dans votre fonction à utiliser preventDefault(). Avez-vous des erreurs de console? – jmargolisvt

+0

Ce fut une erreur en mon nom que je copiais le code que je supprimais quelques modifications pour remonter le code que je voulais utiliser dans ce post. J'avais oublié à ce stade d'inclure l'événement.En fait, j'ai d'abord passé «événement» juste comme «e» et je l'ai laissé hors de ce poste comme une erreur. Je laisserai ça à d'autres qui pourraient faire la même erreur. Je n'obtenais aucune erreur et "salut là-bas" console console juste très bien. Je vous remercie! – user5854648

Répondre

0

La question principale est de savoir comment vous utilisez .next() et .find() de jQuery. Depuis $(this) est le <a> tag, .next(), qui sélectionne le frère suivant, est le <p> tag. Ensuite, appeler .find() sur le <p> tag vérifierait tous ses descendants, pour lesquels il n'y en a aucun.

Vous devez donc sélectionner le parent des divs 'card-top' et 'card-bottom' avant de parcourir .find().

Par exemple:

$(document).ready(function(){ 
    $('.mobile-icon').on('click', function(event){ 
     event.preventDefault(); 
     $(this).parent().parent().find('.card-bottom').slideToggle(); 
    }); 
}); 

Le premier appel à .parent() sera le parent de l'étiquette <a>, qui est le 'card-top' div et le .parent() de qui sera le 'card' div. Ensuite, appelez .find() fonctionnera.

http://www.bootply.com/UMwXaOILHv

+0

Ceci est une excellente explication. J'apprécie vraiment la réponse, et je n'étais pas sûr si je l'ai fait .parent(). Parent() il reviendrait deux fois. En tant que designer, cela a beaucoup de sens pour moi car c'est comme si je revenais sur deux couches. J'ai choisi la tienne comme réponse parce que tu as bien travaillé pour l'expliquer, sans être trop technique. Je vous remercie. – user5854648

+0

mon plaisir :). – jisoo

0
  1. manquant la fermeture " sur class="card>

  2. Ajouter event-function() il est function(event)

  3. Si vous n'avez pas besoin de lier n'importe où utiliser un div au lieu d'un a tag et vous n'aurez pas besoin de .

$('.mobile-icon').on('click', function(event) { 
 
    event.preventDefault(); 
 
    $(this).closest('.card').find('.card-bottom').slideToggle(); 
 
    // .closest finds the nearest .card ancestor (it goes up) 
 
    // .find then finds .card-bottom within the closest .card 
 
});
.mobile-icon { 
 
    background-color: black; 
 
    width: 100px; height: 40px; 
 
    color: white; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<!-- FIRST CARD --> 
 
<div class="card"> 
 
    <div class="card-top"> 
 
    <h1 class="card-title">Headline</h1> 
 
    <div class="mobile-icon">click me</div> 
 
    <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.</p> 
 
</div> 
 
<!-- END CARD-TOP --> 
 
    <div class="card-bottom"> 
 
    <p>Content to be toggled</p> 
 
    </div> 
 
    <!-- END CARD BOTTOM --> 
 
</div> 
 
<!-- END CARD --> 
 

 
<!-- SECOND CARD --> 
 
<div class="card"> 
 
    <div class="card-top"> 
 
    <h1 class="card-title">Headline</h1> 
 
    <a href="#" class="mobile-icon">click me</a> 
 
    <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor.</p> 
 
</div> 
 
<!-- END CARD-TOP --> 
 
    <div class="card-bottom"> 
 
    <p>Content to be toggled</p> 
 
    </div> 
 
    <!-- END CARD BOTTOM --> 
 
</div> 
 
<!-- END CARD -->

violon

https://jsfiddle.net/Hastig/m2zaLfnz/

+1

Ceci est une excellente solution et cela fonctionne très bien. Le "manquant" dans la classe .card était une erreur stupide car je supprimais des classes inutiles du code que j'utilise J'ai édité mon post original pour l'inclure Merci beaucoup pour votre réponse J'ai choisi un autre parce qu'il a été expliqué comment il traversait le DOM d'une façon que je peux comprendre. Merci pour votre aide! – user5854648