preventDefault与if检查跳过处理鼠标和触摸事件的对比?
preventDefault与if检查跳过处理鼠标和触摸事件的对比?
假设我想同时使用触摸和鼠标(鼠标和触摸屏可能都可用)。
至少有一种方法可以处理。
当触摸事件触发时,使用preventDefault(第一种方法):
let onMove = event => { //触摸或鼠标事件 }; document.body.addEventListener('touchmove', event=>{ //如果触发了此事件,阻止鼠标事件 event.preventDefault(); onMove(event); }, false); document.body.addEventListener('mousemove', event=>{ onMove(event); }, false);
如果我们这样做会怎样(第二种方法):
let didTouch = false; let onMove = event => { //触摸或鼠标事件 }; document.body.addEventListener('touchmove', event=>{ didTouch = true; onMove(event); }, false); document.body.addEventListener('mousemove', event=>{ if(didTouch){ didTouch = false; }else{ onMove(event); } }, false);
第二种方法是否适用于处理触摸和鼠标?第一种方法被推荐,但我对使用任何一种方法都感兴趣,只要没有意想不到的问题。
preventDefault versus if check skip handling mouse and touch?
在我看来,第二种方法并不是一个好的解决方案,因为:
- 性能:你需要处理两个事件(触摸和鼠标)。第一种解决方案阻止了鼠标事件的触发,因此你的应用程序处理的事件更少。
- 复杂性:didTouch 给你的代码增加了不必要的复杂性...通常来说,如果你可以用更少的代码达到相同的结果,那么较短的解决方案更好,除非使用较长的解决方案有明显的好处。
还要注意的另一个潜在问题是互斥性。JavaScript 是线程安全的,你不需要担心在处理第一个事件时第二个事件触发并改变了你的 didTouch 标志位。但要记住,使用异步方法可能会遇到互斥问题。
我认为这基本上回答了我的问题。这样做是否基本上安全?如果我为任何 didTouch 变量保持良好的局部范围,你认为互斥问题可以避免吗?
我的建议是不要使用第二种方法...因为性能、复杂性和潜在的互斥问题...我不是这方面的专家,但我看过这个问题的所有文档,都使用了第一种方法...不确定为什么你想使用这个第二种方法?有什么好处吗?
我对将指针事件与自动滚动相结合很感兴趣。比如在一个滚动框中使用拖动,使用左鼠标按钮和滚轮不方便,或者行为只是预期但对触摸不可用。这是一个非常特殊的问题,为了正确处理,需要记录指针设备的每个像素移动的位置。使用触摸和鼠标的主要原因是与其他选择阻止默认行为的库兼容,这样无论如何都会停止鼠标事件,还有其他问题,比如直径精度。
问题的原因是当鼠标和触摸监视器交替使用时,上述代码只能适用于其中一种事件(mousedown或touchstart),而不能同时适用于两种事件。
解决方法是使用event.preventDefault()来阻止事件的默认行为,从而避免同时处理鼠标和触摸事件。具体实现方法如下:
let handler = function (e) { e.preventDefault(); // 阻止事件的默认行为 // do stuff }; key.addEventListener('touchstart', handler); key.addEventListener('mousedown', handler);
通过在事件处理函数中调用event.preventDefault(),可以确保当鼠标和触摸事件同时触发时,只执行其中一个事件处理函数,而不会同时处理两个事件。
这样,无论是使用鼠标还是触摸屏,都可以正确地处理事件。