onkeyup后如何触发onkeydown?

时间:2018-05-17 17:47:02

标签: javascript onkeydown onkeyup

我实施了以下内容:

var map = {};
document.onkeydown = document.onkeyup = function(e){
    e = e || event;
    map[e.keyCode] = e.type == 'keydown';

    if(map[38] && map[37]){ // UP + LEFT
        console.log('Up Left');
    }
    else if(map[38] && map[39]){ // UP + RIGHT
        console.log('Up Right');
    }
    else if(map[38]){ // UP
        console.log('Up');
    }
    else if(map[40]){ // DOWN
        console.log('Down');
    }
    else if(map[37]){ // LEFT
        console.log('Left');
    }
    else if(map[39]){ // RIGHT
        console.log('Right');
    }
}

如果我现在按下键盘上的向上按钮,那么我的控制台将反复记录“向上”。当我按住向上按钮并开始按下左按钮时,我的控制台开始反复记录“向左”。

现在我释放了左键,我的控制台只记录一次“up”但不再重复记录。

我怎样才能做到这一点?

我试图在StackOverflow上找到答案。但我发现解决方案只是在我释放左键后才“记录”一次。

任何人都可以帮忙或至少给出一个提示吗?

1 个答案:

答案 0 :(得分:0)

  

现在我发布左键,我的控制台只记录一次" up"但是   不要再反复登录了。

这是处理关键事件的默认行为,即使在常见的文本编辑器上,如this answer.

所述
  

我怎样才能做到这一点?

如果通过这个问题,你的意思是如何继续打印" up"当按下UP键时,您将不得不改变您的方法。

一种可能的方法是在地图字段上按住按键的状态,并在短时间间隔内重复输出状态。例如,请尝试使用此代码:

var map = {};
document.onkeydown = document.onkeyup = function(e){
    map[e.keyCode] = e.type == 'keydown';
}

logKeyState = function(){
    if(map[38] && map[37]){ // UP + LEFT
        console.log('Up Left');
    }
    else if(map[38] && map[39]){ // UP + RIGHT
        console.log('Up Right');
    }
    else if(map[38]){ // UP
        console.log('Up');
    }
    else if(map[40]){ // DOWN
        console.log('Down');
    }
    else if(map[37]){ // LEFT
        console.log('Left');
    }
    else if(map[39]){ // RIGHT
        console.log('Right');
    }
    setTimeout(logKeyState,50);
}
//Start logging  
logKeyState();