11
votes

L'ordre des auditeurs d'événements multiples

J'ai rencontré une bizarrerie lors de l'utilisation de prototypes pour gérer des événements clic. Si vous cliquez sur le bouton dans le code ci-dessous, il déclenchera trois alertes: «Cliquez sur 1 ',' Cliquez sur 2 'et' Cliquez sur 3 '. Les navigateurs modernes invoquent les auditeurs dans l'ordre dans lequel elles sont enregistrées, tandis que IE8 (et peut-être plus anciennes, c'est-à-dire versions également) les invoquera dans l'ordre inverse. Je trouve cet étrange parce que je pensais que le prototype maintenu et exécut une file d'attente d'auditeurs, qui devrait être indépendante du navigateur. N'est-ce pas si? Sinon, les auditeurs d'événements sont-ils censés être exécutés dans un certain ordre ou sont-ils asynchrones et donc leur ordre non pertinent? XXX


0 commentaires

3 Réponses :



20
votes

prototype s'appuie sur le mécanisme de cuisson sous-jacent du navigateur pour la commande (toutes les bibliothèques ne font pas ci-dessous). L'ordre dans lequel les manipulateurs d'événements sont tirés n'a pas été garanti par les événements DOM Strongs à l'origine. Du Spécification des événements DOM2 :

Bien que tous les EventListeners sur le EventTarget soient déclenchés par tout événement reçu par ce EventTarget , aucune spécification n'est faite à l'ordre dans lequel ils recevront l'événement en ce qui concerne l'autre eventListeners sur le eventTarget .

La grande majorité des implémentations de navigateur (chrome, firefox, opéra, etc.), y compris IE9, incendient les gestionnaires de l'ordre dans lequel ils étaient attachés. IE8 et plus tôt le font l'inverse.

Le plus récent Spec de l'événement DOM3 , toujours Un travail en cours introduit l'exigence qu'ils soient tirés par ordre d'enregistrement (ce que la plupart des navigateurs font):

Ensuite, la mise en œuvre doit déterminer les auditeurs d'événements candidats de la cible actuelle. Cela doit être la liste de tous les auditeurs d'événements enregistrés sur la cible actuelle de leur ordre d'enregistrement.

... qui fait probablement partie de la raison pour laquelle IE9 fait-il que maintenant (c'est-à-dire la prise en charge de Microsoft de Microsoft pour les normes d'événements, ajoutant AddeventListener , etc.).

Certaines bibliothèques JavaScript (jQuery Par exemple) DO garantissent la commande quel que soit le navigateur, en ne fixant qu'un seul gestionnaire par événement par élément et en conservant leur propre liste de manutentionnaires de code d'utilisateur. < / p>


0 commentaires

1
votes

comme un commentaire formaté de @ t.j. La réponse de Crowder, j'ai testé quels navigateurs modernes déclenchent réellement les auditeurs dans la commande d'enregistrement.

2016-10-06: Les résultats sont que tous les navigateurs suivants font: Chrome 53, Firefox 49, Safari 9, Opéra 40, Ie 11 et Edge 13 via VirtualBox sur Mac Host.

Le code de mon test peut être trouvé ici: https://github.com/lingtalfi/browrowsers-behaviours/blob/master/listeners-executiondOrder/listeners.md


0 commentaires