juste une petite question. J'ai un problème avec les divs avec onclick javascript l'un dans l'autre. Lorsque je clique sur la division interne, il ne doit déclencher que le code javascript onclick, mais le code JavaScript de la division externe est également activé. Comment l'utilisateur peut-il cliquer sur la division interne sans activer le code javascript de la division externe?
<html>
<body>
<div onclick="alert('outer');" style="width:300px;height:300px;background-color:green;padding:5px;">outer div
<div onclick="alert('inner');" style="width:200px;height:200px;background-color:white;" />inner div</div>
</div>
</div>
</body>
</html>
Il existe essentiellement deux modèles d’événement en javascript. Capture d’événement et Bubbler événement . En cas de déclenchement d'événement, si vous cliquez sur div interne, l'événement clic div interne est déclenché en premier, puis le clic div externe déclenché. lors de la capture d’événement, l’événement div externe déclenché et l’événement div interne déclenché. Pour arrêter la propagation d'événement, utilisez ce code dans votre méthode clic.
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
Consultez les informations sur la propagation d'événements ici
En particulier, vous voudrez qu'un code comme celui-ci dans vos gestionnaires d'événements empêche les événements de se propager:
function myClickHandler(e)
{
// Here you'll do whatever you want to happen when they click
// now this part stops the click from propagating
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
}
Ajoutez simplement ce code:
window.event.stopPropagation();
return false;
de la fonction onclick de la div interne:
<div onclick="alert('inner'); return false;" ...
Ce que vous avez à faire s'appelle propagation d'événements .
Ceci est un cas d'événement bouillonnant.
Vous pouvez utiliser
e.cancelBubble = true; //IE
et
e.stopPropagation(); //FF
Une autre façon pour les navigateurs Webkit:
<div onclick="alert('inner'); event.stopPropagation;" ...
C'était très utile, mais cela n'a pas fonctionné pour moi.
Ce que j'ai fait est décrit ici .
J'ai donc posé une condition à l'événement onclick
extérieur:
if( !event.isPropagationStopped() ) {
window.location.href = url;
}
Ici est une autre référence pour vous aider à comprendre le bouillonnement d'événements javascript.
Cela a fonctionné pour moi dans Jquery:
$('#outer_element').click(function(event) {
if(event.target !== event.currentTarget) return;
alert("Outer element is clicked")
});
De cette façon, si la cible actuelle n'est pas la même que la div externe, elle ne fera rien. Vous pouvez implémenter des fonctions normales sur les éléments enfants.
Vous pouvez utiliser
$("divOrClassThatYouDontWantToPropagate").click(function( event ) {
event.stopPropagation();
});
vous avez deux "div" et trois "/ div".