我正在设计一些 Javascript UI,并且使用了很多触摸事件,例如“touchend”以提高触摸设备的响应速度。然而,有一些逻辑问题一直在困扰着我...
我发现很多开发人员在同一个事件中混合使用“touchend”和“click”。在许多情况下,这不会有影响,但基本上该函数将在触摸设备上触发两次:
button.on('click touchend', function(event) {
// this fires twice on touch devices
});
有人建议可以检测触摸功能,并相应地设置事件,例如:
var myEvent = ('ontouchstart' in document.documentElement) ? 'touchend' : 'click';
button.on(myEvent, function(event) {
// this fires only once regardless of device
});
以上的问题在于,它将在同时支持触摸和鼠标的设备上出现问题。如果用户正在双输入设备上使用鼠标,则“点击”不会触发,因为仅为按钮分配了“touchend”。
另一种解决方案是检测设备(例如“iOS”)并基于此分配事件: iPad 触摸结束时单击事件被调用两次。 当然,上面链接中的解决方案仅适用于 iOS(而非 Android 或其他设备),似乎更像是解决相当基本的东西的“hack”。
另一种解决方案是检测鼠标移动,并结合触摸功能来确定用户是在使用鼠标还是触摸。问题在于用户可能没有在您要检测它的时间内移动鼠标...
我能想到最可靠的解决方案是使用一个简单的防抖函数,以确保函数在短时间间隔内(例如100毫秒)仅触发一次:
button.on('click touchend', $.debounce(100, function(event) {
// this fires only once on all devices
}));
我是否遗漏了什么,或者是否有更好的建议?
编辑:在我的帖子后,我发现了这个链接,它提出了与上面类似的解决方案:如何绑定'touchstart'和'click'事件但不对两者都做出响应?
pointerup
事件,以便独立于使用的设备只发射一次。 - Philippe