【问题标题】:Prevent touchmove default (browser scrolling) until condition is met?在满足条件之前防止touchmove默认(浏览器滚动)?
【发布时间】:2015-02-03 18:18:32
【问题描述】:

目标是有一个组件,在本例中是一个轮播,当用户从左向右移动手指时响应 touchmove 事件,但不会阻止默认的上下滚动,即使触摸如果用户将手指在 y 轴上移动超过某个阈值,则起源于相关组件。

或者,更简单地说,我需要禁用触摸设备上的浏览器滚动,直到 touchmove 甚至说它正常,然后重新启用它。

尽管进行了几个小时的修补,但我只能完全禁用浏览器滚动或不完全禁用它。有条件地禁用似乎不想工作。

基本逻辑是:

  1. 记录手指向下的坐标(触摸开始)。
  2. 在 touchmove 上,检查 Y 差是否大于 200 像素。
  3. 如果是这样,允许默认浏览器滚动,禁用 touchmove 监听器。
  4. 如果没有,阻止默认滚动,向左/向右滚动。

我一直在最新版 iPad mini 上对此进行测试。我发现了以下内容:

  1. 在 touchstart 处理程序中调用 preventDefault() 会停止该触摸的所有浏览器滚动,在拖动过程中无法重新启用。

  2. 尝试有条件地阻止 dragmove 处理程序中的默认值的行为与 touchstart 处理程序中的 preventDefault 相同。也就是阻塞拖拽,忽略条件!

dragmove 中这样的条件:

if(Math.abs(MouseMoveDistanceY) < 200){
   if(ev.preventDefault){ev.preventDefault();}
}

...永久阻止垂直滚动,即使超过阈值!

无论如何,在触摸设备和 dragmove 处理程序中,我如何在满足条件时将控制权交给浏览器滚动?像“unPreventDefault()”这样的东西会很棒。除此之外,有什么想法吗?

【问题讨论】:

    标签: javascript jquery touch


    【解决方案1】:

    只是一个想法,因为我不能给你一个直接的答案,所以这更多的是在寻找一种不同的方法。但是你有没有看过改变页面,以便在触摸时没有任何实际滚动事件? ie/ 固定高度并添加溢出隐藏。

    【讨论】:

    • 根据您的说法,如果不是答案,您可以将其放在评论部分
    • 抱歉,刚刚开始使用,没有看到 cmets。刚刚尝试移动它,但仍然无法发表评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 2017-10-29
    相关资源
    最近更新 更多