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

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

     target:事件源组件对象

     currentTarget:当前组件对象

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

<view id="outter" bindtap="tap1">
   outer view
   <view id="middle" catchtap="tap2">
     middle view
     <view id="inner" bindtap="tap3">
       inner view
      </view>
   </view>
</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事件属于冒泡事件,所以会发生事件冒泡。

  从上图可以看到,点击子元素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关键字绑定,所以不会发生冒泡行为

<view id="outter" catchtap="tap1">
   outer view
   <view id="middle" catchtap="tap2">
     middle view
     <view id="inner" catchtap="tap3">
       inner view
      </view>
   </view>
</view>

tap1: function(e){
  console.log(1,e)  
}

tap2: function(e){
  console.log(2,e)  
}
tap3: function(e){
  console.log(3,e)  
}
 

 

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

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

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

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

<view  id="outer"  bindtap="tap1">
    outer
    <view  id="inner"  catchtap="tap2">
        inner
    </view>
</view>

tap1: function(e){
  console.log(1,e)  
}

tap2: function(e){
  console.log(2,e)  
}

点击inner元素,只会执行tap2事件,

  3、子元素绑定longtap长按事件会触发父元素的tap点击事件

<view  id="outer"  catchtap="tap1">
    outer
    <view  id="inner"  catchlongtap="tap2">
        inner
    </view>
</view>

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之间的区别。

发布了128 篇原创文章 · 获赞 250 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/XU441520/article/details/105232506