Javascript JS函数在执行后的特定时间内自禁用

Javascript JS函数在执行后的特定时间内自禁用,javascript,Javascript,我正在尝试创建一个由按键执行并在执行后的特定时间内禁用的函数 function do_something() { console.log('lorem ipsum'); } document.onkeypress = function(e) { if (e.keyCode == '32') { do_something(); } } 有没有办法在每次执行后(比方说)2秒钟内禁用它?是的,有一种方法:使用超时将布尔值临时设置为某个值,然后在调用do\u somethin

我正在尝试创建一个由按键执行并在执行后的特定时间内禁用的函数

function do_something() {
    console.log('lorem ipsum');
}

document.onkeypress = function(e) {
  if (e.keyCode == '32') {
    do_something();
  }
}

有没有办法在每次执行后(比方说)2秒钟内禁用它?

是的,有一种方法:使用超时将布尔值临时设置为某个值,然后在调用
do\u 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所指出的:根据准确性的重要性,这可能不是最好的方法,因为(正如您所见)它可能不准确。

一个非常愚蠢的答案是在特定的时间内休眠javascript执行

function sleep(delay) {
  var start = new Date().getTime();
  while (new Date().getTime() < start + delay);
}

我说的
愚蠢
,因为它会在特定时间内停止整个脚本,您可能不需要这种行为

Lodash为此目的提供了一个解决方案。

类似的东西,执行将被禁用5秒

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();
  }
}
var=0;
document.onkeypress=功能(e){
var now=新日期();
如果(现在-lastClicked>5000){//设置5s延迟
lastClicked=现在;
如果(e.keyCode=='32'){
做某事;
}
}
}
函数do_something(){
console.log('lorem ipsum');

}
试试看,这是一个非常简单明了的解决方案:

var firstExecution=0;//存储第一次执行时间
var间隔=2000;//2秒
函数do_something(){
//当前日期
变量日期=新日期();
var毫秒=date.getTime();
如果((毫秒-首次执行)>间隔){
firstExecution=毫秒;
console.log('lorem ipsum');
}否则{
console.log(“太早”);
}
}
document.onkeypress=功能(e){
如果(e.keyCode=='32'){
做某事;
}

}
我认为它应该真正防止dou\u something函数发生,而不是返回。是的,我知道它的工作原理完全相同,只是概念上我明白你的意思,但是这样调用“do_something()”并不重要,它将尊重超时,这就是为什么,嗯,是的,我不确定他是否想禁用该函数,或者他们键入eventnotice,setTimeout也不准确,可以稍后在页面中触发。如果执行是基于精确时间的,则不可靠:这比
愚蠢的
更糟糕。您正在以尽可能快的速度运行cpu周期,而实际上什么也不做。它将使整个界面滞后,只是为了以更好的方式做一些容易做的事情。您不应该使用此代码。@MarkMeyer所以请告诉我们您的解决方案,然后我就没有理由发布解决方案,有几个已经发布到此线程。@MarkMeyer我相信它们都会在特定的时间内阻止整个应用程序,实际上没有其他方法可以防止函数调用这是错误的。setTImeout与异步回调一起排队。它不会阻塞线程。这就是javascript中异步代码的全部要点。测试非常简单。setTimeout不准确,可能会在稍后的页面中触发。如果执行是精确的基于时间的,那么它就不可靠:只是测试了一下,它实际上是非常不准确的,没错。当然,这并不重要,但值得注意
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();
  }
}