clearTimeout无法处理mouseup事件

问题描述 投票:0回答:2

为什么无法在此设置中清除超时?如何弥补()停止运行延迟的动作?

var active = false;
var delay;

window.addEventListener("mousedown", down, false);
window.addEventListener("mouseup", up, false);
window.addEventListener("mousemove", move, false);

function down(e) {
    active = true;
    console.log("down")
    window.scrollTo(0,document.body.scrollHeight);
}

function up(e) {
    active = false;
    clearTimeout(delay); //expecting this to clear delay
    console.log("up")
    window.scrollTo(0,document.body.scrollHeight);
}

function move(e) {
    if (active) {
        delay = setTimeout(function() {
            console.log("move")
            window.scrollTo(0,document.body.scrollHeight);
        }, 50);
    }
}

期望在鼠标向上清除延迟,但仍会执行。

javascript settimeout mousemove mouseup cleartimeout
2个回答
0
投票

您在每次动作中都保持超时。它不会替代最后一个...

您的代码基本上是这个

delay = setTimeout(function() { } <-- will run
delay = setTimeout(function() { } <-- will run
delay = setTimeout(function() { } <-- will run
delay = setTimeout(function() { } <-- will run
delay = setTimeout(function() { } <-- will run
delay = setTimeout(function() { } <-- will run
delay = setTimeout(function() { } <-- cancels this one
window.clearTimeout(delay)

因此您需要先删除它,然后再创建一个新的>]

if (active) {
    if (delay) window.clearTimeout(delay)
    delay = setTimeout(function() {
        console.log("move")
        window.scrollTo(0,document.body.scrollHeight);
    }, 50);
}

如果您需要移动不止一次射击,则需要查看节流脚本。


0
投票

答案:

© www.soinside.com 2019 - 2024. All rights reserved.