<view> <swiper catchtap="onSwiperTap" vertical="{{false}}" indicator-dots="true" autoplay="true" interval="5000" circular="true"> <swiper-item><image src="20180714.jpg" mode="aspectFill" data-post-id="1" /></swiper-item> <swiper-item><image src="20180714.jpg" mode="aspectFill" data-post-id="2" /></swiper-item> <swiper-item><image src="20180714.jpg" mode="aspectFill" data-post-id="3" /></swiper-item> </swiper> </view>
onSwiperTap:function(event){ var postId=event.target.dataset.postId; wx.navigateTo({ url:"post-detail/post-detail?id="+postId }); }
在冒泡事件中,target指的是事件最开始被触发的元素,而currentTarget指的是捕获事件的元素。放在以上的代码中,target指的是image元素,而currentTarget指的是swiper元素。点击swiper时实际上点击的是image组件,事件由image一级一级地传递到swiper组件中,最后被我们注册在swiper组件上的onSwiperTap捕获。只有在image元素上才设置有postId,从currentTarget(swiper)元素中是无法获取到postId的,所以必须使用event.target来获取postId。
在微信小程序的开发过程中,有时需要获取事件发生时的一些信息,例如事件类型、事件发生的时间、触发事件的对象等,此时可以通过事件对象来获取。当事件处理函数被调用时,微信小程序会将事件对象以参数的形式传给事件处理函数。事件对象的属性如下表所示。
属性 | 类型 | 说明 |
---|---|---|
type | string | 事件类型 |
timeStamp | number | 事件生成的时间戳 |
target | object | 触发事件的组件的一些属性值集合 |
currentTarget | object | 当前组件的一些属性值集合 |
mark | object | 事件标记数据 |
对于初学者来说,事件对象属性中的target和currentTarget较难理解。target表示获取触发事件的组件的一些属性值集合;而currentTarget表示获取当前组件的一些属性值集合。下面通过案例来演示事件对象属性中target和currentTarget的区别。
<view bindtap="viewtap" id="outer"> outer <view id="inner"> inner </view> </view>
viewtap:function(e){ console.log(e.target.id+"-"+e.currentTarget.id); }
在上述代码中,父元素outer绑定了viewtap()事件处理函数,而子元素没有绑定,但是由于子元素是父元素的一部分,因此点击子元素也会触发viewtap()事件处理函数。运行程序测试,当单击outer时,控制台中的输出结果为outer-outer,而单击inner时,控制台中的输出结果为inner-outer。由此可见,e.target获取的是子元素的属性值集合,而e.currentTarget获取的是父元素的属性值集合。