Javascript 检测手指何时从触摸板上移开,但由于“";预测性触摸“JS
我有一个函数,可以处理每个时间段的滚动。当用户使用鼠标滚轮滚动时,此功能起作用:Javascript 检测手指何时从触摸板上移开,但由于“";预测性触摸“JS,javascript,Javascript,我有一个函数,可以处理每个时间段的滚动。当用户使用鼠标滚轮滚动时,此功能起作用: let shouldHandle = true window.addEventListener('wheel', e => { if (shouldHandle) { handleScroll(e) // I will handle scrolls here shouldHandle = false setTimeout(() => {
let shouldHandle = true
window.addEventListener('wheel', e => {
if (shouldHandle) {
handleScroll(e) // I will handle scrolls here
shouldHandle = false
setTimeout(() => {
shouldHandle = true
}, 750)
}
})
但是,当我使用笔记本电脑的触摸板滚动时,即使我取下手指,滚动仍会发生(特别是当我将手指加速到足够的速度并滚动,然后立即将手指从触摸板上取下时)。因此,在750ms
之后仍然会出现滚动,即使用户在技术上没有滚动。有人问过这个问题。该问题没有得到处理此行为的答案
我只想在上次滚动经过一段时间后处理滚动。我想处理的卷轴一定不是因为这个“预测触摸”卷轴导致的滚动。到目前为止,有没有办法做到这一点?唯一的办法是在看到滚动开始后,观察一段时间(轮询,可能每50毫秒左右),然后等待滚动稳定下来(在同一位置的X毫秒,不管你决定的X值是多少)然后只考虑滚动“完成”,并启动你的750MS定时器。不断地进行轮询是不好的,但是在滚动仍然活跃的情况下进行短暂的轮询似乎是可以接受的 大致草图(例如,可能使用总超时):
我认为代码应该在最后四行之前插入这一行:
lastcrolly=window.scrollY
。此外,这段代码意味着不会处理非“预测性触摸”(而是因为用户确实在滚动)导致的连续滚动,对吗?@Richard-恐怕我不知道你的意思“最后四行。我相当肯定lastcrolly=window.scrollY
在上面没有的地方是不需要的。是的,waitForScrollEnd
将等待滚动结束,不管滚动为什么进行。@Richard-(我认为这与您的评论无关。)用新的眼光审视上述内容,我觉得如果出现新事件,它似乎想取消以前的waitForScrollEnd
。我添加了这一点,但它实际上只是一个调整……啊,我的意思是:之前的代码只调用waitForScrollEnd
一次,这是用户第一次滚动的时候。之后,waitForScrollEnd
将只更新lastcrolly
一次,但每50毫秒调用一次poll
。但是,由于lastcrolly
只更新一次,因此即使滚动停止,poll
也将每隔50毫秒连续调用一次。@Richard-Doh!!固定的。:-)(倒数第四,我现在明白了。)
// VERY ROUGHLY
let shouldHandle = true
let lastScrollY = null
let lastScrollTimer = 0
window.addEventListener('wheel', e => {
if (shouldHandle) {
handleScroll(e) // I will handle scrolls here
shouldHandle = false
waitForScrollEnd(() => {
setTimeout(() => {
shouldHandle = true
}, 750) // Or perhaps 700 on the basis that up to 50 was spent in `waitForScrollToEnd`
})
}
})
function waitForScrollEnd(cb) {
clearTimeout(lastScrollTimer)
lastScrollY = window.scrollY
lastScrollTimer = setTimeout(poll, 50)
function poll() {
if (lastScrollY === window.scrollY) {
lastScrollY = null
lastScrollTimer = 0 // This is entirely optional but makes it parallel with the `else` below
cb()
} else {
lastScrollY = window.scrollY
lastScrollTimer = setTimeout(poll, 50)
}
}
}