La priorité lorsque plus d'un gestionnaire d'événement est lié à un élément
Lorsque plus d'un gestionnaire d'événement est lié à un élément, comment est-il déterminé qui est déclenchée en premier?
<script>
$(function(){
$(".li").find('input').click(function(){alert('li>input');});
$(".li").click(function(){alert('li');});
$('input').click(function(){alert('input');});
});
</script>
</head>
<body>
<ul>
<li class="li"><input type="checkbox" /><span>Hello</span></li>
<li class="li"><input type="checkbox" /><span>Hello</span></li>
<li class="li"><input type="checkbox" /><span>Hello</span></li>
</ul>
</body>
Vous devez vous connecter pour publier un commentaire.
Si deux gestionnaires d'événements sont liés à l'exact le même objet, il serait le premier venu, premier servi. Le premier attaché exécuté en premier.
Mais, votre exemple est un peu différent. Il semble que vous aussi avez un événement lié à la
input
objet et d'autres pour le parentli
objet. Dans ce cas, celui où l'événement provient en fait (sans doute leinput
élément dans ce cas) va se produire en premier, puis l'événement fera des bulles à la mère objets et il se fera plus tard.Si vous souhaitez arrêter la propagation aux parents, vous pouvez utiliser du jQuery
événement.stopPropagation()
et l'événement ne seront pas atteindre les parents et de ne jamais déclencher leurs gestionnaires d'événements. Qui ressemblerait à ceci:Par le jQuery documentation pour
stopPropagation()
, il n'arrête pas d'autres gestionnaires d'événements sur le même objet, seuls les gestionnaires d'événements sur les objets parents qui seraient normalement obtenir l'événement via remonter l'arbre-mère.Vous pouvez voir la différence ici: http://jsfiddle.net/jfriend00/L33aq/
Je tiens à souligner que le "premier venu, Premier servi" la règle n'est pas toujours vrai, cela dépend aussi de la façon dont vous enregistrez un gestionnaire:
Cela l'exemple ci-dessus, le Gestionnaire d'2 est toujours appelée avant la handler1.
Ont un coup d'oeil à ce violon: http://jsfiddle.net/MFec6/
Handler1
dans l'exemple ci-dessus n'est pas en fait, rattaché à laa
tag. Au lieu de cela, il est attaché à ladocument
. Ainsi, Handler2 est exécutée, puis l'événement bulles jusqu'à ce qu'il frappe ledocument
et jQuery recherche par le biais d'document
s'événement délégations de vérifier si l'élément qui a déclenché l'événement correspond au sélecteur de condition dans le second paramètre deon
pourHandler1
. En réalité, il est vrai que c'est "Premier arrivé, premier servi". Bouillonnante, c'est une autre histoire.Handler1
approche est meilleure que laHandler2
.. comme$('#parentDIV').on('click', 'a', function....)
attache un seul auditeur sur les parents, mais queHandler2
à joindre à chaquea
.Donc, nous devrions préférer leHandler1
approche, quand nous le pouvons?$document.on('x', function(){})
est appelé /après/$document.on('x', '...', function(){})
, même si ce dernier est attaché dernier.document
et pas lea
élément, toute nouvellea
éléments créés après l'événement est affecté ont encore le gestionnaire. Dans le Gestionnaire 2, de nouveaux éléments créés après que le gestionnaire n'aurez pas le gestionnaire d'événements.Premier arrivé, premier servi. Le premier, lié sera le premier déclenchée, et ainsi de suite...
Connexes: jQuery gestionnaires d'événements toujours exécuter dans l'ordre où elles ont été liés moyen de contourner ce problème?