在小程序中做一个单击长按判断

事情的起源

在做项目的过程中,遇到这么一个需求:轻按按钮,事件触发一次,长按按钮,则事件需要不停的触发,微信没有提供这个方法,需要开发者自身去完成。

逻辑分析

当按钮按下, 此时获取得到按下的时间戳和一个按钮的状态, 写入this.data里面, 写入成功后, 开启一个递归函数, 首先是得到当前时间戳, 取出开始的时间戳, 二者做对比, 当大于设定值如200毫秒, 则为长按时间, 若小于, 则为单击事件, 当按钮松开, 改变按钮状态, 清除计时器.

代码实现

touchStart: function(e){
    let timeStart = this.getTime();
    let isTouch = true;
    this.setData({timeStart, isTouch}, this.getNum)
}

touchEnd: function(){
    this.setData({ isTouch: false }, this.getNum)
}

getNum: function(){
    let { timeStart, isTouch } = this.data;
    let timeNow = this.getTime();
    let timeNum = 200;
    let num = timeNow - timeStart;
    let touchType = num < timeNum ? '单击': '长按';
    if(isTouch){
        // fnc  执行想要做的事 
        this.timer = setTimeout(this.getNum, 100)
    }
    else{
        clearTimeout(this.timer)
    }
}

getTime: function(){
    let time = new Date()
    return time.getTime()  
} //获取当前时间的毫秒数
复制代码
微信小知识

this.setData为一个异步函数, 如果有业务需要当数据写入成功后执行的话,可以使用这个方法来执行 this.setData({}, cb) cb 为回调函数

BUG修改

虽然按照以上情况能实现预期效果,但是还不够完美,经过实测,当快速点击并松开(在100ms内),想要执行的函数并不会触发,为了能兼容这种情况,我做出了一点改变,添加了一个bindtap函数,并在添加一个状态来判断是否触发执行函数

//bindtap 函数
tap: function(){
    let { isSend } = this.data
    if(!isSend){
        // fnc 执行函数
    }
}

//getNum 做适应性改变
getNum: function(){
    let { timeStart, isTouch, isSend } = this.data;
    let timeNow = this.getTime();
    let timeNum = 200;
    let num = timeNow - timeStart;
    let touchType = num < timeNum ? '单击': '长按';
    if(isTouch){
        // fnc  执行想要做的事 
        this.setData({isSend: true })  // 添加的代码
        this.timer = setTimeout(this.getNum, 100)
    }
    else{
        clearTimeout(this.timer)
        this.setData({ isSend:false })  //添加的代码
    }
}
// 
复制代码

因为水平有限,只能通过这种方式来进行修改,如果有更好的方法,欢迎提出意见和建议

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值