当我按空格键时,功能拍摄会执行。
window.onkeydown=function(e){
var which = e.keyCode;
if(which == 32){
shoot();
}
}
如果您按住空格,请连续多次拍摄电话。我只想让函数每500ms执行一次。
答案 0 :(得分:2)
(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<br/>");
setTimeout(function(){
lazerCharging = false;
}, chargeTime)
}
}
$(window).on("keydown", handleKeyPress);
})($);
这是jsfiddle
答案 1 :(得分:1)
你想要“辩护”
使用jQuery油门/去抖动,您可以传递延迟和功能 $ .debounce来获取一个新函数,当重复调用时, 每次“一堆”调用只执行一次原始函数。
这对于处理程序的速率限制执行特别有用 在将触发AJAX请求的事件上。看看这个 例子,亲眼看看!
Ben Alman在这里为你付出了辛勤的努力:http://benalman.com/code/projects/jquery-throttle-debounce/examples/debounce/
答案 2 :(得分:1)
基本上是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;
}
}
});
答案 3 :(得分:0)
我怀疑保证keydown
/ keypress
事件总是不断被触发。它可能取决于浏览器,操作系统设置等。即使它们,“火灾率”可能会波动。你可能不想要这个。
我认为更好的想法是创建一个计时器,该计时器在第一个keydown
事件被触发时启动,并在keyup
事件中停止。
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("keyup", function(e) {
if (e.keyCode == 32 && fireTimer !== null) {
clearInterval(fireTimer);
fireTimer = null;
}
});