同时按键(Keys pressed at the same time)

2019-07-30 08:55发布

我可以知道在Javascript同时按下按键的数量?

如果是这样,我怎么能有自己的数组keyCode

Answer 1:

你可以听的keydown和KeyUp事件。

var keys = { length: 0 };

document.onkeydown = function(e){
    if(!keys[e.keyCode])   {
        keys[e.keyCode] = true;
        keys.length++;
    }
}

document.onkeyup = function(e){
    if(keys[e.keyCode])   {
        keys[e.keyCode] = false;
        keys.length--;
    }
}

然后,所有的关键是true是当前压制的人。

小提琴演示感谢@Esailija: http://jsfiddle.net/maniator/Gc54D/



Answer 2:

这应该做的伎俩。 它类似于尼尔的,但应该解决的几个问题,包括留下最窗口的错误和负号-的密钥的错误。 我还精简消息编写代码位。 我取代计时器循环用于与点播系统写入密钥的消息的数目,增加了一个安全机构递减长度指标,并且增加了当clearKeys用户离开窗口切换所有键起来。 该代码仍然有两个缺陷:它不会认识到一个新的窗口已经被打开和关闭后仍按住键(它们必须被释放并重新推),我不能让它认识到更多的则六个键(我怀疑这是不是与此有关的代码,但计算机/浏览器...)。

var keys = {
    length: 0
};

window.onkeydown = function(e) {
    if (!keys[e.keyCode]) {
        keys[e.keyCode] = true;
        keys.length++;
        document.body.innerHTML = "You are pressing " + keys.length + " keys at the same time.";
    }
}

window.onkeyup = function(e) {
    if (keys[e.keyCode]) {
        keys[e.keyCode] = false;
        if (keys.length) {
            keys.length--;
        }
        document.body.innerHTML = "You are pressing " + keys.length + " keys at the same time.";
    }
}

function clearKeys() {
    for (n in keys) {
        n = false
    };
    keys.length = 0;
    document.body.innerHTML = "You are pressing " + 0 + " keys at the same time.";
}

document.body.innerHTML = "You are pressing 0 keys at the same time.";
window.onblur = clearKeys;


Answer 3:

既然你想在同一时间按下按键的数量和他们的关键代码数组,我建议您使用以下功能:

var getKeys = function () {
    var keys = [];

    window.addEventListener("blur", blur, false);
    window.addEventListener("keyup", keyup, false);
    window.addEventListener("keydown", keydown, false);

    return function () {
        return keys.slice(0);
    };

    function blur() {
        keys.length = 0;
    }

    function keyup(event) {
        var index = keys.indexOf(event.keyCode);
        if (index >= 0) keys.splice(index, 1);
    }

    function keydown(event) {
        var keyCode = event.keyCode;
        if (keys.indexOf(keyCode) < 0)
        keys.push(keyCode);
    }
}();

当你调用getKeys它会返回在同一时间按下的所有键的数组。 您可以使用length数组的属性来找到在同一时间按下按键的数量。 由于它使用addEventListener它与页面上的其他代码协同工作为好。

我测试上述功能和它总是返回时切换到另一个窗口同时按住的键(它删除该数组该密钥)正确的键按压甚至。 如果你持有的关键,切换回则其识别出一个键被按下,并在推到阵列上。 因此,我可以作证,有在上面的代码中没有错误。 至少不会在浏览器我测试(歌剧12.00)。

我能够按在同一时间8个键( ASDFJKL; )。 这个数字似乎OS具体,我只能按4个左手键和4个右手键在同一时间。 例如后,我按ASDF ,然后我按下另一个左手(假设G ),那么它不会承认的最后一个键。 这可能是因为OS知道人类如何键入,所以它仅允许4个中断每个左手和右手键。 我使用的操作系统是Ubuntu的12.04。

你可以看到这个动作的代码小提琴 。 我用了一个三角洲定时器 ,而不是setInterval显示每50毫秒后的结果。 您也不妨读一读下面的回答也是如此。



文章来源: Keys pressed at the same time