如何清除函数中的 setInterval
How to clear setInterval in a Function
你好,我有一个问题。
有谁知道,为什么我的“clearInterval”在点击后不起作用?
"use strict";
let activeCount = 0;
let switcher = document.getElementById("counter__switcher");
let counter = document.getElementById("counter__number");
counter.innerText = "0";
let parsed = parseInt(counter.innerText);
switcher.addEventListener("click", function(e) {
if(activeCount == 0) {
counter.classList.toggle("d-block");
e = setInterval(function() {
counter.innerText = parsed++;
},1000)
activeCount = 1;
console.log(activeCount)
}
else {
window.clearInterval(e);
}
})
你在这里做错了很多事情。
首先,变量 e
中存储了事件数据(如点击的坐标),因此您不应将其重新分配以携带另一个不相关的值。其次,由于您是在回调函数中访问它,因此需要牢记两点,首先,包含超时的变量应该是全局变量,不应分配其他值。
在您的示例中,一旦函数完成,包含超时的变量 e
将被销毁/垃圾收集。而当回调函数再次为运行时,变量e
携带的是事件对象,而不是可以传递给clearInterval的timeout。
要做到这一点,请使用 let someTimeout;
正确声明全局变量并为其赋值或相应地在回调函数中调用 clearInterval。
这是一个编辑过的例子:
"use strict";
let activeCount = 0;
let switcher = document.getElementById("counter__switcher");
let counter = document.getElementById("counter__number");
let myTimeout;
counter.innerText = "0";
let parsed = parseInt(counter.innerText);
switcher.addEventListener("click", function(e) {
if(activeCount == 0) {
counter.classList.toggle("d-block");
myTimeout = setInterval(function() {
counter.innerText = parsed++;
},1000)
activeCount = 1;
console.log(activeCount)
}
else {
window.clearInterval(myTimeout);
}
})
您应该在点击处理程序之外声明间隔
let switcher = document.getElementById("counter__switcher");
let counter = document.getElementById("counter__number");
counter.innerText = "0";
let parsed = parseInt(counter.innerText);
let interval;
switcher.addEventListener("click", function() {
if (!interval) {
counter.classList.toggle("d-block");
interval = setInterval(function() {
counter.innerText = parsed++;
}, 1000)
} else {
clearInterval(interval);
// setting this to undefined so that you can resume the counter
interval = undefined;
}
})
<div>
<span id="counter__number"></span>
<button id="counter__switcher">switch</button>
</div>
在您的代码中,e
参数将包含事件并且您正在用间隔覆盖它,后续点击将到达 else 块,但这次 e
将没有间隔这将是一个新事件。
你好,我有一个问题。
有谁知道,为什么我的“clearInterval”在点击后不起作用?
"use strict";
let activeCount = 0;
let switcher = document.getElementById("counter__switcher");
let counter = document.getElementById("counter__number");
counter.innerText = "0";
let parsed = parseInt(counter.innerText);
switcher.addEventListener("click", function(e) {
if(activeCount == 0) {
counter.classList.toggle("d-block");
e = setInterval(function() {
counter.innerText = parsed++;
},1000)
activeCount = 1;
console.log(activeCount)
}
else {
window.clearInterval(e);
}
})
你在这里做错了很多事情。
首先,变量 e
中存储了事件数据(如点击的坐标),因此您不应将其重新分配以携带另一个不相关的值。其次,由于您是在回调函数中访问它,因此需要牢记两点,首先,包含超时的变量应该是全局变量,不应分配其他值。
在您的示例中,一旦函数完成,包含超时的变量 e
将被销毁/垃圾收集。而当回调函数再次为运行时,变量e
携带的是事件对象,而不是可以传递给clearInterval的timeout。
要做到这一点,请使用 let someTimeout;
正确声明全局变量并为其赋值或相应地在回调函数中调用 clearInterval。
这是一个编辑过的例子:
"use strict";
let activeCount = 0;
let switcher = document.getElementById("counter__switcher");
let counter = document.getElementById("counter__number");
let myTimeout;
counter.innerText = "0";
let parsed = parseInt(counter.innerText);
switcher.addEventListener("click", function(e) {
if(activeCount == 0) {
counter.classList.toggle("d-block");
myTimeout = setInterval(function() {
counter.innerText = parsed++;
},1000)
activeCount = 1;
console.log(activeCount)
}
else {
window.clearInterval(myTimeout);
}
})
您应该在点击处理程序之外声明间隔
let switcher = document.getElementById("counter__switcher");
let counter = document.getElementById("counter__number");
counter.innerText = "0";
let parsed = parseInt(counter.innerText);
let interval;
switcher.addEventListener("click", function() {
if (!interval) {
counter.classList.toggle("d-block");
interval = setInterval(function() {
counter.innerText = parsed++;
}, 1000)
} else {
clearInterval(interval);
// setting this to undefined so that you can resume the counter
interval = undefined;
}
})
<div>
<span id="counter__number"></span>
<button id="counter__switcher">switch</button>
</div>
在您的代码中,e
参数将包含事件并且您正在用间隔覆盖它,后续点击将到达 else 块,但这次 e
将没有间隔这将是一个新事件。