L'une des tâches les plus courantes du développement Web est la gestion des événements. Notre code JavaScript écoute habituellement les événements envoyés par les éléments DOM..
Voici comment nous obtenons des informations de la part de l’utilisateur: c’est-à-dire qu’il clique, tape, tape, interagit avec notre page et que nous devons le savoir dès que cela se produit. L'ajout d'auditeurs d'événement semble trivial mais pourrait être un processus difficile.
Dans cet article, nous verrons un problème de cas réel et sa solution 1.6K.
Un de mes amis travaille en tant que développeur junior. En tant que tel, il n'a pas beaucoup d'expérience avec JavaScript en vanille; Cependant, il a dû commencer à utiliser des frameworks tels que AngularJS et Ember sans avoir la compréhension fondamentale de la relation DOM-à-JavaScript. Au cours de son mandat en tant que développeur junior, il a été chargé d'un petit projet: sites Web de campagne d'une page ne nécessitant presque pas de JavaScript. Il a fait face à un petit mais très intéressant problème qui m'a finalement conduit à écrire Bubble.js.
Imaginez que nous avons un popup. Un bien stylé Voici le code que nous utilisons pour afficher un message: Nous avons une autre fonction Par exemple, disons que nous devons implémenter une logique supplémentaire si les problèmes se présentent un par un. Disons qu'il faut ajouter deux boutons au contenu de la popup - Oui et Non. Alors, comment saurons-nous que l'utilisateur clique dessus? Nous devons ajouter des écouteurs d'événements à chacun des liens.. Par exemple: Le code ci-dessus fonctionne lors de la première exécution. Que se passe-t-il si nous avons besoin d'un nouveau bouton, ou pire encore, si nous avons besoin d'un type de bouton différent? C’est-à-dire que si nous continuions à utiliser Voici où les problèmes deviennent visibles: Il doit y avoir un meilleur moyen de le faire. Oui, il y a une meilleure approche. Et non, la solution est de ne pas utiliser de framework. Avant de révéler la réponse, parlons un peu des événements de l’arborescence DOM.. Les événements sont une partie essentielle du développement Web. Ils ajoutent une interactivité à nos applications et agissent comme un pont entre la logique métier et l'utilisateur. Chaque élément DOM peut envoyer des événements. Tout ce que nous avons à faire est de souscrire à ces événements et de traiter l'objet Event reçu.. Il y a un terme propagation d'événement qui se tient derrière événement bouillonnant et capture d'événements deux méthodes de gestion des événements dans DOM. Utilisons le balisage suivant et voyons la différence entre eux. Nous allons attacher Une fois que nous avons appuyé sur le lien, nous voyons la sortie suivante dans la console: Ainsi, en effet, les deux éléments reçoivent le En utilisant Parfois, nous pouvons avoir besoin d'inverser l'ordre et faire en sorte que l'événement soit capturé par l'élément externe. Pour ce faire, nous devons utiliser un troisième paramètre dans C’est ainsi que notre navigateur traite les événements lorsque nous interagissons avec la page.. D'accord, alors pourquoi avons-nous consacré une partie de l'article à la bulle et à la capture? Nous les avons mentionnées parce que la bulle est la solution de nos problèmes avec le popup. Nous devrions paramétrer les auditeurs de l'événement non pas sur les liens, mais sur les En suivant cette approche, nous éliminons les problèmes énumérés au début.. Le code ci-dessus est meilleur que celui avec lequel nous avons commencé. Cependant, cela ne fonctionne toujours pas de la même manière. Comme nous l'avons dit, Nous sommes allés chercher la valeur du Cependant, ce n’est pas une bonne idée d’utiliser le Notre code devient un peu mieux aussi. Nous pouvons supprimer les guillemets utilisés dans Le résultat pourrait être vu dans ce JSBin. J'ai appliqué la solution ci-dessus dans plusieurs projets, il était donc logique de l'envelopper dans une bibliothèque. Il s’appelle Bubble.js et est disponible dans GitHub. C'est un fichier 1.6K qui fait exactement ce que nous avons fait ci-dessus. Transformons notre exemple de popup pour utiliser Au lieu de Une fois que nous incluons Il existe également une syntaxe alternative: Par défaut, Le gestionnaire JavaScript reçoit toujours l'objet Event. Donc, dans ce cas, nous pouvons afficher le texte du champ: Parfois, nous devons attraper non pas un mais plusieurs événements envoyés par le même élément. Trouvez la variante finale dans un JSBin ici. La solution fournie dans cet article repose entièrement sur l'événement bouillonnant. Dans certains cas Par exemple: Si nous plaçons la souris sur "choisir" et effectuons un clic, l’élément qui distribue l’événement n’est pas le Certes, la communication avec le DOM est une partie essentielle de notre développement d’applications, mais il est de pratique courante que nous utilisions des frameworks pour contourner cette communication.. Nous n'aimons pas ajouter des auditeurs encore et encore. Nous n'aimons pas le débogage d'étranges bogues de déclenchement d'événements doubles. La vérité est que si nous savons comment fonctionne le navigateur, nous pouvons éliminer ces problèmes. Bubble.js n’est qu’un résultat de quelques heures de lecture et d’une heure de codage - c’est notre solution 1,6K à l’un des problèmes les plus courants.var popup = document.querySelector ('. popup'); var showMessage = function (msg) popup.style.display = 'block'; popup.innerHTML = msg; … ShowMessage ('Chargement en cours. Veuillez patienter.');
masquerMessage
cela change la afficher
propriété à aucun
et cache le popup. L'approche peut fonctionner dans le cas le plus générique, mais présente encore quelques problèmes. var content = 'Êtes-vous sûr?
'; content + = 'Yes'; content + = 'No'; showMessage (contenu); var addListeners = function (yesCB, noCB) popup.querySelector ('. popup - yes'). addEventListener ('click', yesCB); popup.querySelector ('. popup - no'). addEventListener ('click', noCB); showMessage (contenu); addListeners (function () console.log ('le bouton Oui a été cliqué');, function () console.log ('le bouton Non a été cliqué'););
des éléments mais avec des noms de classe différents? Nous ne pouvons pas utiliser le même
addListeners
il est ennuyeux de créer une nouvelle méthode pour chaque variation de popup.
voir le message
appel. Nous devons penser à cela tout le temps et synchroniser les deux processus.apparaitre
variable. Nous devons appeler son querySelector
fonction au lieu de document.querySelector
. Sinon, nous pourrions sélectionner un mauvais élément.addEventListener
appels. Il n'est pas sec du tout.Comprendre la gestion des événements
Cliquez sur
gestionnaires d'événements aux deux éléments. Cependant, comme ils sont imbriqués les uns dans les autres, ils recevront tous les deux Cliquez sur
un événement.document.querySelector ('. wrapper'). addEventListener ('clic', fonction (e) console.log ('. wrapper cliqué');); document.querySelector ('a'). addEventListener ('click', function (e) console.log ('a clicked'););
un clické .wrapper cliqué
Cliquez sur
un événement. Tout d'abord, le lien et ensuite le stopPropagation
méthode: document.querySelector ('a'). addEventListener ('click', fonction (e) e.stopPropagation (); console.log ('un clic'););
stopPropagation
fonction, nous indiquons que l'événement ne doit pas être envoyé aux parents.addEventListener
. Si on passe vrai
comme valeur nous ferons eprise d'air. Par exemple:document.querySelector ('. wrapper'). addEventListener ('cliquez', fonction (e) console.log ('. wrapper a cliqué');, true); document.querySelector ('a'). addEventListener ('click', function (e) console.log ('a clicked');, true);
La solution
var content = 'Êtes-vous sûr?
'; content + = 'Yes'; content + = 'No'; var addListeners = function () popup.addEventListener ('click', function (e) var link = e.target;); showMessage (contenu); addListeners ();
voir le message
est appelé. Tant que le apparaitre
variable est en vie, nous allons attraper les événements.addListeners
une fois, on utilise le apparaitre
variable aussi une fois. Nous ne devons pas le garder ou le passer entre les méthodes.voir le message
. Nous avons accès à l'ancre cliquée dans cette e.target
pointe sur l'élément pressé.e.target
pointe sur le clic étiquette. Donc, nous allons utiliser cela pour distinguer le Oui et Non boutons.
var addListeners = function (callbacks) popup.addEventListener ('click', function (e) var link = e.target; var buttonType = link.getAttribute ('class'); if (rappels [buttonType]) rappels [ buttonType] (e);); … AddListeners ('popup - yes': function () console.log ('Yes');, 'popup - no': function () console.log ('No');) ;
classe
attribuer et l'utiliser comme une clé. Les différentes classes pointent vers différents rappels. classe
attribut. Il est réservé à l'application de styles visuels à l'élément et sa valeur peut changer à tout moment. En tant que développeurs JavaScript, nous devrions utiliser Les données
les attributs.var content = 'Êtes-vous sûr?
'; content + = 'Yes'; content + = 'No';addListeners
une fonction:addListeners (yes: function () console.log ('Yes');, no: function () console.log ('No'););
Bubble.js
Bubble.js
. La première chose que nous devons changer est le balisage utilisé:var content = 'Êtes-vous sûr?
'; content + = 'Yes'; content + = 'No';action de données
nous devrions utiliser action-bulle de données
. bubble.min.js
dans notre page, nous avons un global bulle
fonction disponible. Il accepte un sélecteur d'élément DOM et renvoie l'API de la bibliothèque. le sur
La méthode est celle qui ajoute les écouteurs:bulle ('. popup') .on ('oui', fonction () console.log ('Oui');) .on ('non', fonction () console.log ('Non'); )
bulle ('. popup'). on (yes: function () console.log ('Yes');, no: function () console.log ('No'););
Bubble.js
écoute Cliquez sur
événements, mais il y a une option pour changer cela. Ajoutons un champ de saisie et écoutons son keyup
un événement:bulle ('. popup'). on (… entrée: fonction (e) console.log ('Nouvelle valeur:' + e.target.value););
action-bulle de données
accepte plusieurs valeurs séparées par une virgule:Les replis
e.target
ne peut pas pointer sur l'élément dont nous avons besoin. tag mais le
envergure
élément.Résumé