对于同一控件同时设置bindtap和bindlongtap,会发现长按时先出现bindlongtap的事件,然后触发点击事件。
小程序中事件执行的顺序是
点击:touchstart → touchend → tap
长按 touchstart → longtap → touchend → tap
为了解决这个冲突,在没有选择的动作下,才会出发 tap 事件:
- 定义一个变脸 longtap = 0
- 在 longtap 事件中,赋值 longtap = 1
- 在 tap 事件中,如果 longtap 的值是 0,则正常处理
- 在 tap 事件中,如果 longtap 的值是 1,则赋值 longtap = 2
- 在 tap 事件中,如果 longtap 的值是 2,则赋值 longtap = 0
代码
wxml
bindlongtap="chunkLongTap" bindtap="gotoChunk"
js
let longTap = 0 // 0 not
// 1 long tap
// 2 tap (follows the long tap in a same action)
chunkLongTap (ev)
{
longTap = 1
},
gotoChunk (ev)
{
const ckid = ev.currentTarget.dataset.ckid
if (ckid && this.data.theChapter.switch === 'on') {
if (longTap === 0) {
wx.navigateTo({
url: `/pages/book_chunk/chunk?ckid=${ckid}`,
})
}
else if (longTap === 1) {
longTap = 2
}
else if (longTap === 2) {
longTap = 0
}
}
},