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

时间:2018-12-18 17:15:51

标签: javascript

我正在尝试创建一个功能,该功能由按键执行并在执行后的特定时间内被禁用。

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

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

有没有办法在每次执行2秒后将其禁用(例如)?

6 个答案:

答案 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