1. La séquence des événements
L'origine de ce problème est très simple, supposons que vous ayez un élément imbriqué dans un autre élément
Comme prévu, Netscape et Microsoft avaient deux approches très différentes pour gérer cette époque de « guerre des navigateurs » :
Netscape préconise que l'événement de l'élément 1 se produise en premier. Cet ordre d'occurrence de l'événement est appelé le type de captureMicrosoft maintient que l'élément 2 est prioritaire. d'entre eux La séquence des événements est diamétralement opposée. Le navigateur Explorer ne prend en charge que les événements bouillonnants, Mozilla, Opera7 et Konqueror prennent en charge les deux. L'ancien Opera et iCab ne prennent pas en charge non plus
3. Capturer les événements
Lorsque vous utilisez la capture d'événements
Copiez le code
Lorsque vous utilisez des événements bouillonnants
Copiez le code
Le W3c a judicieusement choisi la bonne solution dans cette bataille. Tout événement qui se produit dans le modèle d'événement w3c entre d'abord dans la phase de capture jusqu'à ce qu'il atteigne l'élément cible, puis entre dans la phase de bouillonnement
Copier le code
(L'événement est ici comme un touriste, voyageant de l'extérieur vers l'intérieur, s'approchant progressivement de l'élément principal qui s'est déclenché, puis repartant dans la direction opposée)
1. L'événement clic entre d'abord dans la phase de capture (en se rapprochant progressivement de la direction de l'élément 2). Vérifiez si l'un des éléments ancêtres de l'élément 2 a un gestionnaire onclick dans la phase de capture
2. On constate que l'élément 1 en a un, donc doSomething2 est exécuté 3. L'événement vérifie la cible elle-même (élément 2 ), mais il n'y a pas de gestionnaire onclick dans la phase de capture. Trouvé plus de fonctions de traitement. L'événement commence à entrer dans la phase de bouillonnement et doSomething() est exécuté naturellement, qui est une fonction liée à la phase de bouillonnement de l'élément 2.
4. L'événement s'éloigne de l'élément 2 pour voir si un élément ancêtre est lié à un gestionnaire pendant la phase de bouillonnement. Il n'y a pas de tel cas, donc rien ne se passe
Le cas inverse est :
Maintenant, si l'utilisateur clique sur l'élément 2, cela se produira :
3. L'événement commence à s'éloigner de la cible. Vérifiez si l'un des éléments ancêtres de l'élément 2 est lié à une fonction de gestionnaire pendant la phase de bouillonnement. 4. Une est trouvée, donc doSomething2(). de l'élément 1 est exécuté
6. Compatibilité et mode traditionnel
Dans les navigateurs prenant en charge w3c dom (Document Object Model), la méthode traditionnelle de liaison d'événements est
Peu de développeurs utiliseront consciemment des événements bouillonnants ou des événements de capture. Dans les pages Web qu'ils réalisent aujourd'hui, il n'est pas nécessaire qu'un événement soit géré par plusieurs fonctions car il bouillonne. Mais parfois, les utilisateurs sont souvent confus car après avoir cliqué sur la souris une seule fois, de nombreuses choses se produisent (plusieurs fonctions sont exécutées à cause du bouillonnement). Dans la plupart des cas, vous souhaitez que vos fonctions de traitement soient indépendantes les unes des autres. Lorsque l'utilisateur clique sur un élément, ce qui se passe, et ce qui se passe lorsque l'utilisateur clique sur un autre élément, sont indépendants l'un de l'autre et ne sont pas liés par bouillonnement.
8. Ça arrive tout le temps
La première chose que vous devez comprendre est que la capture ou le bouillonnement d'un événement se produit toujours. Si vous définissez une fonction générale de traitement onclick pour l'ensemble de la page du document
L'événement de clic consistant à cliquer sur n'importe quel élément de la page finira par remonter jusqu'à la couche de document la plus élevée de la page, déclenchant ainsi la fonction de traitement général, à moins que la fonction de traitement précédente n'indique explicitement de mettre fin au bouillonnement, ce n'est qu'à ce moment-là que le processus sera activé. le bouillonnement sera arrêté. Ne sera pas propagé à l'ensemble du niveau du document
Ajout à la deuxième phrase du code ci-dessus :
>>>Parlons d'abord d'IE
object.setCapture() Lorsqu'un objet est setCapture, sa méthode sera héritée de l'ensemble du document pour la capture.
Lorsque vous n'avez pas besoin d'hériter de la méthode pour capturer l'intégralité du document, utilisez object.releaseCapture()
>>>others
Mozilla a également une fonction similaire, la méthode est légèrement différente
window.captureEvents (Event.eventType)
window.releaseEvents(Event.eventType)
>>>exemple
9. Utilisation
Étant donné que toute propagation d'événement se termine dans le document de page (ce niveau supérieur), cela rend possible le gestionnaire d'événements par défaut, en supposant que vous ayez une page comme celle-ci
Rappelez-vous la première loi de la navigateurlogie : tout peut arriver, et c'est à ce moment-là que vous êtes au moins quelque peu préparé. Donc ce qui peut arriver c'est que lorsque l'utilisateur glisse, il déplace fortement sa souris sur la page, mais le script ne peut pas répondre à la grande amplitude, de sorte que la souris ne reste plus sur le calque de l'élément
1. Si la fonction de gestionnaire onmouseover est liée au calque d'élément, ce calque d'élément ne répondra plus au mouvement de la souris, ce qui rendra les utilisateurs étranges.
2 Si la fonction de gestionnaire onmouseup est liée au calque d'élément. L'événement ne peut pas être déclenché. La conséquence est qu'une fois que l'utilisateur souhaite supprimer ce calque d'éléments, le calque d'éléments continue de répondre au mouvement de la souris. Cela provoquera plus de confusion (?)
Donc, dans cet exemple, le bouillonnement d'événements est très utile, car placer vos fonctions de gestionnaire au niveau de la page garantit qu'elles peuvent toujours être exécutées
10. Éteignez-le (pour éviter que les événements ne bouillonnent)
Mais en général, vous souhaiterez désactiver toutes les bulles et toutes les captures pour vous assurer que les fonctions ne se perturbent pas. De plus, si la structure de votre document est assez complexe (de nombreux tableaux imbriqués les uns dans les autres, etc.), vous souhaiterez peut-être désactiver le bullage pour économiser les ressources système. À ce stade, le navigateur doit vérifier chaque ancêtre de l'élément cible pour voir s'il possède une fonction de gestionnaire. Même si personne n'est trouvé, la recherche prend encore beaucoup de temps
Dans le modèle Microsoft, vous devez définir la propriété CancelBubble de l'événement sur true{
if (!e) var e = window.event;
e.cancelBubble = true;
if (e.stopPropagation) e.stopPropagation();
}
Il n'y a aucun mal à définir CancelBubble dans les navigateurs prenant en charge l'attribut CancelBubble. Le navigateur haussera les épaules et créera cet attribut. Bien sûr, cela n'annule pas vraiment le bouillonnement, mais cela garantit au moins que cette commande est sûre et correcte
11. cible actuelle
Comme nous l'avons vu précédemment, un événement utilise l'attribut target ou srcElement pour indiquer sur quel élément cible l'événement s'est produit (c'est-à-dire l'élément sur lequel l'utilisateur a initialement cliqué). Dans notre cas c'est l'élément 2 car nous avons cliqué dessus.
Il est très important de comprendre que l'élément cible lors de la phase de capture ou de bullage ne change pas, il est toujours associé à l'élément 2.
Mais supposons que nous lions la fonction suivante
element2.onclick = doSomething;
12. Problèmes avec le modèle Microsoft
Mais lorsque vous utilisez le modèle de liaison d'événements Microsoft, le mot-clé this n'est pas équivalent à l'élément HTML. Lenovo ne dispose pas d'un modèle Microsoft similaire à la propriété currentTarget (?) - si vous suivez le code ci-dessus, vous signifierez :
element2.attachEvent('onclick',doSomething)
J'espère pouvoir bientôt ajouter des propriétés de type currentTarget - ou suivre la norme ? Les développeurs Web ont besoin de ces informations
Post-scriptum :
Comme je n'ai jamais utilisé JavaScript en pratique, il y a certaines parties de cet article que je ne comprends pas très bien, je ne peux donc les traduire que brusquement, comme la section sur l'effet glisser si vous avez des ajouts ou. questions, vous pouvez me laisser un message. Merci pour votre soutien !