=我正在尝试在我的 Web 应用程序中开发一个简单的拖放 UI。可以用鼠标或手指拖动项目,然后将其放入多个放置区之一。当一个项目被拖动到放置区(但尚未释放)时,该区域会突出显示,标记安全着陆位置。这对鼠标事件非常有效,但我在 iPhone/iPad 上一直使用 touchstart/touchmove/touchend 系列。
问题是当一个项目的 ontouchmove 事件处理程序被调用时,它的 event.touches[0].target
总是指向原始 HTML 元素(项目)而不是当前手指下的元素。此外,当用手指将项目拖过某个放置区时,根本不会调用该放置区自己的 touchmove
处理程序。这实质上意味着我无法确定手指何时位于任何拖放区上方,因此无法根据需要突出显示它们。同时,当使用鼠标时, mousedown
会为光标下的所有 HTML 元素正确触发。
有些人确认它应该像那样工作,例如 http://www.sitepen.com/blog/2008/07/10/touching-and-gesturing-on-the-iphone/ : 对于那些来自在正常的网页设计世界中,在正常的 mousemove 事件中,在 target 属性中传递的节点通常是鼠标当前所在的位置。但在所有 iPhone 触摸事件中,目标是对原始节点的引用。
问题: 有什么方法可以确定手指下的实际元素(不是最初触摸的元素,在许多情况下可能会有所不同)?
原文由 Ilya Semenov 发布,翻译遵循 CC BY-SA 4.0 许可协议
这当然不是事件目标应该如何工作的。由于供应商在没有任何审查的情况下秘密提出扩展,我们现在可能会永远陷入另一个 DOM 不一致问题。
使用
document.elementFromPoint
解决它。