J'ai une case à cocher sur laquelle je souhaite effectuer une action Ajax sur l'événement click. Toutefois, la case à cocher se trouve également dans un conteneur avec son propre comportement de clic que je ne souhaite pas exécuter lorsque la case est cochée. Cet exemple illustre ce que je veux faire:
$(document).ready(function() {
$('#container').addClass('hidden');
$('#header').click(function() {
if ($('#container').hasClass('hidden')) {
$('#container').removeClass('hidden');
} else {
$('#container').addClass('hidden');
}
});
$('#header input[type=checkbox]').click(function(event) {
// Do something
});
});
#container.hidden #body {
display: none;
}
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<div id="container">
<div id="header">
<h1>Title</h1>
<input type="checkbox" name="test" />
</div>
<div id="body">
<p>Some content</p>
</div>
</div>
Cependant, je ne peux pas comprendre comment arrêter l'événement qui bouillonne sans que le comportement du clic par défaut (les cases à cocher devenant cochées/décochées) ne s'exécute pas.
Les deux opérations suivantes arrêtent la diffusion de l'événement mais ne modifient pas non plus l'état de la case à cocher:
event.preventDefault();
return false;
remplacer
event.preventDefault();
return false;
avec
event.stopPropagation();
event.stopPropagation ()
Arrête la propagation d'un événement sur les éléments parents, empêchant ainsi les gestionnaires parents d'être avertis de l'événement.
event.preventDefault ()
Empêche le navigateur d'exécuter l'action par défaut. Utilisez la méthode isDefaultPrevented pour savoir si cette méthode a déjà été appelée (sur cet événement).
Utilisez la méthode stopPropagation:
event.stopPropagation();
N'oubliez pas IE:
if (event.stopPropagation) { // standard
event.stopPropagation();
} else { // IE6-8
event.cancelBubble = true;
}
Lorsque vous utilisez jQuery, vous n'avez pas besoin d'appeler une fonction d'arrêt distincte.
Vous pouvez simplement retourner false
dans le gestionnaire d'événements
Cela arrêtera l'événement et annulera le bouillonnement.
Voir aussi event.preventDefault () vs. return false
À partir de la documentation jQuery:
Par conséquent, ces gestionnaires peuvent empêcher le gestionnaire délégué de se déclencher en appelant
event.stopPropagation()
ou en renvoyantfalse
.
C'est un excellent exemple pour comprendre le concept de bouillonnement d'événement. Basé sur les réponses ci-dessus, le code final ressemblera à celui mentionné ci-dessous. Lorsque l'utilisateur coche la case, la propagation de l'événement à son en-tête 'élément d'en-tête' sera stoppée par event.stopPropagation();
.
$(document).ready(function() {
$('#container').addClass('hidden');
$('#header').click(function() {
if($('#container').hasClass('hidden')) {
$('#container').removeClass('hidden');
} else {
$('#container').addClass('hidden');
}
});
$('#header input[type=checkbox]').click(function(event) {
if (event.stopPropagation) { // standard
event.stopPropagation();
} else { // IE6-8
event.cancelBubble = true;
}
});
});
Comme d'autres l'ont mentionné, essayez de stopPropagation()
.
Et il y a un deuxième gestionnaire à essayer: event.cancelBubble = true;
C'est un gestionnaire spécifique à IE, mais il est pris en charge au moins dans FF. Je n'en sais vraiment rien, car je ne l'ai pas utilisé moi-même, mais cela pourrait valoir le coup, si tout le reste échoue.
Nous remercions @ mehras pour le code. Je viens de créer un extrait pour le démontrer car je pensais que ce serait apprécié et je voulais une excuse pour essayer cette fonctionnalité.
$(document).ready(function() {
$('#container').addClass('hidden');
$('#header').click(function() {
if ($('#container').hasClass('hidden')) {
$('#container').removeClass('hidden');
} else {
$('#container').addClass('hidden');
}
});
$('#header input[type=checkbox]').click(function(event) {
if (event.stopPropagation) { // standard
event.stopPropagation();
} else { // IE6-8
event.cancelBubble = true;
}
});
});
div {
text-align: center;
padding: 2em;
font-size: 1.2em
}
.hidden {
display: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="header"><input type="checkbox" />Checkbox won't bubble the event, but this text will.</div>
<div id="container">click() bubbled up!</div>