我正在尝试创建一个功能,该功能由按键执行并在执行后的特定时间内被禁用。
function do_something() {
console.log('lorem ipsum');
}
document.onkeypress = function(e) {
if (e.keyCode == '32') {
do_something();
}
}
有没有办法在每次执行2秒后将其禁用(例如)?
答案 0 :(得分:2)
是的,有一种方法:使用 Timeout 暂时将布尔值设置为某个值,然后在调用do_something()
之前先检查它的值。 >
示例:
let cooldown = false;
const RECHARGE_TIME = 2000; //ms
function do_something() {
console.log('lorem ipsum');
}
document.onkeypress = function(e) {
if (!cooldown && e.keyCode == '32') {
do_something();
startCooldown();
}
}
function startCooldown() {
cooldown = true;
setTimeout (function(){ cooldown = false}, RECHARGE_TIME);
}
编辑:,如MosèRaguzzini 所述:根据准确性的重要性,这可能不是最佳方法,因为(您可以看到{{3} })可能不准确。
答案 1 :(得分:2)
尝试一下,这是一个非常简单明了的解决方案:
var firstExecution = 0; // Store the first execution time
var interval = 2000; // 2 seconds
function do_something() {
// current date
var date = new Date();
var milliseconds = date.getTime();
if((milliseconds - firstExecution) > interval){
firstExecution = milliseconds;
console.log('lorem ipsum');
} else {
console.log('too early');
}
}
document.onkeypress = function(e) {
if (e.keyCode == '32') {
do_something();
}
}
答案 2 :(得分:0)
一个非常愚蠢的答案是在特定时间内休眠javascript执行。
function sleep(delay) {
var start = new Date().getTime();
while (new Date().getTime() < start + delay);
}
然后
document.onkeypress = function(e) {
if (e.keyCode == '32') {
do_something();
sleep(2000);
}
}
我说silly
是因为它会在特定时间内停止整个脚本,所以您可能不需要这种行为!
答案 3 :(得分:0)
类似的事情,执行将被禁用5 s
var lastClicked = 0;
document.onkeypress = function(e) {
var now = new Date();
if (now - lastClicked > 5000) { //set a 5s delay
lastClicked = now;
if (e.keyCode == '32') {
do_something();
}
}
}
function do_something() {
console.log('lorem ipsum');
}
答案 4 :(得分:-1)
var timeout = false; //Control variable
var miliseconds = 2000; //Time in miliseconds for the function to enable again
function do_something() {
if(timeout) return alert("Function disabled");
console.log('lorem ipsum');
timeout = true;
setTimeout(function() { timeout = false }, miliseconds);
}
document.onkeypress = function(e) {
if (e.keyCode == '32') {
do_something();
}
}
答案 5 :(得分:-1)
Lodash为此目的有throttle。