先看一下微信小程序对事件的解释:
文字叙述一下
什么是事件
- 事件是视图层到逻辑层的通讯方式。
- 事件可以将用户的行为反馈到逻辑层进行处理。
- 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数。
- 事件对象可以携带额外信息,如 id, dataset, touches。
就是那些点击、鼠标移进移出之类的动作啦。小程序绑定事件的方法是在 wxml 文件对应的组件中使用 bindtap
加上事件名字就可以了。例如:
然后当点击这个组件的时候小程序就会在该页面对应的脚本文件的 Page 中找到相应的事件处理函数,下面举例写这个 test 事件:
先点击一下组件,然后打开控制台看看是否成功。毫无疑问是可以的。接下来再看看获得的这个事件里面到底有什么信息
嗯,首先是 type
事件类型是 tap ,这个 tap 事件就是手指触摸后马上离开的动作,也就是点击啦。timeStamp
为发生事件的时间戳,detail
表示事件的某种信息,根据不同的事件会返回不同的信息,这里返回的是点击时的坐标。currentTarget
和target
这两个属性比较容易搞糊涂,currentTarget
在事件流的捕获、目标和冒泡阶段,而target
只是在事件流的目标阶段,当事件流是在目标阶段时,这两个的值是一样的,而事件流在捕获和冒泡阶段的话,两个属性的值不一样,下面会具体分析。最后是changedTouches
和touches
的比较,touches
属性当每个事件被触发时,就会获取此时每个触点的信息,并保存在列表中,是只读属性。changedTouches
跟差不多也是可以记录触点的信息,但它是根据事件的变法来获取触点的信息,举个栗子就是,当一只手指触碰屏幕时,changedTouches
和touches
都会同时记录这个触点的信息,信息一样;而当手指离开屏幕时,触点消失,touches
中的记录就会消失,而由于这个过程是由接触事件向没有接触事件的变化,所以changedTouches
仍然记录着触点移开前的信息,这就是两者之间的区别了。
再举例分析一下currentTarget
和target
的不同
我先把事件 test 绑定在 Image 组件上,即:
然后点击头像,查看currentTarget
和target
的信息:
一样,因为目标对象都是 image 组件。再把 test 事件绑定到 image 的父组件 view 上:
然后点击头像,查看currentTarget
和target
的信息:
可看到信息不一样了,不难发现这次 target 保存的信息是点击的 image 组件的信息,而 currentTarget 保存的是绑定 test 事件的 view 组件的信息。到这里currentTarget
和target
的区别已经很明显了。
分析完 event 对象,继续分析 currentTarget
对象,因为这个很常用,经常用它来获取触发事件的组件信息,先把它打印出来:
点击头像,获取信息:
信息主要有dataset
对象,目标组件id
的值,还有相对页面的偏移量offsetLeft
和offsetTop
。
看看 dataset 里面装的是什么
嗯,什么都没有。查阅文档得知,dataset 是组件上由data-开头的自定义属性组成的集合,所以我们在 view 组件上增加几个自定义属性:
有了,然后获取数据的时候直接按下面方法使用就行了:
绑定事件除了用 bind
之外还可以用 catch
,区别是 bind
不会阻止冒泡事件向上冒泡,而 catch
会。举例说明:
我定义了三个事件,然后绑定在三个嵌套的组件里
点击头像,可以发现:
事件由里向外顺序触发,向冒泡一样。如果在第二层的 view 那里使用 catchtap
,即:
点击头像:
冒泡在第二层那里被中断了。catch
就是这么玩。
完。