Cet article présente principalement des informations pertinentes sur l'explication détaillée de la délégation d'événement en JavaScript. Les amis qui en ont besoin peuvent s'y référer
J'ai vu une question d'entretien ces jours-ci, qui vous demandait probablement de donner 1 000 li Comment. dois-je ajouter un événement de clic ? La première impression de la plupart des gens peut être d'en ajouter un à chaque li. Si tel est le cas, on estime qu'ils seront GG lors de l'interview, nous avons ici retiré nos mécanismes de bouillonnement et de capture d'événements. ainsi que les mécanismes de délégation d'événements, examinons lentement ce qui précède
Parlons d'abord du bouillonnement d'événements et des mécanismes de capture d'événements. La capture d'événements a été proposée par Netscape. les deux sociétés étaient à couteaux tirés. Plus tard, le W3C n'a eu d'autre choix que d'adopter une méthode de compromis. Lorsqu'un événement se produit, il est d'abord capturé puis diffusé.
Habituellement, il existe trois façons d'écouter les événements. en js, à savoir :
ele.addEventListener(type,listener,[useCapture]);//IE6~8 ne prend pas en charge
ele.attachEvent ('on'+type,listener);//Supporté par IE6~10, non pris en charge par IE11
ele.onClick=function(){} ;//Tous les navigateurs prennent en charge
La spécification w3c définit trois étapes d'événement, qui sont l'étape de capture, l'étape cible et l'étape de bouillonnement. Dans la réglementation du niveau dom2 spécifiée par w3c, c'est addEventListener qui écoute les événements. nous utiliserons addEventListener pour expliquer. Tout d'abord, les bulles sont comme lorsque vous jetez une pierre dans l'eau, les bulles dans l'eau surgissent du bas, ce qui signifie qu'une fois l'événement déclenché, les bulles montent. L'élément enfant vers l'élément parent déclenche la direction, tandis que le mécanisme de capture est exactement le contraire. Le mécanisme de capture déclenche des événements de l'élément parent vers l'élément enfant, et le troisième paramètre de la fonction addEventListener est utilisé pour décider d'utiliser ou non l'élément enfant. mécanisme de capture ou mécanisme de bouillonnement. Lorsque useCapture est vrai, c'est le mécanisme de capture. Lorsque useCapture est faux, c'est le mécanisme de bouillonnement. Regardons l'exemple :
Copier le code
<p class="parent"> <p class="child"> </p> </p> <script> var parent = document.getElementsByClassName('parent')[0]; var child = document.getElementsByClassName('child')[0]; parent.addEventListener('click',function(){ console.log("这里是父元素"); },false); child.addEventListener('click',function(){ console.log("这里是子元素"); },false); </script>
Alors comment résoudre cet inconvénient Une méthode est la délégation d'événements. Cette méthode vous permet d'éviter d'ajouter des événements à chaque nœud un par un. Ce qu'elle fait, c'est lier ces événements d'écoute aux éléments parents de ces nœuds. element La fonction d'écoute de on détermine automatiquement quel élément enfant a déclenché l'événement, afin que l'élément enfant qui a déclenché l'événement puisse être utilisé. L'exemple que nous donnons ici est un exemple donné par Davidwalsh :
Maintenant, nous avons un parent. élément ul et plusieurs éléments enfants li,
Ce que nous voulons réaliser maintenant, c'est que lorsque nous cliquons sur chaque nœud li, le contenu du nœud li sera affiché, selon la méthode d'écriture ci-dessus, vous pouvez sélectionner ces li, leur ajouter ces méthodes, puis les supprimer lorsqu'elles ne sont plus nécessaires. S'il y en a 100 li ou 1 000 li, cela deviendra votre cauchemar. Mieux vaut ajouter un événement d'écoute au parent. élément. La question suivante est de savoir comment déterminer sur quel li a été cliqué ? Nous pouvons juger la cible de l'événement en cours dans l'événement d'écoute pour déterminer si c'est le nœud que nous recherchons. Ici, nous avons un exemple simple :<ul id="parent-list"> <li id="post-1">Item 1</li> <li id="post-2">Item 2</li> <li id="post-3">Item 3</li> <li id="post-4">Item 4</li> <li id="post-5">Item 5</li> <li id="post-6">Item 6</li> </ul>
// 找到父元素,绑定一个监听事件 document.getElementById("parent-list").addEventListener("click", function(e) { // e.target是点击的元素 // 如果它是li元素 if(e.target && e.target.nodeName == "LI") { // console.log("List item ", e.target.id.replace("post-", ""), " was clicked!"); } });
document.getElementById("myp").addEventListener("click",function(e) { // e.target 就是当前被点击的元素 if (e.target && e.target.matches("a.classA")) { console.log("Anchor element clicked!"); } });
Articles connexes :
Vue.jsÉtapes détaillées pour développer le framework mpvue
Explication détaillée des étapes des fichiers js et css
lorsque vous devez parcourir plusieurs irréguliers tableaux dimensionnels
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!