【发布时间】:2014-10-23 16:32:45
【问题描述】:
我正在开发一些 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”)并基于此分配事件: Click event called twice on touchend in iPad。 当然,上面链接中的解决方案仅适用于 iOS(不是 Android 或其他设备),看起来更像是解决一些非常基本的问题的“黑客”。
另一种解决方案是检测鼠标运动,并将其与触摸功能结合起来,以确定用户是使用鼠标还是触摸。问题当然是用户可能不会在您想要检测鼠标时移动鼠标......
我能想到的最可靠的解决方案是使用一个简单的debounce 函数来简单地确保该函数仅在很短的时间间隔内(例如 100 毫秒)触发一次:
button.on('click touchend', $.debounce(100, function(event) {
// this fires only once on all devices
}));
我是否遗漏了什么,或者有人有更好的建议吗?
编辑:我在我的帖子之后找到了这个链接,它提出了与上述类似的解决方案: How to bind 'touchstart' and 'click' events but not respond to both?
【问题讨论】:
-
这解决不了任何问题...... Modernizr 只是检测到“触摸”。该事件仍将在触摸设备上触发两次。或者,如果您为触摸设备(通过modernizr)分配“触摸”事件,它将停止在像许多windows8设备这样的双输入设备上使用鼠标的用户。
标签: javascript jquery ios click touch