当我按Spacebar时,函数拍摄执行。
window.onkeydown=function(e){
var which = e.keyCode;
if(which == 32){
shoot();
}
}
如果您握住空间,请连续多次射击。我只希望该功能每500ms执行一次。
(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
您将要" debounce"
使用jQuery节气门/调试,您可以将延迟和功能传递给 $ .debounce获得一个新功能,当重复称为时, 每次"呼叫"只执行一次原始函数。
这对于限制处理程序的费率特别有用 关于将触发Ajax请求的事件。看看这个 示例自己看看!
Ben Alman在这里为您做了辛勤工作:http://benalman.com/code/projects/jquery-throttle-debouse/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
事件并在keyup
事件上停止的计时器。
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("keyup", function(e) {
if (e.keyCode == 32 && fireTimer !== null) {
clearInterval(fireTimer);
fireTimer = null;
}
});