簡體   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