0

我试图让Alt键将快捷方式设置为Shift+Alt+AorCtrl+Alt+A但是当按下`ShiftorCtrl键时我无法确定是否按下了Alt键。以下代码使问题更加清晰。

    el.onkeydown=function(e){
    //alert(e.keyCode);

    if(e.shiftKey==true){
    document.body.appendChild(document.createTextNode("shiftkey"));
    document.body.appendChild(document.createElement("br"));
    }
    else if(e.ctrlKey==true){
    document.body.appendChild(document.createTextNode("ctrlkey"));
    document.body.appendChild(document.createElement("br"));
    }
    else if(e.altKey==true){
    document.body.appendChild(document.createTextNode("altkey"));
    document.body.appendChild(document.createElement("br"));
    }
    };

当我尝试在or键Alt之后按下一个键时,没有得到 true 的值,我得到的结果为ShiftCtrle.altKey

    shiftkey
    shiftkey
    shiftkey
    shiftkey
    shiftkey
    shiftkey...

或为Ctrl

    ctrlkey
    ctrlkey
    ctrlkey
    ctrlkey
    ctrlkey
    ctrlkey
    ctrlkey...
4

1 回答 1

4

设计缺陷。您正在检查是否shiftKey被按下。如果不是,那么您检查其他人。让我们一步一步地考虑它。

你先按shift键。事件触发,并且您的第一个条件得到满足。现在,当您按下 alt 键时,您的keydown事件将再次被调用,而这一次,由于您同时按住shiftand alt,因此满足了第一个和第三个条件。但是,程序永远不会到达第三个条件,因为它在 else 子句中。这意味着只评估您的第一个条件的代码,并跳过其余条件,因为第一个条件为真。

更改您的设计以单独检查所有键,而不是else每个键。

您的代码如下所示:

el.onkeydown=function(e){
//alert(e.keyCode);

if(e.shiftKey==true){
document.body.appendChild(document.createTextNode("shiftkey"));
document.body.appendChild(document.createElement("br"));
}
if(e.ctrlKey==true){
document.body.appendChild(document.createTextNode("ctrlkey"));
document.body.appendChild(document.createElement("br"));
}
if(e.altKey==true){
document.body.appendChild(document.createTextNode("altkey"));
document.body.appendChild(document.createElement("br"));
}
};

想想这个例子,让你的缺陷更清楚:

if(true){
    console.log('First');
}
else if(true){
    console.log('Second');
}

可以看到,第二个条件是否为真并不重要,只要第一个条件成立即可。

但是,在您的情况下,使用&&逻辑运算符会更有意义,因为您只想在按住所有三个键以创建快捷方式时执行某些操作。那会让你的代码像这样:

if(e.shiftKey && e.altKey && e.keyCode === 65){
    console.log('Shortcut active');
}
于 2013-05-19T15:43:43.277 回答