2017-09-23 4 views
1

J'essaie de basculer .abb-bar, en utilisant $.toggle() chaque fois que son parent (.abb) obtient un clic. mais chaque fois que .abb-bar obtient un clic, son basculer lui-même à cause de event-bubbling. e.stopPropagation() devrait résoudre le problème, mais cela ne fonctionne pas. ce qui peut être fait?stopPropagation() ne fonctionne pas pour l'événement délégué

HTML

<span class="col-auto entry-ops abb"> 
    <i class="fa fa-bars"></i> 
    <div class="list-group abb-bar"> 
     <button class="list-group-item list-group-item-action d-flex justify-content-center" data-user="nick">follow</button> 
     <button class="list-group-item list-group-item-action d-flex justify-content-center complain">complain</button> 
     <button class="list-group-item list-group-item-action d-flex justify-content-center show-entry-number" data-toggle="tooltip">'.$row['entry_id'].'</button> 
    </div> 
</span> 

JS

$(document).on('click', '.abb', function(e) { 
    e.stopPropagation(); 
    $(this).children('.abb-bar').toggle(); 
}); 
+0

stopPropagation arrêterait les événements de mise à feu qui sont les parents de celui-ci ... pas les enfants ... mais vous êtes assis sur le document, de sorte que le clic il a déjà obtenu. – epascarello

+0

je n'ai pas compris pourquoi les gens déprécient d'autres réponses et ne donnent aucune raison pour cela – krishnar

+0

@krishnar Votre réponse est probablement downvoted parce que la réponse ne comprenait que du code et aucun texte expliquant. Essayez d'ajouter une explication de ce qui est modifié par votre code pour créer une réponse mieux reçue. –

Répondre

1

Vous ne devriez pas utiliser la délégation de l'événement ici. Au moment où l'événement atteint document, il ne lui reste plus qu'un élément à propager (window). Il a déjà été propagé jusqu'à document donc vous ne pouvez pas l'annuler rétroactivement pour les éléments sur lesquels il a déjà été déclenché. C'est la nature même de la délégation d'événement ... Laisser l'événement bouger tout le long et ensuite voir quel élément a provoqué l'événement.

Vous devez uniquement définir un événement click sur l'élément bascule et annuler l'événement click sur le conteneur enfant.

// Set the click event handler on the toggle area 
 
$('.abb').on('click', function(e) { 
 
    $('.abb-bar', this).toggle(); 
 
}); 
 

 
// Don't enable the click event on the child 
 
$('.abb-bar').on('click', function(e) { 
 
    e.stopPropagation(); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<span class="col-auto entry-ops abb"> 
 
    <i class="fa fa-bars">Click to toggle</i> 
 
    <div class="list-group abb-bar"> 
 
     <button class="list-group-item list-group-item-action d-flex justify-content-center" data-user="nick">follow</button> 
 
     <button class="list-group-item list-group-item-action d-flex justify-content-center complain">complain</button> 
 
     <button class="list-group-item list-group-item-action d-flex justify-content-center show-entry-number" data-toggle="tooltip">'.$row['entry_id'].'</button> 
 
    </div> 
 
</span>

+0

Je n'ai pas compris pourquoi il est nécessaire d'envoyer ceci à bascule – krishnar

+0

@krishnar 'abb-bar' est ce qui doit être basculé. 'this' (en tant que second paramètre du sélecteur) fournit simplement un contexte pour savoir où il peut être trouvé. C'est un moyen d'améliorer les performances et est fortement recommandé dans les structures DOM complexes. Ce n'est pas nécessaire. Il faudrait reqired s'il y avait plus d'un élément '.abb-bar' car cela empêcherait les autres de basculer. –