【发布时间】:2019-07-15 03:09:24
【问题描述】:
我正在尝试在原生 JavaScript 中实现去抖动功能。我不确定为什么 clearTimeout 不清除超时对象。在每个事件触发器中,回调函数 setTimeout 如果距离上次调用不超过 5 秒,则清除刚刚创建的超时。但我没有看到超时被清除。
HTML:
<html>
<head>
</head>
<body>
<div id='move'>
</div>
<div id='result'>
</div>
</body>
JS:
var area;
var result;
function init() {
area = document.querySelector('#move');
area.addEventListener('mousemove', debouce1);
result = document.querySelector('#result');
}
function updateResult(event) {
let xCordinate = event.clientX;
let yCordinate = event.clientY;
result.textContent = `${xCordinate} , ${yCordinate}`;
}
function debounce1(fn, time) {
let firstTime = true;
let start;
return function() {
if (firstTime) {
fn.apply(null, arguments);
firstTime = false;
start = new Date();
} else {
let now = new Date();
let timer = setTimeout(() => {
fn.apply(null, arguments);
start = new Date();
}, time)
if (now - start < 4000) {
console.log('too fast');
clearTimeout(timer);
console.log(now - start);
console.log(timer);
start = new Date();
}
}
}
init();
【问题讨论】:
-
I don't see the timeout being cleared您希望如何看到这个?控制台是否显示too fast?然后是一个数字?clearTimeout(timer)应该“清除”该超时,它不会改变timer的值 -
同样
debounce1直接传递给addEventListener,而不是调用它并传递结果。 -
您是否期望变量
timer在调用clearTimeout(timer)后会有所不同? -
start和now是instanceof Date。你需要在那些上面.getTime(),意识到这会给你几毫秒。 -
@JaromandaX:如果我调用 clearTimeout(timer),我是不是没有清除超时?我以为它会清除计时器
标签: javascript