【发布时间】:2017-08-20 19:11:21
【问题描述】:
1) 我正在构建一个非常普通的 HTML5 网站。
在这个网站上,可点击的元素很少。那些嵌入在多层div中。
HAML 说它看起来像:
%body
#root
#content
#header
#footer
在我的 div #content 中,我有几个可点击的按钮。一些可拖动的元素。和视频播放器。
-> 这利用鼠标事件作为click,mousemove,mouseenter ...
2) 我正在添加触摸手势检测
一切都很好,直到我想添加一个层(一个 div)来捕捉触摸手势。
然后我得到这个:
%body
#root
#content
#header
#footer
#touch-area
这个#touch-area 大小的窗口能够通过touchstart、touchmove、touchstop 解释用户触摸手势
3) 酷!但我正在失去对鼠标事件的控制
这种构造的问题是所有鼠标事件都被#touch-area捕获
我尝试了一些«hacks»
3.1) 通过 CSS
将pointer-events: none添加到#touch-area同时禁用触摸事件。
3.2) JS 有什么可能?
阅读Click through div 。这家伙在顶部 div 中添加了一个 click 侦听器。隐藏此 div。重新触发事件。重新显示 div。
它可以工作,但是:
- 它使用 jQuery
- 我必须指定我希望通过我的
#touch-area传递的所有事件
3.3) 好的,让我们关注mousemove
所以我读了这个post about HTML5 and touchscreen。我发现了这个有趣的事件顺序:
1. touchstart 2. touchmove 3. touchend 4. mouseover 5. mousemove 6. mousedown 7. mouseup 8. click
但我:
-
首先我将
mousemove监听器添加到#touch-area。我在哪里隐藏#touch-area。 - 然后所有事件都会过去。
-
并且我添加了一个超时例程以在几毫秒后显示
#touch-area。那是为了再次捕捉触摸事件。
但是...当我在触摸屏上滑动时。它首先检测到少数mousemove。然后序列touchstart、touchmove、touchstop 被触发。
当我滑动手指时,开始在#touch-area 上记录事件:
(事件名称后跟事件时间)
mouse enter 1490656039478 mouse move 1490656039479 mouse enter 1490656039483 mouse move 1490656039484 touch start 1490656039485 touch move 1490656039492 touch move 490656039498
...那么只有touch move 直到touch stop
所以我的计划被打破了:(
4) stackoverflow 你能帮帮我吗?
如何让顶层能够捕捉触摸手势和正常的可点击按钮?
【问题讨论】:
-
mikro,我非常感谢您为撰写问题所付出的努力,但至少对我而言,您的要求并不清楚。而且我认为我不必阅读您链接的所有资源才能理解这一点。您能否明确说明您想要达到的目标? 20个字,还是更少?如果您认为这有助于理解问题,也许还可以提供minimal reproducible example?
-
你想要这个
functionality而不使用jQuery吗?这会回答你的问题吗? -
我明白了。这就是为什么我试图在第 4 点提出一个“简单”问题的原因。复杂性在于第 2 点所揭示的内容。我相信足够接近“最小示例”。最后,我在第 3 点描述了我的尝试。
-
@AndreiGheorghiu,不,因为 jQuery 的答案不能解决我的问题。
-
mikro,你能重新阅读我之前的问题吗?我特别问“没有jQuery”。如果我制作一个纯 js 脚本,在单击时禁用
#touch-area上的指针事件,然后在同一位置再次单击,然后重新启用#touch-area上的指针事件,那对您没有帮助吗?
标签: javascript html css touch touch-event