【发布时间】:2017-01-21 08:13:38
【问题描述】:
在几乎所有当前的浏览器上(广泛的details from patrickhlauke on github,其中I summarised in an SO answer,还有更多信息from QuirksMode),触摸屏触摸触发mouseover事件(有时会创建一个不可见的伪光标,停留在用户触摸的位置直到他们接触到其他地方)。
在触摸/单击和鼠标悬停旨在执行不同操作的情况下,有时这会导致不良行为。
从响应鼠标悬停事件的函数内部,已传递event 对象,有什么方法可以检查这是否是从元素外部移动到内部的移动光标的“真实”鼠标悬停它,或者如果它是由触摸屏触摸的这种触摸屏行为引起的?
event 对象看起来相同。例如,在 chrome 上,由用户触摸触摸屏引起的鼠标悬停事件有 type: "mouseover",我看不到任何东西可以将其识别为与触摸相关。
我的想法是将一个事件绑定到 touchstart 以更改鼠标悬停事件,然后将一个事件绑定到 touchend 以删除此更改。不幸的是,这不起作用,因为事件顺序似乎是 touchstart → touchend → mouseover → click (我无法附加 normalise-mouseover 功能来单击而不弄乱其他功能)。
我希望以前有人问过这个问题,但现有的问题并没有完全解决:
- How to handle mouseover and mouseleave events in Windows 8.1 Touchscreen 是关于 Windows 上的 C# / ASP.Net 应用程序,而不是浏览器中的网页
- JQuery .on(“click”) triggers “mouseover” on touch device 类似,但与 jQuery 有关,答案是一种不好的方法(猜测触摸屏用户代理的硬编码列表,在创建新设备 UA 时会中断,并且错误地假设所有设备都是鼠标 或 触摸屏)
- Preventing touch from generating mouseOver and mouseMove events in Android browser 是我能找到的最接近的,但它只是关于 Android,是关于防止在触摸时无法识别鼠标悬停,并且没有答案
- Browser handling mouseover event for touch devices causes wrong click event to fire 是相关的,但他们试图阐明 iOS 两次点击交互模式,并且唯一的答案犯了假设触摸和鼠标/点击是互斥的错误。
我能想到的最好的方法是有一个触摸事件,它设置一些全局可访问的变量标志,比如 touchstart 上的 window.touchedRecently = true; 但不是点击,然后在 500 毫秒后删除这个标志 setTimeout .不过,这是一个丑陋的 hack。
注意 - 我们不能假设触摸屏设备没有类似鼠标的移动光标,反之亦然,因为有许多设备使用触摸屏和类似鼠标的笔,当鼠标悬停在附近时会移动光标屏幕,或者使用触摸屏和鼠标(例如触摸屏笔记本电脑)。更多细节在我对How do I detect whether a browser supports mouseover events?的回答中。
注意 #2 - 这不是一个 jQuery 问题,我的事件来自 Raphael.js 路径,其中 jQuery 不是一个选项,它提供了一个普通的浏览器 event 对象。如果有特定于 Raphael 的解决方案,我会接受,但这不太可能,原始 JavaScript 解决方案会更好。
【问题讨论】:
-
在 Google 寻求相同解决方案时发现了这个,已经吞噬了 Patrick 的 superb 研究。鉴于赏金猎人想要的这个问题的质量和清晰度,当前的答案是糟糕。暂时,我的朋友在这个article on input device capabilities后面找到了这个excellent Google doc
标签: javascript cross-browser touch raphael