繁体   English   中英

当用户在 Chrome 上按下键盘时,如何检测“删除”和“。”?

[英]How to detect `delete` and `.` when user press the keyboard on Chrome?

当我按下. 它触发三个事件, 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时,我在keydownkeyup上得到代码46 但是代码46. 而不是delete

如果是. 按下或delete键?

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

我认为最好的解决方案是 map 您想要的键(演示),然后使用e.which交叉引用按下的键。 有一个很好的跨浏览器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插件中使用的方法。

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

function String.fromCharCode 使用真正的字符代码,而不是 KB 操作(左,删除...)

为什么不简单地按 keyCode 过滤?

我已经强制执行与 Firefox 相同的行为,例如 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" +
     "");
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM