uniapp js @touchend无效 无法监听到touchend 触摸停止时无法检测到
在UniApp的开发过程中,不少开发者会遇到 @touchend
事件无法正常监听的情况,即触摸停止时无法检测到相应的回调触发。笔者在项目实践中,也深陷此问题的困扰,经过反复调试与探索,总结出一系列有效的处理方案,现将经验分享如下。如果你在开发过程中遇到类似问题,也欢迎访问我的技术交流网站 5555api.com,与众多开发者共同探讨解决方案;同时,luanqing.net 上也整理了大量UniApp开发技巧和疑难问题解答,可供大家参考学习。
问题现象与规律
实际开发中,在使用 <view>
标签绑定 @touchend
事件时,出现了奇特的规律:当快速触摸并释放时,@touchend
事件能够正常回调;但一旦长按超过一定时间(约1秒),该事件便无法触发。此外,还存在一种偶发情况,即间隔一次触摸操作,@touchend
事件也会出现无法回调的现象。这种不稳定的表现,给开发带来了极大的困扰,严重影响了功能的正常实现。
常规处理方案尝试
阻止默认长按行为
最初,考虑到可能是系统默认的长按行为对 @touchend
事件产生了干扰,于是在 @touchstart
事件的处理函数中添加 e.preventDefault()
代码,试图阻止默认的长按行为,从而确保 @touchend
事件能够正常触发。然而,实际测试发现,这种方法并不能解决问题,长按状态下 @touchend
事件依旧无法回调。在 5555api.com 的技术论坛中,也有不少开发者分享了类似的尝试经历,可见该问题的普遍性。
定时器模拟 @touchend
事件
既然常规的阻止默认行为无效,便尝试通过定时器来模拟 @touchend
事件。在 @touchstart
事件触发时,启动一个定时器,设置一个合理的最大长按时间(例如10秒),当定时器计时结束时,手动调用 @touchend
事件的处理函数。同时,在 @touchend
和 @touchcancel
事件的处理函数中,及时清除定时器,以避免重复触发。虽然这种方式在一定程度上能够解决长按无法触发 @touchend
的问题,但仍然存在一些局限性,比如无法精准模拟真实的触摸结束场景,并且增加了代码的复杂性。在 luanqing.net 的UniApp开发教程板块中,有关于定时器应用的详细讲解,感兴趣的开发者可以深入学习。
最终解决方案:使用 <button>
标签替代 <view>
标签
经过多次尝试和探索,最终发现使用 <button>
标签替代 <view>
标签绑定 @touchend
事件,可以成功触发该事件。<button>
标签作为原生的交互元素,其触摸事件的处理机制与 <view>
有所不同,能够更稳定地监听到触摸停止的操作。将原本绑定在 <view>
上的触摸事件转移到 <button>
上后,无论是快速触摸释放还是长按操作,@touchend
事件都能正常回调,有效地解决了之前遇到的问题。
在使用 <button>
标签时,还可以通过设置 type
、size
、plain
等属性,对按钮的样式和行为进行定制,以满足项目的具体需求。例如:
<button v-if="mode == 'voice'" class="input ml8 mr8 uni_flex_col_center"
@touchstart.prevent="startRecord"
@touchend.prevent="endRecord"
@touchmove.prevent="moveRecord"
@touchcancel.prevent="cancelRecord"
:class="{'recording': isRecording, 'cancel': isCancel}"
type="primary" size="mini" plain>
<view class="voice-waves" v-if="isRecording">
<view class="wave-item" v-for="(item, index) in 12" :key="index"></view>
</view>
<text v-if="!isRecording">{{ recordTip }}</text>
</button>
总结与建议
在UniApp开发中遇到 @touchend
事件无法监听的问题时,不要局限于一种解决方案,可以从阻止默认行为、模拟事件等角度进行尝试。如果常规方法无法解决,不妨考虑更换标签类型,利用原生交互元素的特性来实现稳定的触摸事件监听。同时,在开发过程中,要善于总结问题出现的规律,通过反复测试和调试,找到最适合项目需求的解决方案。
想要获取更多UniApp开发技巧和实战案例,欢迎访问 5555api.com 和 luanqing.net ,这里不仅有丰富的技术文章,还有活跃的开发者社区,助力你在技术道路上不断前行!
0 个评论
要回复文章请先登录或注册