recherche
Maisoninterface Webtutoriel CSSCréons un bus d'événement natif léger en JavaScript

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);

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»);

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»);

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»
  })
));

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
});

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>

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
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
Ajout d'ombres de boîte aux blocs et éléments WordPressAjout d'ombres de boîte aux blocs et éléments WordPressMar 09, 2025 pm 12:53 PM

Le CSS Box-Shadow et les propriétés de contour ont gagné le thème. Laissez regarder quelques exemples de la façon dont cela fonctionne dans des thèmes réels et des options que nous devons appliquer ces styles aux blocs et éléments WordPress.

Travailler avec GraphQL CachingTravailler avec GraphQL CachingMar 19, 2025 am 09:36 AM

Si vous avez récemment commencé à travailler avec GraphQL ou examiné ses avantages et ses inconvénients, vous avez sans aucun doute entendu des choses comme "GraphQL ne prend pas en charge la mise en cache" ou

Faire votre première transition Svelte personnaliséeFaire votre première transition Svelte personnaliséeMar 15, 2025 am 11:08 AM

L'API de transition Svelte fournit un moyen d'animer les composants lorsqu'ils entrent ou quittent le document, y compris les transitions Svelte personnalisées.

Barbars CSS personnalisés chics et cool: une vitrineBarbars CSS personnalisés chics et cool: une vitrineMar 10, 2025 am 11:37 AM

Dans cet article, nous plongerons dans le monde des barres de défilement. Je sais, ça ne semble pas trop glamour, mais croyez-moi, une page bien conçue va de pair

Show, ne dit pasShow, ne dit pasMar 16, 2025 am 11:49 AM

Combien de temps passez-vous à concevoir la présentation de contenu pour vos sites Web? Lorsque vous écrivez un nouveau blog ou créez une nouvelle page, pensez-vous à

Construire une application Ethereum à l'aide de Redwood.js et de la fauneConstruire une application Ethereum à l'aide de Redwood.js et de la fauneMar 28, 2025 am 09:18 AM

Avec la récente montée du prix du bitcoin sur 20k $ USD, et pour lui, récemment en train de briser 30k, je pensais que cela valait la peine de reprendre une profonde plongeon dans la création d'Ethereum

Que diable sont les commandes NPM?Que diable sont les commandes NPM?Mar 15, 2025 am 11:36 AM

Les commandes NPM exécutent diverses tâches pour vous, soit en tant que processus unique ou en cours d'exécution pour des choses comme le démarrage d'un serveur ou la compilation de code.

Utilisons (x, x, x, x) pour parler de spécificitéUtilisons (x, x, x, x) pour parler de spécificitéMar 24, 2025 am 10:37 AM

Je discutais avec Eric Meyer l'autre jour et je me suis souvenu d'une histoire d'Eric Meyer de mes années de formation. J'ai écrit un article de blog sur la spécificité CSS, et

See all articles

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

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semainesBy尊渡假赌尊渡假赌尊渡假赌

Outils chauds

SublimeText3 version Mac

SublimeText3 version Mac

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

Dreamweaver Mac

Dreamweaver Mac

Outils de développement Web visuel

PhpStorm version Mac

PhpStorm version Mac

Le dernier (2018.2.1) outil de développement intégré PHP professionnel

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Puissant environnement de développement intégré PHP

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser