添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

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

当按钮按下, 此时获取得到按下的时间戳和一个按钮的状态, 写入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 })  //添加的代码