e.target 与 e.currentTarget

MDN 中对 target的解释为:一个触发事件的对象的引用,当事件处理程序在事件的冒泡或捕获阶段被调用时。
对于 currentTarget的解释为:当事件遍历DOM时,标识事件的当前目标。它总是引用事件处理程序附加到的元素,而不是event.target,它标识事件发生的元素。
举个例子来说明:

事件冒泡阶段




  
  JS Bin


  
  • hello 1
  • hello 2
  • hello 3
  • hello 4

我们知道,e.target可以用来实现事件委托,该原理是通过事件冒泡(或者事件捕获)给父元素添加事件监听,e.target指向引发触发事件的元素,如上述的例子中,e.target指向用户点击的li,由于事件冒泡,li的点击事件冒泡到ul上,通过ul添加监听事件而达到了给每一个li添加监听事件的效果,而e.currentTarget指向的是给绑定事件监听的那个对象,即ul,从这里可以发现,e.currentTarget===this返回true,而e.target===this返回false。所以e.targee.currentTarget是不相等的。

注意:在jq提供的on方法中,e.currentTarget与该方法接收的第二个参数有关,根据jq的文档描述

如果省略selector或者是null,那么事件处理程序被称为直接事件或者直接绑定事件。每次选中的元素触发事件时,就会执行处理程序,不管它直接绑定在元素上,还是从后代(内部)元素冒泡到该元素的。
当提供了selector参数是,事件处理程序是指委派事件(事件委托或事件代理)。事件不会在直接绑定的元素上触发。jq会从 event target 开始向上层元素(例如,由最内层元素到最外层元素)开始冒泡,并且在传播路径上所有绑定了相同事件的元素若满足匹配的选择器,那么这些元素上的事件也会被触发。




  
  
  JS Bin
  


  
  • hello 1
  • hello 1
  • hello 1
  • hello 1

li元素中含有自元素的时候,e.target指的是触发事件的元素,可能是spsn也可能是li,此时的e.tcurrentTarget指的是selector那个参数,也就是本例中的li。如果省略selector参数,那么它和addEventListener中的e.targete.currentTarget是一致的。

事件目标阶段

在DOM事件流中分为几个不同的阶段,如图所示:

e.target 与 e.currentTarget_第1张图片
1620777-dafb1778461af7d9.png

上述例子中是事件冒泡阶段,e.currentTargete.target是不相等的,但是在事件的目标阶段,e.currentTargete.target是相等的。




  
  JS Bin


  
  • hello 1
  • hello 2
  • hello 3
  • hello 4

在本例中,事件的目标阶段li,由于e.currentTarget始终指向添加监听事件的那个对象,即aLi[i],也就是HTML中的li,而e.target指向触发事件监听的那个对象,也是li,因此e.targete.currentTarget相等,同时也和this相等。

总结

  • e.target指向触发事件监听的对象。
  • e.currentTarget指向添加监听事件的对象。

你可能感兴趣的:(e.target 与 e.currentTarget)