JS: 事件委托

作者: 写代码的海怪 | 来源:发表于2019-01-29 04:06 被阅读47次

本文翻译:JavaScript Event Delegation, and event.target vs. event.currentTarget

事件委托在算是JS里比较流行的技术了。它可以让我们添加监听器到父元素上,来避免监听每个子元素。下面我就用一个简单的例子来说明吧。

比如说现在一个列表里有几千个子元素:

<body>
  <div id="container">
   <ul id="list">
     <li><a href="#">Item 1</a></li>
     <li><a href="#">Item 2</a></li>
     <li><a href="#">Item 3</a></li> 
     <li><a href="#">Item 4</a></li>
     ..................................
     <li><a href="#">Item 1000</a></li>
   </ul>
  </div>
</body>

如果我们遍历每个 <a> 元素然后一个一个监听事件的话那就瞬间爆炸了。当 JS 来创建这些元素的时候,页面就会变得很卡。

所以这就有了事件委托:当事件冒泡到 body 元素,我们可以使用 event.target 来检查是哪个元素被点击了。

document.addEventListener("click", function(e) {
  if(e.target && e.target.nodeName == "A") {
  console.log("List item ", e.target.textContent, " was clicked!");
  }
});

// When we click the 2nd item, the page prints out:

"List item Item 2 was clicked!"

target vs currentTarget

既然我们说到了 event.target,那就再说说 JS 事件里另一个属性 event.currentTarget。看 JS 文档的话可能看得有点晕。

现在我们从上面例子看到当点击 a 元素时,click 事件就会冒泡到 <body> 节点,就像这样:

<a> → <li> → <ul> → <div> → <body>

现在多加一行代码打印出 e.currentTarget,来看看这是什么鬼。

document.addEventListener(“click”, function(e) {
  if(e.target && e.target.nodeName == “A”) {
    console.log(“List item “, e.target.textContent, “ was clicked!”);  // "List item Item 2 was clicked!"
  }
  console.log(e.currentTarget);  // #document
});

结果是它打印出了 "document" ,因为我们是在 document 上绑定的监听事件。而 e.target 指向的是我们点击的那个 <a> 元素。

我们再做一些改变来看看 targetcurrentTarget 的不同。这次,我们在 <ul> 里添加监听事件。

document.getElementById(“list”).addEventListener(“click”, function(e) {
  console.log(e.currentTarget);  //<ul><li>...</li><ul>
  console.log(e.target);         //<a href="#">Item 2</a>
);

我们可以得出结论:currentTarget 指向的是监听器直接绑定的那个元素,而 target 指向的是我们点击的那个元素。

有了 target 和 currentTarget 这两个属性,我们可以在事件触发的时候更简单地操作触发事件的 DOM 元素和绑定监听器的 DOM 元素。

相关文章

  • web前端面试题@六(事件委托)

    *说到事件委托,我们首先先要知道什么是事件委托—— · 那么什么是事件委托呢??? JS里的事件委托就是当事件...

  • JS写事件代理

    js中的事件委托或是事件代理详解

  • 事件委托

    事件委托 事件委托其实就是利用JS事件冒泡机制把原本需要绑定在子元素的响应事件(click、keydown……)委...

  • js事件委托

    通过构建父元素和子元素,来控制事件。 先通过html构建父元素div,并嵌套一个子元素div,写入不同的方法,设置...

  • js事件委托

    事件委托:1、缘由在做一个项目,点击按钮出现蒙版,但是触发蒙版关闭蒙版,但是给蒙版添加点击事件的话,蒙版上的按钮也...

  • js事件委托

    我们收取快递有两种方法:一是在特定的地点等快递的到来,二是委托人代收。现实当中,我们大都采用委托的方案。而委托人接...

  • JS事件委托

    一、事件委托有三种方法 点击 btn.onclick = function(){...} btn.addEvent...

  • js事件委托

    前言 事件委托,也叫事件代理,是js事件中的一种常用技巧。事件委托的原理就是利用冒泡事件的机制,为一些节点的祖先节...

  • js事件委托

    定义:通俗的讲,事件就是onclick,onmouseover,onmouseout等就是事件,委托呢,就是让别人...

  • JS事件委托

    事件委托从字面意思上理解就是把事件委托给别人做。这样有什么好处呢?设想一下,一个ul里有很多li,现在要给每一个l...

网友评论

    本文标题:JS: 事件委托

    本文链接:https://www.haomeiwen.com/subject/rlstsqtx.html