Je n'arrive pas à obtenir que cela cesse de se propager ..
$(document).ready(function(){
$("body").on("click","img.theater",function(event){
event.stopPropagation();
$('.theater-wrapper').show();
});
// This shouldn't fire if I click inside of the div that's inside of the
// `.theater-wrapper`, which is called `.theater-container`, anything else it should.
$(".theater-wrapper").click(function(event){
$('.theater-wrapper').hide();
});
});
Puisque vous utilisez on
sur l'élément body
et non directement sur img.theater
, l'événement va se propager jusqu'à l'élément body
et c'est ainsi qu'il fonctionne.
Au cours de l'événement, les éléments .theater-wrapper
et click
de Bubbling seront déclenchés et vous le verrez.
Si vous ne créez aucun élément dynamique, attachez le gestionnaire d'événements click directement sur l'élément img.theater
.
$("img.theater").click(function(event){
event.stopPropagation();
$('.theater-wrapper').show();
});
Vous pouvez également vérifier la cible de l'événement click
dans le gestionnaire .theater-wrapper
elements click
et ne rien faire.
$(".theater-wrapper").click(function(event){
if ($(event.target).is('img.theater')){
event.stopPropagation();
return;
}
$('.theater-wrapper').hide();
});
La meilleure façon de faire est:
$(".theater-wrapper").click(function(event){
if (!$(event.target).is('img.theater')){
$('.theater-wrapper').hide();
}
});
Cela fonctionne pour moi avec un accordéon et une case à cocher
En réponse à votre jsfiddle @Dylan
Ici: lorsque vous cliquez sur le point blanc, il ne devrait pas se fermer. jsfiddle.net/Cs8Kq - Dylan
Changement
if ($(event.target).is('img.theater')){
à
if ($(event.target).is('.theater-container')){
et ça va marcher.
J'ai résolu ce problème en utilisant console.log (event.target) dans le gestionnaire d'événements et en utilisant simplement le sélecteur qui s'est déconnecté lorsque j'ai cliqué sur la zone blanche dont vous parlez.
J'aurais commenté à la place, mais je n'ai pas assez de SO stardust et de pièces.
EDIT: Comme ceci jsfiddle.net/heNP4/
utilisez event.stopImmediatePropagation () Cela a fonctionné pour moi