Javascript 滚动已经开始后停止在 touchmove 上滚动
Javascript stop scrolling on touchmove after scrolling has already started
我有一个简单的例子,用户开始在触摸屏上滚动,一秒钟后,我想禁用滚动。我以为 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(添加 overflow:hidden)一起使用,但我特别想知道为什么 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
是不安全的。如果您在 TM
函数中打印 e.cancelable
,您可以观察到在整个滚动过程中 e.cancelable
为 false。
我有一个简单的例子,用户开始在触摸屏上滚动,一秒钟后,我想禁用滚动。我以为 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(添加 overflow:hidden)一起使用,但我特别想知道为什么 preventDefault 不起作用。
如果你使用的是chrome,控制台有提示:
[Intervention] Ignored attempt to cancel a
touchmove
event withcancelable=false
, for example because scrolling is in progress and cannot be interrupted.
问题正是Event.cancelable
。不幸的是,这个 属性 是只读的,为不可取消的事件调用 preventDefault
是不安全的。如果您在 TM
函数中打印 e.cancelable
,您可以观察到在整个滚动过程中 e.cancelable
为 false。