滚动已经开始后,Javascript在touchmove上停止滚动

标签 javascript scroll event-handling preventdefault touchmove

我有一个简单的例子,用户开始在触摸屏上滚动,然后一秒钟后,我想禁用滚动。我认为 event.preventDefault() 会停止滚动,但滚动已经开始后它似乎不起作用
这是一个例子:https://jsfiddle.net/7s5m8c6L/30/

let allowScroll=true;

function TS(e){//touchstart handler
  setTimeout(function(){
    allowScroll=false;
  },1000)
}

function TM(e){//touchmove handler
  if(!allowScroll){
    e.preventDefault();
  }
}
在此示例中,您可以开始滚动,一秒钟后,我希望滚动停止,但它没有。我知道有一些方法可以让它与 CSS 一起工作(添加溢出:隐藏),但我特别想知道为什么 preventDefault 不起作用。

最佳答案

如果您使用的是 chrome,控制台中有提示:

[Intervention] Ignored attempt to cancel a touchmove event with cancelable=false, for example because scrolling is in progress and cannot be interrupted.


问题正是 Event.cancelable .不幸的是,这个属性是只读的,调用 preventDefault 是不安全的。对于不可取消的事件。如果您打印 e.cancelableTM您可以在整个滚动过程中观察到 e.cancelable是假的。

关于滚动已经开始后,Javascript在touchmove上停止滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67768117/

相关文章:

javascript - JS 滚动发生在页面准备好之前

html - 全屏图像直到滚动(响应)

java - 在 TextWatcher for Android 中控制事件的触发

c# - 添加数据后如何滚动到 ListView 的末尾 - WPF

javascript - 仅在表单值发生更改时发送 post/get

javascript - 如何使用 javascript 添加 img 元素?

javascript - 如何比较两个数组对象的特定字符串?

javascript - Cesium 如何在放大/缩小时缩放多边形以匹配 Lat-Lon 位置

html - 如何只为 iframe 显示垂直滚动条?

c# - 检查是否已附加特定的事件处理程序方法