Только иметь возможность нажимать пространство раз в полсекунды

Когда я нажимаю пробел, выполняется стрельба функции.

window.onkeydown=function(e){
 var which = e.keyCode;
 if(which == 32){
 shoot();
 }
}

Если вы держите место, стреляйте много раз подряд. Я хочу, чтобы функция выполнялась только каждые 500 мс.

4 ответа

(function($){

 var lazerCharging = false,
 lazerChargeTime = 500; // Charge time in ms

 function handleKeyPress(e){
 if(e.keyCode == 32){
 shoot(lazerChargeTime); 
 }
 }

 function shoot(chargeTime){

 if(!lazerCharging){ 

 lazerCharging = true; 
 $("body").append("pew");

 setTimeout(function(){
 lazerCharging = false;
 }, chargeTime) 
 } 
 }

 $(window).on("keydown", handleKeyPress);

})($);

Здесь jsfiddle


Вы захотите "отбросить",

Используя jQuery throttle/debounce, вы можете передать задержку и функцию в $.debounce, чтобы получить новую функцию, которая при повторном вызове выполняет исходную функцию только один раз за "связку" вызовов.

Это может быть особенно полезно для ограничения скорости выполнения обработчиков событий, которые будут запускать запросы AJAX. Просто взгляните на этот пример, чтобы убедиться сами!

Бен Алман сделал для вас тяжелую работу: http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/


По сути, это отговорка, предложенная MattC. Сохраните время, когда функция была вызвана последним, и убедитесь, что прошло 500 мс. Также вы, вероятно, должны использовать .addEventListener вместо window.onkeydown

(function() {
 var lastCallTime = 0;
 window.onkeydown = function(e){
 var now = Date.now();
 if(e.keyCode == 32 && now - lastCallTime > 500) {
 shoot();
 lastCallTime = now;
 }
 }
});


Я сомневаюсь в том, что события keydown/keypress всегда срабатывают непрерывно. Это может зависеть от браузера, настроек операционной системы и т.д. Даже если они есть, "огонь" может колебаться. Вы, вероятно, этого не хотите.

Я думаю, что лучшей идеей было бы создать таймер, который был запущен при первом keydown события keydown, и остановился на событии *****.

http://jsfiddle.net/kPbLH/

var fireTimer = null;

function fire() {
 // do whatever you need
}

document.addEventListener("keydown", function(e) {
 if (e.keyCode == 32 && fireTimer === null) {
 fire(); // fire immediately...
 fireTimer = setInterval(fire, 500); // ...and 500ms, 1000ms and so on after
 }
});

document.addEventListener("*****", function(e) {
 if (e.keyCode == 32 && fireTimer !== null) {
 clearInterval(fireTimer);
 fireTimer = null;
 }
});

licensed under cc by-sa 3.0 with attribution.