1

我正在通过 javascript 设计键盘界面,并且我想定义击键组合,例如 shift+rightkey 或 ctrl+tab。但是在修改了 javascript 之后,如这里所见,我注意到所有的键事件都在中断。在提供的示例中,如果您在按住右键的同时按 shift 键,则右键的功能会中断!

v = 1; /*v is the variable of velocity.*/

window.addEventListener("keydown", function(event)
{
    if(event.keyCode == 39) /*39 is the keycode of rightarrowkey.*/
    {
        //moves an element by the velocity.
        var keystroke = document.getElementById("keystroke");
        keystroke.style.left = parseInt(keystroke.style.left.slice(0,-2))+v+"px";
    }
    if(event.keyCode == 16) /*16 is the keycode of shift.*/
    {
         //increases the velocity of the element by four.
        document.getElementById("keystroke").style.borderColor = "red";
        v = 4;
    }
}, false); //but hitting the shiftkey while hitting the rightkey interrupts..!

我还尝试通过一个对象记录所有击键,然后以指定的时间间隔对定义的击键进行迭代,如此处所示。但是这个处理键盘的系统并没有保留单独的击键;如果我击键太快,可能不会考虑,或者如果我按住键太久,可能会过度考虑!

4

1 回答 1

0

经过一番思考,我可能想出了一种方法,既可以保留每个击键,又可以处理中断的键事件。我的代码有些古怪,但它可以很好地管理用户的击键。

正如我之前在问题中所建议的那样,在不中断的情况下处理每次击键的解决方案是通过在对象中注册每个键事件。代码不断地遍历这个对象来处理任何新的键事件。

但是为了确保每个击键至少被保存和处理一次,必须为每个键事件注册一个键绑定。我扩展了对象的脚本以注册击键和键绑定。

var kbdin =
{
    stroked: new Object(),
    upbinded: new Object(),
    downbinded: new Object(),

    downbindKeystroke: function(keycode, functionality) {this.downbinded[keycode] = functionality;},
    upbindKeystroke: function(keycode, functionality) {this.upbinded[keycode] = functionality;},
    isDownbinded: function(keycode) {return this.downbinded[keycode];},
    isUpbinded: function(keycode) {return this.upbinded[keycode];},
    isStroked: function(keycode) {return this.stroked[keycode];},

    onDownstroke: function(event)
    {
        var keycode = event.keyCode;
        if(!this.isStroked(keycode))
        {
            this.stroked[keycode] = 1;
            if(this.isDownbinded(keycode))
            {this.downbinded[keycode]();}
        }
        if(this.isDownbinded(keycode))
        {event.preventDefault();}
    },

    onUpstroke: function(event)
    {
        var keycode = event.keyCode;
        delete this.stroked[keycode];
        if(this.isUpbinded(keycode))
        {
            this.upbinded[keycode]();
            event.preventDefault();
        }
    },

    handleKeystrokes: function()
    {
        for(var keycode in this.downbinded)
        {
            if(this.isStroked(keycode) > 5)
            {this.downbinded[keycode]();}
        }

        for(var keycode in this.stroked)
        {this.stroked[keycode]++;}
    }
};

document.addEventListener("keyup", function(event) {kbdin.onUpstroke(event);}, false);
document.addEventListener("keydown", function(event) {kbdin.onDownstroke(event);}, false);
window.setInterval(function() {kbdin.handleKeystrokes();}, 50);

现在,击键和键绑定都耦合在一起,支持每个键事件的功能,既可以发出击键信号,也可以执行键绑定。这可能有点古怪,但是这段代码处理了不间断的按键事件,同时仍然保留了单个按键!

于 2013-03-30T17:38:11.697 回答