Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/452.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_Input_Keyboard - Fatal编程技术网

Javascript 检查钥匙是否已关闭?

Javascript 检查钥匙是否已关闭?,javascript,input,keyboard,Javascript,Input,Keyboard,有没有一种方法可以检测JavaScript中的键当前是否已关闭 我知道“按键”事件,但那不是我需要的。按键后的一段时间,我希望能够检测到它是否仍被按下 另外,最大的问题似乎是,在一段时间后,钥匙开始重复,像恶魔一样触发按键和按键事件。希望只有一个简单的isKeyDown(key)函数,但如果没有,那么这个问题需要解决。以前有人问过这类问题(尽管我现在没有看到任何明显的重复) 我认为答案是keydown事件(以及它的孪生keydup)就是您所获得的所有信息。重复是非常牢固地连接到操作系统中的,应用

有没有一种方法可以检测JavaScript中的键当前是否已关闭

我知道“按键”事件,但那不是我需要的。按键后的一段时间,我希望能够检测到它是否仍被按下


另外,最大的问题似乎是,在一段时间后,钥匙开始重复,像恶魔一样触发按键和按键事件。希望只有一个简单的isKeyDown(key)函数,但如果没有,那么这个问题需要解决。

以前有人问过这类问题(尽管我现在没有看到任何明显的重复)

我认为答案是
keydown
事件(以及它的孪生
keydup
)就是您所获得的所有信息。重复是非常牢固地连接到操作系统中的,应用程序没有多少机会查询BIOS中密钥的实际状态

您可以做的,如果您需要让它工作,您可能必须做的是以编程方式取消键反弹。基本上,您可以自己评估
keydown
keydup
,但如果
keydup
事件在上一次
keydown
之后发生得太快,则忽略该事件。。。或者本质上,您应该将对
keyup
的响应延迟足够长的时间,以确保不会发生另一个
keyup
事件,比如0.25秒的
keyup


这将涉及使用计时器活动,并记录以前事件的毫秒时间。我不能说这是一个非常吸引人的解决方案,但是…

我不相信有任何东西像isKeyDown函数,但是你可以自己编写

基本上,创建一个数组,其长度是要监视的键数。然后使用documents/pages/controls键向上和键向下事件,使用该键的状态更新数组

然后编写一个函数,检查某个键是否已关闭并返回布尔值

var keyEnum = { W_Key:0, A_Key:1, S_Key:2, D_Key:3 };
var keyArray = new Array(4);

function onKeyDown()
{
    // Detect which key was pressed
    if( key == 'w' )
        keyArray[keyEnum.W_Key] = true;
    // Repeat for each key you care about...
}

function onKeyUp()
{
    // Detect which key was released
    if( key == 'w' )
        keyArray[keyEnum.W_Key] = false;
    // Repeat for each key you care about...
}

function isKeyDown(key)
{
    return keyArray[key];
}
这应该能实现你想要的

有没有一种方法可以检测JavaScript中的键当前是否已关闭

没有。唯一的可能是监视每个
keypup
keypdown
并记住

一段时间后,按键开始重复,像恶魔一样触发按键向下和按键向上事件

不应该。你肯定会重复使用
keypress
,在许多浏览器中,你也会重复使用
keydown
,但如果
keydup
重复,那就是一个bug

不幸的是,这并不是一个完全前所未闻的错误:在Linux、Chromium和Firefox上(当它在GTK+下运行时,它在流行的发行版(如Ubuntu)中)都会为持有的键生成重复的keypup-keypress-keypdown序列,这与某人快速敲击键是不可能区分的

$('#mytextbox').keydown(function (e) {
            if (e.keyCode == 13) {
                if (e.altKey) {
                    alert("alt is pressed");
                }
            }
 });

如果按alt+enter键,您将看到警报。

除了使用
keyup
keydown
侦听器跟踪is键何时向下和向上移动外,实际上还有一些属性可以告诉您某些键是否向下

window.onmousemove = function (e) {
  if (!e) e = window.event;
  if (e.shiftKey) {/*shift is down*/}
  if (e.altKey) {/*alt is down*/}
  if (e.ctrlKey) {/*ctrl is down*/}
  if (e.metaKey) {/*cmd is down*/}
}
这在所有浏览器生成的事件对象上都可用,例如来自
keydown
keydup
keypress
的对象,因此您不必使用mousemove

我试图用
document.createEvent('KeyboardEvent')
document.createEvent('KeyboardEvent')
生成我自己的事件对象,并寻找
e.shiftKey
等等,但我没有运气


我在Mac上使用Chrome 17

以下代码是我正在使用的:

/*
Tracks what keys are currently down on the keyboard
*/

function keyboard_module(onUpdate){
    var kb = {};
    var unicode_mapping = {};
    document.onkeydown = function(e){
        var unicode=e.charCode? e.charCode : e.keyCode
        var key = getKey(unicode);
        kb[key] = true;
        if(onUpdate){
            onUpdate(kb);
        }
    }

    document.onkeyup = function(e){
        var unicode=e.charCode? e.charCode : e.keyCode
        var key = getKey(unicode);
        delete kb[key];
        if(onUpdate){
            onUpdate(kb);
        }
    }

    function getKey(unicode){
        if(unicode_mapping[unicode]){
            var key = unicode_mapping[unicode];
        }else{
            var key= unicode_mapping[unicode] = String.fromCharCode(unicode);
        }
        return key;
    }
    return kb;
}

function testing(kb){
    console.log('These are the down keys', kb);
}


var keyboard = keyboard_module(testing);

....
//somewhere else in the code
if(keyboard['K']){/*do something special */}
var altKeyDownCount = 0;
window.onkeydown = function (e) {
    if (!e) e = window.event;
    if (e.altKey) {
        altKeyDownCount++;
        if (30 < altKeyDownCount) {
            $('.key').removeClass('hidden');
            altKeyDownCount = 0;
        }
        return false;
    }
}

window.onkeyup = function (e) {
    if (!e) e = window.event;
    altKeyDownCount = 0;
    $('.key').addClass('hidden');
}
var-altKeyDownCount=0;
window.onkeydown=函数(e){
如果(!e)e=window.event;
如果(如altKey){
altKeyDownCount++;
如果(30
当用户按住Alt键一段时间(约2秒)时,会出现一组标签(class='key hidden')。释放Alt键时,标签将消失。jQuery和引导都使用。

我的解决方案:

var pressedKeys = {};
window.onkeyup = function(e) { pressedKeys[e.keyCode] = false; }
window.onkeydown = function(e) { pressedKeys[e.keyCode] = true; }
我现在可以通过检查来检查脚本中是否有任何键被按下

pressedKeys["code of the key"]

如果这是真的,按键被按下。

我知道这是一个非常老的问题,但是有一个非常轻量级的(~5Kb)JavaScript库,它可以有效地“修补”使用DOM API时键盘事件处理程序不一致的触发

图书馆在建

下面是一个操作代码示例,它通过更改设置侦听器的键就可以很好地满足我的需要:

kd.P.down(function () {
  console.log('The "P" key is being held down!');
});

kd.P.up(function () {
  console.clear();
});

// This update loop is the heartbeat of Keydrown
kd.run(function () {
  kd.tick();
});
我已经在客户端JavaScript中加入了Key溺水,以便在我正在编写的一个红灯绿灯游戏中实现适当的暂停动画。您可以查看整个游戏。(注意:如果您将来阅读此文章,游戏应该是代码完整且可玩的:-D!)


我希望这能有所帮助。

最后在这里检查浏览器中是否已经内置了一些东西,但似乎没有。这是我的解决方案(与Robert的答案非常相似):


然后,您可以检查是否使用键按下了键。
is\u key\u down('ArrowLeft')

我扫描了上面的答案,建议的
键按下
/
键向上
方法仅在特殊情况下有效。如果用户alt键移开,或使用按键手势打开新的浏览器窗口或选项卡,则会注册一个
向下键
,这很好,因为此时无法判断该键是web应用程序正在监视的内容,还是标准的浏览器或操作系统快捷方式。回到浏览器页面,它仍然会认为密钥被持有,尽管它是同时被释放的。或者,当用户用鼠标切换到另一个选项卡或应用程序时,只需按住某个键,然后将其释放到页面之外

国防部
"use strict";

const is_key_down = (() => {
    const state = {};

    window.addEventListener('keyup', (e) => state[e.key] = false);
    window.addEventListener('keydown', (e) => state[e.key] = true);

    return (key) => state.hasOwnProperty(key) && state[key] || false;
})();
window.onkeyup = up;
window.onkeydown = down;
function up(e) {
  if (e.key === 'F5') return; // if you want this to work also on reload with F5.

  window.onkeyup = null;
  window.onkeyup = null;
  if (e.key === 'Control') {
    alert('Control key was released. You must have held it down while opening the file, so we will now load the file into the editor.');
  }         
}
function down() {
  window.onkeyup = null;
  window.onkeyup = null;
}
if (KeyPressing.isKeyPressed(13)){ //Pass the keyCode integer as parameter
     console.log('The Enter key is being pressed!')
  }else{
     console.log('The Enter key is NOT being pressed!')
  }
setInterval(() => {
    if (KeyPressing.isKeyPressed(13)){
        console.log('The Enter key is being pressed!')
    }else{
        console.log('The Enter key is NOT being pressed!')
    }
  }, 1000) //Update data every 1000ms (1 second)