Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JavaScript中禁用重复键控_Javascript_Keydown - Fatal编程技术网

如何在JavaScript中禁用重复键控

如何在JavaScript中禁用重复键控,javascript,keydown,Javascript,Keydown,我和这个家伙有同样的问题,只是我没有使用jQuery,所以我很难将它翻译成“纯”JavaScript,不管怎样,我已经设置了开关-一些键的大小写,当我按住向右箭头键时,我的div正在飞行。另外,如果没有问题,您能告诉我当我按下右箭头键时,停止div移动的最简单方法是什么吗?我是否必须使用clearInterval或制作一个新的开关盒 switch (keyPressed) { case 39: setInterval(movFwr, 50); break;

我和这个家伙有同样的问题,只是我没有使用jQuery,所以我很难将它翻译成“纯”JavaScript,不管怎样,我已经设置了
开关
-一些键的大小写,当我按住向右箭头键时,我的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);
    }
}