检查钥匙是否关闭?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了检查钥匙是否关闭?相关的知识,希望对你有一定的参考价值。

有没有办法检测javascript当前是否存在关键字?

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

P. S.最大的问题似乎是,经过一段时间后,密钥开始重复,启动keydown和keyup事件,如恶魔。希望只有一个简单的isKeyDown(key)函数,但如果没有,则需要克服/解决这个问题。

答案

有没有办法检测JavaScript当前是否存在关键字?

不。唯一的可能性是监测每个keyupkeydown并记住。

一段时间后,密钥开始重复,启动keydown和keyup事件,如恶魔。

它不应该。你肯定会得到keypress重复,并在许多浏览器中你也会重复keydown,但如果keyup重复,这是一个错误。

不幸的是,它不是一个完全闻所未闻的错误:在Linux,Chromium和Firefox上(当它在GTK +下运行时,它在流行的发行版中,如Ubuntu)都会为持有的密钥生成重复的keyup-keypress-keydown序列,这是不可能区别于真正快速锤击钥匙的人。

另一答案

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

图书馆是Keydrown

这是通过更改设置监听器的键来完成我的目的的操作代码示例:

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();
});

我已经将Keydrown整合到我的客户端JavaScript中,以便在我正在编写的红灯绿灯游戏中获得适当的暂停动画。您可以查看整个游戏here。 (注意:如果您将来阅读此内容,游戏应该是代码完整且可玩的:-D!)

我希望这有帮助。

另一答案

我扫描了上述答案,建议的keydown / keyup方法仅在特殊情况下才有效。如果用户使用alt-tabs,或使用键手势打开新的浏览器窗口或选项卡,那么将注册keydown,这很好,因为此时无法判断该键是否是Web应用程序的内容监控,或者是标准的浏览器或操作系统快捷方式。回到浏览器页面,它仍然认为密钥被保留,虽然它在此期间被释放。或者只是保持一些键,同时用户使用鼠标切换到另一个选项卡或应用程序,然后在我们的页面外部发布。

可以通过Shift等监视修改键(mousemove等),假设在回退时预期存在至少一个鼠标交互,这种情况经常发生。

对于大多数所有其他键(除了修饰符,TabDelete,但包括SpaceEnter),监视keypress将适用于大多数应用程序 - 按下的键将继续触发。由于keypress射击的周期性,重置密钥有一些延迟。基本上,如果keypress不继续射击,那么可以排除大部分键。虽然我没有探讨如何处理TabBackspace,但这与修饰符相结合是非常不透明的。

我确信那里有一些库可以抽象出这个DOM的弱点,或者也许是一些DOM标准的变化可以解决它,因为这是一个相当古老的问题。

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

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

另一答案

除了使用keyupkeydown监听器来跟踪键何时关闭和备份,实际上还有一些属性可以告诉您某些键是否已关闭。

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*/}
}

这在所有浏览器生成的事件对象上都可用,例如来自keydownkeyupkeypress的事件对象,因此您不必使用mousemove。

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

我在Mac上使用Chrome 17

另一答案

我的解决方案

var keys = {};
window.onkeyup = function(e) { keys[e.keyCode] = false; }
window.onkeydown = function(e) { keys[e.keyCode] = true; }

我现在可以检查是否在脚本中的任何其他位置按下了任何键

keys["code of the key"]

如果是,则按下该键。

另一答案

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

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

然后编写一个函数来检查某个键是否关闭并返回一个bool。

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];
}

那应该完成你想要的。

另一答案

其他人之前已经问过这样的问题(虽然我现在没有看到任何明显的欺骗)。

我认为答案是keydown事件(以及它的双胞胎keyup)都是你获得的信息。重复操作非常牢固地连接到操作系统,并且应用程序没有太多机会向Bios查询密钥的实际状态。

如果你需要让它工作,你可以做什么,也许还有,就是以编程方式去除反弹键。基本上,你可以自己评估keydownkeyup但忽略一个keyupevent如果它在最后一个keydown之后发生得太快......或者基本上,你应该延迟你对keyup的反应足够长以确保没有其他keydown事件跟随类似的东西0.25秒的keyup

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

另一答案
/*
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');
}

当用户持续按住Alt键一段时间(约2秒)时,会出现一组标签(class ='key hidden')。释放Alt键时,标签消失。使用jQuery和Bootstrap。

另一答案

结束此处以检查浏览器是否已内置了某些内容,但似乎没有。这是我的解决方案(非常类似于Robert的答案):

"use strict";

let is_key_down = (() => {
    let 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;
})();

然后,您可以使用is_key_down('ArrowLeft')检查是否按下了某个键。

另一答案

看看this的答案,并使用onkeyuponkeydownHere是关于这些事件的更具体的信息。

以上是关于检查钥匙是否关闭?的主要内容,如果未能解决你的问题,请参考以下文章

分享前端开发常用代码片段

收藏|分享前端开发常用代码片段

关于js----------------分享前端开发常用代码片段

有没有看起来像“钥匙”图标的 Unicode 字形? [关闭]

如何检查用户名和密码是不是已保存在钥匙串中

JavaScript单行代码,也就是代码片段