彻底弄懂小程序e.target与e.currentTarget

一、小程序中关于事件对象 e 的属性中有两个特别重要的属性:target与currentTarget属性:对于这两个属性,官方文档上的解释是:

事件源组件对象

当前组件对象

可能这两句解释有点官方,反正我一开始看的时候是稀里糊涂、丈二和尚摸不着头脑,为了弄清楚它们之间的区别,我写了一个简单的代码,代码如下:

  
    outer view
     
       middle view
       
         inner view
        
     
  
 
 tap1: function(e){
   console.log(1,e)  
 }
 
 tap2: function(e){
   console.log(2,e)  
 }
 tap3: function(e){
   console.log(3,e)  
 }

可以看到,tap1与tap3使用的是bind关键字绑定tap事件,因为tap事件属于冒泡事件,所以会发生事件冒泡。


Gaoxiaobai.png

从上图可以看到,点击子元素inner,因为子元素使用bind关键字并且tap又是冒泡事件,所以点击inner,父元素middle也会触发tap事件,但是由于middle使用catch关键字,所以tap事件将不会向上传播到outer元素,因此上图中只显示2和3。从这张图可以明确看出:

e.target是tap点击事件触发的对象(也就是点击的是谁)

e.currentTarget是事件绑定在哪个元素上(也就是这个事件在哪个组件上)。

当事件没有冒泡行为时,e.target与e.currentTarget都指向事件触发的对象。代码如下,tap1、tap2、tap3都是用catch关键字绑定,所以不会发生冒泡行为


    outer view
   
      middle view
       
        inner view
      
    

 
 tap1: function(e){
   console.log(1,e)  
 }
 
tap2: function(e){
   console.log(2,e)  
 }
 tap3: function(e){
   console.log(3,e)  
 }
Gaoxiaobai.png

Gaoxiaobai.png

二、你不知道的小程序事件的猫腻

1、小程序中的事件分为两类:冒泡事件与非冒泡事件

冒泡事件有:touchstart touchmove touchend longtap tap这五个事件,其余的事件为

2、冒泡事件冒泡的条件:父元素与子元素绑定同一类事件并且子元素的绑定方式是bind(catch开头会阻止事件冒泡),代码如下:


 
      outer
      
          inner
      
  
  
  tap1: function(e){
    console.log(1,e)  
 }
 
 tap2: function(e){
 console.log(2,e) 

在inner元素上,长按inner会输出2,对象e,长按事件的事件默认为350ms后触发事件,在松开手后会触发tap1事件。这里我就偷点懒就不贴图了。

4、父元素使用touchstart touchmove touchend事件,将会覆盖子元素的事件;例如子元素#inner 绑定tap事件,父元素#outer 绑定touchstart事件,点击子元素,只会触发父元素的touchstart事件;

但是,在打印出来的事件对象 e 的结果中,e.target 显示的是事件触发的元素(inner),e.currentTarget显示的是这个touchstart事件绑定的组件(这里是outer)

你可能感兴趣的:(彻底弄懂小程序e.target与e.currentTarget)