徹底弄懂小程序e.target與e.currentTarget


 

   一、小程序中關於事件對象  e  的屬性中有兩個特別重要的屬性:target與currentTarget屬性:對於這兩個屬性,官方文檔上的解釋是:

     target:事件源組件對象

     currentTarget:當前組件對象

  可能這兩句解釋有點官方,反正我一開始看的時候是稀里糊塗、丈二和尚摸不着頭腦,為了弄清楚它們之間的區別,我寫了一個簡單的代碼,代碼如下:

 1 <view id="outter" bindtap="tap1">
 2    outer view
 3    <view id="middle" catchtap="tap2">
 4      middle view
 5      <view id="inner" bindtap="tap3">
 6        inner view
 7       </view>
 8    </view>
 9 </view>
10 
11 tap1: function(e){
12   console.log(1,e)  
13 }
14 
15 tap2: function(e){
16   console.log(2,e)  
17 }
18 tap3: function(e){
19   console.log(3,e)  
20 }

  可以看到,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關鍵字綁定,所以不會發生冒泡行為

1 <view id="outter" catchtap="tap1">
 2    outer view
 3    <view id="middle" catchtap="tap2">
 4      middle view
 5      <view id="inner" catchtap="tap3">
 6        inner view
 7       </view>
 8    </view>
 9 </view>
10 
11 tap1: function(e){
12   console.log(1,e)  
13 }
14 
15 tap2: function(e){
16   console.log(2,e)  
17 }
18 tap3: function(e){
19   console.log(3,e)  
20 }

 

 

 

 

二、你不知道的小程序事件的貓膩

  1、小程序中的事件分為兩類:冒泡事件與非冒泡事件

  冒泡事件有:touchstart   touchmove   touchend  longtap   tap這五個事件,其余的事件為非冒泡事件。

  2、冒泡事件冒泡的條件:父元素與子元素綁定同一類事件並且子元素的綁定方式是bind(catch開頭會阻止事件冒泡),代碼如下:

 1 <view  id="outer"  bindtap="tap1">
 2     outer
 3     <view  id="inner"  catchtap="tap2">
 4         inner
 5     </view>
 6 </view>
 7 
 8 tap1: function(e){
 9   console.log(1,e)  
10 }
11 
12 tap2: function(e){
13   console.log(2,e)  
14 }

點擊inner元素,只會執行tap2事件,

  3、子元素綁定longtap長按事件會觸發父元素的tap點擊事件

1 <view  id="outer"  catchtap="tap1">
 2     outer
 3     <view  id="inner"  catchlongtap="tap2">
 4         inner
 5     </view>
 6 </view>
 7 
 8 tap1: function(e){
 9   console.log(1,e)  
10 }
11 
12 tap2: function(e){
13   console.log(2,e)  
14 }

  在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之間的區別。可能我的道行尚淺,如果文中內容有出錯的地方或者是描述的不到位的地方,歡迎各位前端前輩、同行一起交流學習。我的qq:1540302851

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM