Les termes que vous cherchez ici sont Propagation d'événements ou Event Bubbling.
La gestion des événements dans les navigateurs "modernes" (qui est le modèle dans lequel la plupart des bibliothèques se connectent) fonctionne en faisant bouillir l'arborescence du document. Ce que cela signifie est que si vous avez la structure html document comme celui-ci
<body>
<div>
<ul>
<li>Foo</li>
<li>Bar</li>
<li>Baz</li>
</ul>
</div>
</body>
et clique sur Foo, les trucs des événements suivants se produit
- Le <li> reçoit un événement click
- Le <ul> reçoit un événement de clic
- Le <div> reçoit un événement de clic
- Le corps < > reçoit un événement click
C'est ce qui vous arrive. Il y a deux choses que vous pouvez faire pour éviter cela.
La première, comme beaucoup l'ont suggéré est, si votre gestionnaire d'événements retourne false, la propagation des événements s'arrêtera à l'élément qui a été cliqué. (Ce qui est de savoir comment gère jQuery il, chaque bibliothèque a une approche différente)
$(document).ready(function() {
//hookup events for entire body of document
$('body').bind('click', function(e){
//do clicked body stuff
});
//hookup our divs, returning false to prevent bubbling
$('div').bind('click', function(e){
//do clicked div stuff
return false; //stop event propagation
});
});
Une seconde, certains soutiendraient mieux, approche consiste à utiliser la délégation de l'événement. délégation de l'événement, dans le contexte de Javascript et le DOM, est l'endroit où vous joignez un seul gestionnaire d'événement à un élément extérieur (dans ce cas le corps), puis basé sur quel élément a été initialement cliqué, prendre une action particulière.
Quelque chose comme ça.
$(document).ready(function() {
//event delegate
$('body').bind('click', function(e){
var originalElement = e.srcElement;
if(!originalElement){originalElement=e.originalTarget;}
if ($(originalElement).is('div')) {
console.log("A div!");
}
else if ($(originalElement).is('div#inside')) {
console.log("A Specific Div!");
}
else{
console.log("Something else!");
}
});
});
Les benifits de ce sont deux fois. Tout d'abord, vous pouvez centraliser tout votre code de gestion des événements dans un seul endroit dans votre code. Le second (plus important dans mon esprit) est d'attacher un seul gestionnaire d'événements qui consomme beaucoup moins de mémoire du navigateur et vous met en place pour de meilleures performances aller de l'avant.
belle réponse. Merci d'avoir clarifié le mien. :) – andyk
;) merci d'être un bon sport. – gradbot