Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 检测手指何时从触摸板上移开,但由于“";预测性触摸“JS_Javascript - Fatal编程技术网

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)
        }
    }
}