如何在JavaScript中禁用重复键控
我和这个家伙有同样的问题,只是我没有使用jQuery,所以我很难将它翻译成“纯”JavaScript,不管怎样,我已经设置了如何在JavaScript中禁用重复键控,javascript,keydown,Javascript,Keydown,我和这个家伙有同样的问题,只是我没有使用jQuery,所以我很难将它翻译成“纯”JavaScript,不管怎样,我已经设置了开关-一些键的大小写,当我按住向右箭头键时,我的div正在飞行。另外,如果没有问题,您能告诉我当我按下右箭头键时,停止div移动的最简单方法是什么吗?我是否必须使用clearInterval或制作一个新的开关盒 switch (keyPressed) { case 39: setInterval(movFwr, 50); break;
开关
-一些键的大小写,当我按住向右箭头键时,我的div正在飞行。另外,如果没有问题,您能告诉我当我按下右箭头键时,停止div移动的最简单方法是什么吗?我是否必须使用clearInterval
或制作一个新的开关盒
switch (keyPressed) {
case 39:
setInterval(movFwr, 50);
break;
}
function movFwr() {
if (currPos == 1000) {
a.style.left = 1000 + "px";
} else currPos += 10;
a.style.left = trenutnaPozicija + "px";
}
对不起,伙计们,我最近有点忙,我正在测试所有的可能性,到目前为止,我看到了一些有趣的建议。我会测试他们所有这些天,然后什么是你在这个网站上做的速度。我必须说,这是一个伟大的社区。谢谢大家的帮助:)像这样的东西应该可以奏效
var down = false;
document.addEventListener('keydown', function () {
if(down) return;
down = true;
// your magic code here
}, false);
document.addEventListener('keyup', function () {
down = false;
}, false);
跟踪最后按下的键,如果它与当前键相同,则返回忽略它,并使用
clearInterval
停止间隔
//global variables
var lastKey = 0;
var moveTimer = [];
//in keydown function
if(lastKey == keyPressed)
return;
switch (keyPressed) {
case 39:
lastKey = keyPressed
moveTimer[keyPressed] = setInterval(movFwr, 50);
break;
}
//in a onkey up function
lastKey = null;
if(typeof(moveTimer[keyPressed]) != "undefined")
clearInterval(moveTimer[keyPressed]);
如果没有足够的时间,我会记录时间并阻止采取行动,例如使用
var lastPress=0;
函数myListener(){
var now=Date.now();
如果(现在-lastPress<1000)return;//不到一秒钟前,停止
lastPress=现在;
//继续。。
}
这可以成为一个更通用的函数
function restrict(func, minDuration) {
var lastPress = 0;
return function () {
var now = Date.now();
if (now - lastPress < minDuration) return; // or `throw`
lastPress = now;
return func.apply(this, arguments);
};
}
// now, for example
foo = function () {console.log('foo');};
bar = restrict(foo, 200); // only permit up to once every 200ms
bar(); // logs "foo"
bar(); // void as less than 200ms passed
功能限制(功能、持续时间){
var-lastPress=0;
返回函数(){
var now=Date.now();
if(now-lastPress
若要忽略由按键重复引起的按键事件,请跟踪在keydown
和keydup
事件期间按下的按键
var pressedKeys = [];
function keydownHandler(e) {
var isRepeating = !!pressedKeys[e.keyCode];
pressedKeys[e.keyCode] = true;
switch (e.keyCode) {
case !isRepeating && 39:
// do something when the right arrow key is pressed, but not repeating
break;
}
}
function keyupHandler(e) {
pressedkeys[e.keyCode] = false;
}
要停止div移动,可以跟踪数组中的间隔ID,并在keyup
事件期间使用类似clearInterval(intervalIds[e.keyCode])
的内容清除间隔,但我可能会切换到使用setTimeout()
并检查它们的键是否已关闭。这样,您就不必跟踪其他变量
var pressedKeys = [];
function keydownHandler(e) {
var isRepeating = !!pressedKeys[e.keyCode];
pressedKeys[e.keyCode] = true;
switch (e.keyCode) {
case !isRepeating && 39:
movFwr();
break;
}
}
function keyupHandler(e) {
pressedkeys[e.keyCode] = false;
}
function movFwr() {
if (pressedKeys[39] && currPos < 1000) {
currPos += 10;
a.style.left = currPos + "px";
setTimeout(movFwr, 50);
}
}
var pressedKeys=[];
函数keydownHandler(e){
var isRepeating=!!按按键[e.keyCode];
按按键[e.keyCode]=真;
开关(如钥匙代码){
案例!isRepeating&&39:
movFwr();
打破
}
}
函数keyupHandler(e){
按键[e.keyCode]=假;
}
函数movFwr(){
如果(按[39]键和&currPos<1000){
currPos+=10;
a、 style.left=currPos+“px”;
设置超时(movFwr,50);
}
}
这样,当div到达右边缘时,您也会自动停止重复该功能,而不是等待用户释放箭头键。您到底想做什么?setinterval始终是一个糟糕的解决方案如果在第一个代码中的1秒内按下不同的键,则可能会阻止它们被按下,或者比第二个更快。是的,这取决于代码中使用的破译,例如,如果它是所有的键,或者只有在你已经确定了哪个键之后。这一个帮助我解决了我遇到的另外一个问题(不得不修改一下):D谢谢。这是最简单的,最通用的解决方案。当事件上有一个“repeat”布尔属性时,为什么要创建和管理另一个变量?一旦事件开始重复,该属性就会设置为true。addEventListener('keydown',函数(e){if(e.repeat)return;//TODO…},false)@DDN显示良好,
状态已过时
。。。2019年仍然相关,但最好使用const isDown={}
然后将isDown[evt.key]
设置为布尔值(当然,今天也是如此,但即使在2013年,捕获标志也几乎没有用,因此无需指定)状态已过时,但替代品在哪里?MDN说,KeyBoardEvent本身的DOM3规范已经过时,而at的草案规范是当前的规范。但这包括重复。所以说实话,这有点让人困惑。
var pressedKeys = [];
function keydownHandler(e) {
var isRepeating = !!pressedKeys[e.keyCode];
pressedKeys[e.keyCode] = true;
switch (e.keyCode) {
case !isRepeating && 39:
movFwr();
break;
}
}
function keyupHandler(e) {
pressedkeys[e.keyCode] = false;
}
function movFwr() {
if (pressedKeys[39] && currPos < 1000) {
currPos += 10;
a.style.left = currPos + "px";
setTimeout(movFwr, 50);
}
}