javascript - preventDefault 与 if 检查跳过处理鼠标和触摸?
问题描述
假设我想同时使用触摸和鼠标(鼠标和触摸屏可能可用)。
至少有一种处理方式。
当触摸触发时使用 preventDefault (第一种方式):
let onMove = event => {
//either touch, or mouse
};
document.body.addEventListener('touchmove', event=>{
//prevent mouse if this event fires
event.preventDefault();
onMove(event);
}, false);
document.body.addEventListener('mousemove', event=>{
onMove(event);
}, false);
如果我们这样做(第二种方式)怎么办:
let didTouch = false;
let onMove = event => {
//either touch, or mouse
};
document.body.addEventListener('touchmove', event=>{
didTouch = true;
onMove(event);
}, false);
document.body.addEventListener('mousemove', event=>{
if(didTouch){
didTouch = false;
}else{
onMove(event);
}
}, false);
第二种方法可以同时处理触摸和鼠标吗?推荐第一种方式,但我对使用任何一种方式的可能性感兴趣,只要没有不可预见的问题。
解决方案
在我看来,第二种方法不是一个好的解决方案,因为:
性能:您正在处理 2 个事件(触摸和鼠标)。第一个解决方案防止鼠标事件触发,因此您的应用程序执行较少的事件处理。
复杂性:
didTouch
给你的代码增加了不必要的复杂性......作为一般的经验法则,如果你可以通过编写更少的代码来获得相同的结果,那么更短的解决方案是首选,除非使用更长的解决方案有有效的好处。
要记住的另一个潜在问题是互斥。JavaScript 是线程安全didTouch
的,当您仍在处理第一个事件时,您真的不需要担心第二个事件触发和更改标志。但请记住,使用异步方法遇到互斥问题并非不可能。
推荐阅读
- php - 如何每 60 秒刷新一次页面而不会丢失 div 中的现有数据?
- css - 我们如何为 Gchart 添加自定义 CSS?
- html - 视频标签在 Angular 中失败
- or-tools - 多个时间窗口 vrp [or-tools]
- python - Pandas:在列标题中根据日期在顶部添加一行
- html - 如何在我的 html 代码中更改小部件的角?
- common-lisp - 限制调试输出中的字符串长度
- c# - 如何在 C# WPF 中创建在运行时绑定到动态属性类型的可观察集合的 DataGrid 动态列
- node.js - 如何处理具有不同内存占用的 RabbitMQ 任务排队到同一个交换?
- python - 使用 Pyglet 播放音乐时出现 Python 错误:UserWarning:异常:访问冲突读取 0x00000014