Table des matières
Premièrement, un contexte
Conseils
déboguer
Exemple
Maison interface Web tutoriel CSS Créons un bus d'événement natif léger en JavaScript

Créons un bus d'événement natif léger en JavaScript

Apr 01, 2025 am 04:43 AM

Créons un bus d'événement natif léger en JavaScript

Event Bus est un modèle de conception (bien que nous discuterons de JavaScript ici, c'est un modèle de conception dans n'importe quelle langue) qui peut être utilisé pour simplifier la communication entre les différents composants. Il peut également être considéré comme une publication / abonnement ou un pubsub.

L'idée est que les composants peuvent écouter le bus de l'événement pour comprendre quand leurs opérations sont effectuées. Par exemple, le composant du panneau d'onglet peut écouter les événements indiquant qu'il modifie l'onglet actif. Bien sûr, cela peut être causé en cliquant sur l'un des onglets, il est donc entièrement géré dans ce composant. Cependant, avec le bus de l'événement, certains autres éléments peuvent dire à l'onglet de modifier. Imaginez une erreur dans laquelle la soumission de formulaire amène l'utilisateur à recevoir une alerte dans un onglet spécifique, donc le formulaire envoie un message au bus d'événements, en demandant au composant onglet de modifier l'onglet actif en un onglet contenant l'erreur. C'est à quoi il ressemble dans le bus de l'événement.

Le pseudo-code pour cette affaire est le suivant…

 // Tab composant onglets.Changetab = id => {
  // modifie l'opération DOM de l'onglet actif.
};
MyEventBus.Subscribe ("Change-Tab", Tabs.ChangeTab (ID));

// Autres composants ...
// quelque chose se passe, puis:
MyEventBus.Publish ("Change-Tab", 2);
Copier après la connexion

Avez-vous besoin d'une bibliothèque JavaScript pour implémenter cela? (Astuce Question: vous n'avez jamais besoin d'une bibliothèque JavaScript). Eh bien, il existe de nombreuses options:

  • Pubsubjs
  • EventEmitter3
  • Postal.js
  • JQuery prend même en charge les événements personnalisés, ce qui est très pertinent pour ce modèle.

Consultez également Mitt, une bibliothèque avec seulement 200 octets de GZIP. Ce modèle simple a inspiré les gens à le résoudre par eux-mêmes d'une manière aussi concise que possible.

Faisons-le nous-mêmes! Nous n'utilisons aucune bibliothèque tierce, mais profitons plutôt du système d'écoute d'événements qui est déjà intégré à JavaScript, addEventListener que nous connaissons tous et que nous aimons.

Premièrement, un contexte

L'API addEventListener dans JavaScript est une fonction membre de EventTarget . La raison pour laquelle nous pouvons lier l'événement de clic au bouton est que l'interface prototype de ( HTMLButtonElement ) est indirectement héritée de EventTarget .

Contrairement à la plupart des autres interfaces DOM, vous pouvez utiliser le new mot-clé pour créer directement EventTarget . Il est pris en charge dans tous les navigateurs modernes, mais seulement récemment. Comme nous pouvons le voir dans la capture d'écran ci-dessus, Node hérite EventTarget , de sorte que tous les nœuds DOM ont une méthode addEventListener .

Conseils

Je recommande d'utiliser un type de nœud extrêmement léger comme bus d'écoute d'événements: commentaires HTML ( <!-- --> ).

Pour les moteurs de rendu de navigateur, les commentaires HTML ne sont que des commentaires dans le code et n'ont aucune fonctionnalité autre que de fournir du texte descriptif aux développeurs. Cependant, comme les commentaires sont toujours écrits en HTML, ils finissent par apparaître dans le DOM en tant que vrais nœuds et ont leur propre interface prototype - Comment - qui hérite de Node .

La classe Comment peut être créée directement à partir de new , tout comme EventTarget :

 const MyEventBus = nouveau commentaire («my-event-bus»);
Copier après la connexion

Nous pouvons également utiliser l' document.createComment antique mais largement soutenue. API de création. Il nécessite un paramètre de données, c'est-à-dire le contenu du commentaire. Cela peut même être une chaîne vide:

 const MyEventBus = document.CreateComment («my-event-bus»);
Copier après la connexion

Maintenant, nous pouvons utiliser dispatchEvent pour publier un événement, qui accepte un objet Event . Pour transmettre les données d'événements définies par l'utilisateur, utilisez CustomEvent , où le champ detail peut être utilisé pour contenir des données.

 MyEventbus.DispatchEvent (
  Nouveau garde-gueule ('événement-nom', {
    Détail: «Data d'événements»
  })
));
Copier après la connexion

Internet Explorer 9-11 prend en charge CustomEvent , mais aucune version ne prend en charge new CustomEvent . Utiliser document.createEvent pour le simuler est complexe, donc si le support IE est important pour vous, il existe un moyen de le remplir.

Maintenant, nous pouvons lier l'auditeur d'événements:

 MyEventBus.AddeventListener ('Event-Name', ({Detail}) => {
  console.log (détail); // => événement-données
});
Copier après la connexion

Si l'événement est destiné à tirer une seule fois, nous pouvons utiliser { once: true } pour une liaison unique. D'autres options ne conviennent pas ici. Pour supprimer l'écouteur d'événements, nous pouvons utiliser le natif removeEventListener .

déboguer

Le nombre d'événements liés à un seul bus d'événements peut être très important. Si vous oubliez de les supprimer, il peut également y avoir une fuite de mémoire. Et si nous voulons savoir combien d'événements sont liés à myEventBus ?

myEventBus est un nœud DOM, donc Devtools dans le navigateur peut le vérifier. Là, nous pouvons trouver l'événement dans l'onglet Elements → Événement d'événement. Assurez-vous de décocher "ancêtre" pour masquer les événements liés document et à window .

Exemple

Un inconvénient est que la syntaxe de EventTarget est légèrement verbeux. Nous pouvons écrire un simple wrapper pour cela. Voici une démonstration en dactylographie:

 Class Eventbus<detailtype any> {
  EventtTarget privé: EventTarget;
  constructeur (description = '') {this.eventtarget = document.appendChild (document.CreateComment (Description)); }
  sur (Type: String, auditeur: (événement: Customevent<detailtype> ) => void) {this.eventtarget.addeventListener (type, écouteur); }
  Une fois (Type: String, auditeur: (événement: Customevent<detailtype> ) => void) {this.eventtarget.addeventListener (type, écouteur, {une fois: true}); }
  OFF (Type: String, auditeur: (événement: Customevent<detailtype> ) => void) {this.eventtarget.reMoveEventListener (type, écouteur); }
  EMIT (Type: String, Detail ?: DetailType) {return this.eventtarget.dispatchEvent (new Customevent (type, {Detail})); }
}

// usage const MyEventbus = New Eventbus<string> («my-event-bus»);
MyEventBus.on ('Event-Name', ({Detail}) => {
  console.log (détail);
});

MyEventBus.once ('Event-Name', ({Detail}) => {
  console.log (détail);
});

MyEventBus.Emit («Événement-nom», «bonjour»); // => Bonjour bonjour
MyEventBus.Emit («Événement-nom», «monde»); // => monde</string></detailtype></detailtype></detailtype></detailtype>
Copier après la connexion

La démonstration suivante fournit un JavaScript compilé.

C'est ça! Nous venons de créer un bus d'écoute d'événements sans dépendance où un composant peut informer un autre composant des modifications pour déclencher une action. Faire de telles opérations ne nécessite pas de bibliothèque complète, et la possibilité de s'allumer est illimité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

<🎜>: Bubble Gum Simulator Infinity - Comment obtenir et utiliser les clés royales
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
<🎜>: Grow A Garden - Guide de mutation complet
3 Il y a quelques semaines By DDD
Nordhold: Système de fusion, expliqué
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Whispers of the Witch Tree - Comment déverrouiller le grappin
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel Java
1673
14
Tutoriel PHP
1278
29
Tutoriel C#
1257
24
Une comparaison des fournisseurs de formulaires statiques Une comparaison des fournisseurs de formulaires statiques Apr 16, 2025 am 11:20 AM

Essayons de savoir un terme ici: "fournisseur de formulaire statique". Vous apportez votre HTML

Une preuve de concept pour rendre Sass plus rapidement Une preuve de concept pour rendre Sass plus rapidement Apr 16, 2025 am 10:38 AM

Au début d'un nouveau projet, la compilation SASS se produit en un clin d'œil. Cela se sent bien, surtout quand il est associé à BrowSersync, qui recharge

Actualités hebdomadaires de la plate-forme: attribut HTML Loading, les principales spécifications Aria et le passage de iframe à Shadow Dom Actualités hebdomadaires de la plate-forme: attribut HTML Loading, les principales spécifications Aria et le passage de iframe à Shadow Dom Apr 17, 2025 am 10:55 AM

Dans cette semaine, le Roundup des nouvelles de la plate-forme, Chrome présente un nouvel attribut pour le chargement, les spécifications d'accessibilité pour les développeurs Web et la BBC Moves

Certains pratiques avec l'élément de dialogue HTML Certains pratiques avec l'élément de dialogue HTML Apr 16, 2025 am 11:33 AM

C'est moi qui regarde l'élément HTML pour la première fois. J'en ai été conscient depuis un certain temps, mais il ne l'a pas encore pris pour un tour. Il a un peu cool et

Forme de papier Forme de papier Apr 16, 2025 am 11:24 AM

L'achat ou la construction est un débat classique de la technologie. Construire des choses vous-même peut être moins cher car il n'y a pas d'article de ligne sur votre facture de carte de crédit, mais

Actualités de plate-forme hebdomadaire: bookmarklet d'espacement de texte, attente de haut niveau, nouvel indicateur de chargement d'ampli Actualités de plate-forme hebdomadaire: bookmarklet d'espacement de texte, attente de haut niveau, nouvel indicateur de chargement d'ampli Apr 17, 2025 am 11:26 AM

Au cours de cette semaine, un Bookmarklet pratique pour inspecter la typographie, en utilisant Await pour bricoler comment les modules JavaScript s'importent, ainsi que Facebook & # 039; S

Où devrait «abonner au podcast» vers le lien? Où devrait «abonner au podcast» vers le lien? Apr 16, 2025 pm 12:04 PM

Pendant un certain temps, iTunes était le grand chien du podcasting, donc si vous avez lié "Abonnez-vous au podcast" pour aimer:

Options pour héberger vos propres analyses non-javascript Options pour héberger vos propres analyses non-javascript Apr 15, 2025 am 11:09 AM

Il existe de nombreuses plates-formes d'analyse pour vous aider à suivre les données des visiteurs et d'utilisation sur vos sites. Peut-être plus particulièrement Google Analytics, qui est largement utilisé

See all articles