当用户在Chrome上按键盘时如何检测`delete`和`.`?

时间:2011-07-17 15:38:12

标签: javascript jquery events keyboard

当我按.时,它会触发三个事件,keydownkeypresskeyup

keydown
  which: 190 == ¾
  keyCode: 190 == ¾

keypress
  which: 46 == .
  keyCode: 46 == .

keyup
  which: 190 == ¾
  keyCode: 190 == ¾

当我按delete时,它会触发两个事件,keydownkeyup

keydown
  which: 46 == .
  keyCode: 46 == .

keyup
  which: 46 == .
  keyCode: 46 == .

我想按.并能够获得相应的字符(46 == .)。但是在keydownkeyup上,我得到190 ¾。在keypress我得到正确的值,但是当我按delete时,不会触发此事件。

当我按delete时,我会在46keydown上获得代码keyup。但代码46.而不是delete

如果是.按下了delete键还是{{1}}键,我怎样才能制作一个事件来捕捉两个键并区分它们?

要测试的网页:http://jsfiddle.net/Eg9F3/

4 个答案:

答案 0 :(得分:2)

我认为最好的解决方案是映射您想要的键(demo),然后使用e.which来交叉引用按下的键。有good reference个跨浏览器keyCode值,在这种情况下有效,因为jQuery会对e.which值进行规范化。

var keys = {
  46  : 'del',
  190 : '.'
};

$("textarea").bind('keyup', function(e){
  $('#r').append( 'keyup (' + e.which + '): ' + (keys[e.which] || String.fromCharCode(e.which)) );
});

这类似于jQuery UI使用的方法 - 请参阅文件顶部的密钥代码交叉引用?它也是我在keycaster插件中使用的方法。

答案 1 :(得分:1)

事实上它很奇怪,但这是逻辑。

String.fromCharCode函数使用真实的char代码,而不是KB动作(左,删除...)

为什么不通过keyCode过滤?

答案 2 :(得分:1)

我强制使用与Firefox example on jsFiddle

相同的行为
$("textarea").keydown(function(e) {
    // if the key pressed was found on the list of specialChars
    if (specialChars[e.keyCode])
    {
        // triggers the fake event
        $("textarea").trigger("chromekeypress", e);

        // temporary avoid keypress from firing
        $("textarea").unbind("keypress");
        setTimeout(function(){ $("textarea").bind("keypress", handleKey); },10);
    }
});

$("textarea").keypress(handleKey); // main event

$("textarea").bind("chromekeypress", chromeKeyPress); // chrome workaround

function chromeKeyPress(i,e){
    e.type="chromekeypress";
    e.which = 0; // copy Firefox behavior, which == 0 means a special key pressed
    handleKey(e); // fires the main event
}
function handleKey(e) {

    // which is going to be 0 if it is a special key
    // and keycode will have the code of the special key
    // or
    // which will have the value of the key

    $("#r").html($("#r").html() + "\n" +
        e.type + "\n" +
        "  which: " + e.which + " == " + String.fromCharCode(e.which) + "\n" +
        "  keyCode: " + e.keyCode + " == " + String.fromCharCode(e.keyCode) + "\n" +
     "");
}

答案 3 :(得分:0)

“keypress”处理程序中“which”的值与“keydown”或“keyup”处理程序中“which”的含义不同。在那些中,它是键盘上键的键码,而不是一个字符序号。在“按键”中,它是角色,但你没有获得Del的“按键”(正如你所注意到的)。

因此,“keypress”处理程序(“。”)中的46与Del的“keydown”和“keyup”事件不同。

您可能应该使用“keydown”或“keyup”并检查密钥代码。