微信小程序长按事件触发点击事件的BUG处理

微信小程序开发说实话仍是有点糟心的,通过事件冒泡的坑以后,又遇到了长按事件(longtap)必触发点击事件(tap)的BUGhtml

实例代码

  • wxml小程序

<view class="container">
  <view>
    <button bindtap="tap" bindlongtap="longtap">长按我</button>
  </view>
</view>
  • js微信小程序

Page({
  data: {
  },
  tap: function() {
    console.log('触发了 tap')
  },
  longtap: function () {
    console.log('触发了 longtap')
  }
})
  • 效果微信

longtap触发tap演示

解决方法

Google后肯定是小程序有意(B)为(U)之(G)后,看了一下网上的解决方法,基本都是经过touchstarttouchend从新断定taplongtap事件的,我的不是很喜欢。异步

看一下微信小程序的事件定义:this

  • tap, 手指触摸后立刻离开spa

  • longtap, 手指触摸后,超过350ms再离开3d

也就是说,目前的触发的顺序是 longtap -> touchend -> tapcode

那么其实解决也很清晰了,简单来讲就是 加把锁, 应用到上面的代码上:xml

Page({
  data: {
    lock: false
  },
  tap: function() {
    //检查锁
    if (this.data.lock) {
      return;
    }
    console.log('触发了 tap')
  },
  touchend: function() {
    if (this.data.lock) {
      //开锁
      setTimeout(() => {
        this.setData({ lock: false });
      }, 100);
    }
  },
  longtap: function () {
    //锁住
    this.setData({lock: true});
    console.log('触发了 longtap')
  }
})

看一下效果

longtap触发tap演示

延伸

大部分状况下,咱们都是不须要在touchend中加锁的,由于长按操做会触发其余的异步操做,只要保证异步操做的最后把锁解除了便可。

相关文章
相关标签/搜索