赞
踩
在编写代码中,使用频率高的事件方式是:
类型 | 触发条件 |
---|---|
touchstart | 手指触摸动作开始 |
touchmove | 手指触摸后移动 |
touchcancel | 手指触摸动作被打断,如来电提醒,弹窗 |
touchend | 手指触摸动作结束 |
tap | 手指触摸后马上离开 |
longtap | 手指触摸后,超过350ms再离开 |
longpress | longtap升级版,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发 |
注意:touch触屏系列事件常结合画布canvas组件使用,简单了解即可
验证:
<view>触控事件之单击tap</view>
<button type="primary"
bindtouchstart="bindtouchstartFn"
bindtouchend="bindtouchendFn"
bindtap="bindtapFn">点击</button>
/**触控事件之单击tap */
bindtouchstartFn(event){
console.log(event.timeStamp + '- touchstart')
},
bindtouchendFn(event){
console.log(event.timeStamp + '- touchend')
},
bindtapFn(event){
console.log(event.timeStamp + '-touchtap')
},
验证后可以发现tap顺序为touchstart→touchend→tap
注意:
微信官方文档没有双击事件,需要开发者自己定义处理。
分析:
双击事件可以由两个单击事件组成,只要两次点击的间隔时间小于600ms(或者300ms)则认为是双击行为;
顺序:
双击执行顺序为touchstart → touchend → tap → touchstart → touchend → tap
验证:
<button type="primary" bindtap="bindtapFn">双击</button>
/** * 页面的初始数据 * 1、判断是否是第一次触摸屏幕,因为如果是第一次触摸屏幕无法完成双击,因为双击时间必须是第二次或者往后更多次才能完成; * 2、判断当前点击时的时间节点和上一次点击的时间节点做比较 */ data: { /**最后触摸页面时的距离页面打开的毫秒数,默认为0 */ lastTimeStamp: 0, } /**触摸事件,判断单击还是双击 */ bindtapFn(event){ var timeStamp = event.timeStamp;/**触摸时距离页面打开的毫秒数 */ var lastTimeStamp = this.data.lastTimeStamp;/**上一次触摸距离页面打开的毫秒数 */ if(lastTimeStamp>0){ /**不是第一次触摸 */ if(timeStamp-lastTimeStamp<600){ console.log(event.timeStamp + '双击') }else{ console.log(event.timeStamp + '单击') } }else{ /**第一次触摸 */ console.log(event.timeStamp + '第一次单击') } /**将本次时间设置为最后一次触摸时间 */ this.setData({ lastTimeStamp:timeStamp }) },
此时如果点击按钮的时间间隙小于600ms,则会认为是双击行为。
长按事件手指触摸后,超过350ms再离开,触发长按事件longtap
<button type="primary" bindtouchstart="bindtouchstartFn" bindlongtap="bindlongtapFn" bindtouchend="bindtouchendFn" bindtap="bindtapFn">点击</button>
bindtouchstartFn(event){
console.log(event.timeStamp + '- touchstart')
},
bindlongtapFn(event){
console.log(event.timeStamp + -'touchlongtap')
},
bindtouchendFn(event){
console.log(event.timeStamp + '- touchend')
},
bindtapFn(event){
console.log(event.timeStamp + '-touchtap')
},
长按后控制台输出结果
翻译为:“\longtap\”事件已弃用,请改用“longpress”事件,所以接下来将longtap改为longpress
触发顺序:touchstart → longtap → touchend → tap
data: { touchStartTime:0, touchEndTime:0, }, /**触控事件之单击tap */ /**手指触摸动作开始 */ bindtouchstartFn(event){ console.log(event.timeStamp + '- touchstart') this.setData({ touchStartTime:event.timeStamp }) }, /**手指触摸后,超过350ms再离开,即长按事件 * 补充:longpresslongtap升级版,如果指定了事件回调函数并触发了这个事件,tap事件将不被触发 */ bindlongtapFn(event){ console.log(event.timeStamp + -'touchlongtap') }, /**手指触摸动作结束 */ bindtouchendFn(event){ console.log(event.timeStamp + '- touchend') this.setData({ touchEndTime:event.timeStamp }) }, /**单击事件,手指触摸动作开始并结束 */ bindtapFn(event){ if(this.data.touchEndTime-this.data.touchStartTime<350){ console.log(event.timeStamp + '-touchtap') } },
思路:计算touchend与touchstart的时间差,如果大于350ms,则不会触发bindtap相关事件。
接下来将longtap改为longpress,进行测试
①长按后控制台输出
②单击时控制台输出
总结:
验证后发现,longpress长按事件已经避免了旧版longtap事件与tap事件同时触发的bug,所以以后开发用longpress解决长按事件即可。
单击、双击、长按属于点触事件,会触发touchstart、touchend、tap事件
事件 | 触发顺序 |
---|---|
单击 | touchstart→touchend→tap |
双击 | touchstart→touchend→tap→touchstart→touchend→tap |
长按 | touchstar→longtapt→touchend→tap |
滑动事件由touchstart、touchmove、touchend组成,一般指的是手指触摸屏幕并移动
<view>触控事件之touch系列</view>
<button type="primary"
bindtouchstart="bindtouchstartFn"
bindtouchmove="bindtouchmoveFn"
bindtouchend="bindtouchendFn">点击</button>
/**触控事件之滑动touch系列 */
bindtouchstartFn(event){
console.log(event)
},
bindtouchmoveFn(event){
console.log(event)
},
bindtouchendFn(event){
console.log(event);
},
场景:一般滑动时需要获取滑动的方向或者滑动的距离,
例如整屏滑动:
①初始化数据
<button type="primary"
bindtouchstart="bindtouchstartFn"
bindtouchmove="bindtouchmoveFn"
bindtouchend="bindtouchendFn">点击</button>
data: {
/**初始化touchstart坐标 */
startPoint:[0,0]
},
②开始触摸
/**开始触摸 */
bindtouchstartFn: function(e){
this.setData({
/**开始触摸,获取触摸点坐标并放入数组中 */
startPoint: [e.touches[0].pageX, e.touches[0].pageY]
})
},
③触摸点移动,动态计算判断方向
/**触摸点移动 */ bindtouchmoveFn: function(e){ /**当前触摸点坐标 */ var curPoint = [e.touches[0].pageX,e.touches[0].pageY]; var startPoint = this.data.startPoint; /**比较pageX值 */ if(curPoint[0]<=startPoint[0]){ if(Math.abs(curPoint[0] - startPoint[0]) >= Math.abs(curPoint[1] - curPoint[1])){ console.log(e.timeStamp + '- touch left move') }else{ if(curPoint[1] >= startPoint[1]){ console.log(e.timeStamp + '- touch down move') }else{ console.log(e.timeStamp + '- touch up move') } } } else { if(Math.abs(curPoint[0] - startPoint[0] >= Math.abs(curPoint[1] - startPoint[1]))){ console.log(e.timeStamp + '- touch right move') }else{ if(curPoint[1] >= startPoint[1]){ console.log(e.timeStamp + '- touch down move') }else{ console.log(e.timeStamp + '- touch up move') } } } },
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。