代码之家  ›  专栏  ›  技术社区  ›  Matthew Gertner

无法阻止“touchmove”在iOS上滚动窗口

  •  35
  • Matthew Gertner  · 技术社区  · 6 年前

    我们正在尝试滚动iOS web应用程序上的一个元素,同时阻止窗口本身滚动。我们正在捕获 touchmove 事件,以编程方式滚动元素,并(尝试)通过调用 preventDefault 关于事件。

    不幸的是,这在Mobile Safari中不起作用。窗口继续在元素下方滚动。该问题听起来与中描述的Webkit错误完全相同 https://bugs.webkit.org/show_bug.cgi?id=163207 ,但这个问题应该在iOS 10.3中得到修复,而我现在运行的是11.3。

    有感染力 touchforcestart 打电话 预防默认值 似乎阻止了窗口滚动,但我们正在调用它 touchstart ,这似乎“为时已晚”,因为窗口仍在滚动。仅在下次阻止滚动 touchstart 被调用。

    有什么想法吗?我们很困惑,因为这显然是一个bug,但它似乎已经在一段时间前修复了。

    3 回复  |  直到 6 年前
        1
  •  80
  •   user9576791    6 年前

    我最近遇到了同样的问题。你需要通过 { passive: false } 注册时 touchmove 事件侦听器。e、 g。

    document.addEventListener('touchmove', function(e) {
        e.preventDefault();
    }, { passive: false });
    

    这是因为在与iOS 11.3捆绑的Safari 11.1中,文档触摸事件监听器现在默认为被动的。此更改记录在Safari 11.1中 release notes :

    Web API

    • […]
    • 更新根文档触摸事件监听器以使用被动模式,从而提高滚动性能并减少崩溃。
        2
  •  7
  •   User007    5 年前

    你需要绑定 preventDefault 两个事件: touchmove touchforcechange 使其在ios 11中工作,例如。

    document.addEventListener('touchmove', this.preventDefault, {passive: false});
    document.addEventListener('touchforcechange', this.preventDefault, {passive: false});
    

    您应该在touchstart之前绑定它们

    如果你把它们绑在 touchstart dragStart 处理程序,它们只能阻止在下次拖动时滚动。

        3
  •  0
  •   joe    2 年前

    对我有用的是通过 {passive:false} 选项到 addEventListener ( explanation ),并且您还需要确保执行 e.preventDefault() 在…上 touchmove touchstart :

    window.addEventListener("touchstart", e=>e.preventDefault(), {passive:false});
    window.addEventListener("touchmove", e=>e.preventDefault(), {passive:false});