1. 程式人生 > 實用技巧 >鍵盤事件keydown、keypress、keyup

鍵盤事件keydown、keypress、keyup

一、觸發條件

當某個物件有焦點且有監聽keydown、keypress、keyup事件時,通過按下鬆開鍵盤的某個鍵來觸發

二、區分

1、觸發區分

  • keydown是按下鍵盤的任何鍵觸發
  • keypress是按下鍵盤的鍵,且能翻譯為ASCII字元才會觸發
  • keyup則是按下鍵盤的鍵,在鬆開時觸發

keydown在按下的時候返回鍵盤上的程式碼值,然後由TranslateMessage函式翻譯成字元,並且由keypress返回字元值。

所以也可以理解為,keydown獲取鍵盤的程式碼值,而keypress獲取鍵盤的字元值(ASCII字元),keydown和keyup更加高階,處理更加複雜一些。

【按下鍵盤的鍵不鬆開,則會一直觸發keydown和keypess(如果keypress能觸發)】

【按下shift + 1,再同時鬆開,keydown和keyup觸發兩次,中間keypress觸發一次,keypress返回的key為!,而keydown和keyup返回的key分別是shift和!】

2、觸發順序

keydown、keypress、keyup

3、屬性區分

1)keycode

keypress事件的keycode屬性返回的是字元程式碼,即ASCII字元對應的值

keydown、keyup事件的keycode屬性返回的是鍵盤程式碼,即鍵盤上真實按鍵對應的數字

eg.

比如按下鍵盤的字母A

keypress的keycode為97

keydown、keyup的keycode為65

2)charcode

表示的是keypres觸發按鍵的字元程式碼,僅適用ASCII字元

按下非字元鍵,以及keydown和keyup返回的charcode,值是0

3)which

和keycode一樣,只是不相容IE8以下瀏覽器

相容性寫法:keycode = event.which || event.keycode

三、不同瀏覽器相容性

IE:只有keycode,【高版本IE有which,但IE8以下沒有which】

Firfox:只有charcode和which

Opera:只有keycode和which

Chrome:keycode、charcode、which都有

四、使用例子

輸入框輸入限制只有空格和數字

const oInput = document.getElementById("input");
    // 鍵盤輸入限制【空格和數字】
    oInput.addEventListener("keypress", e => {
      e = e || window.event;
      const target = e.target || e.srcElement;
      const key = e.keycode || e.which || e.charcode;
      if (key != 32 && (key < 48 || key > 57)) {
        e.preventDefault();
      }
    });
    // 儲存原始value,用於恢復
    let currentValue = oInput.value || "";
    oInput.addEventListener("input", e => {
      e = e || window.event;
      const target = e.target || e.srcElement;
      if ( /^[0-9]*$/.test(target.value)) {
        currentValue = target.value;
      } else {
        target.value = currentValue;
        target.setSelectionRange(selection.selectionStart, selection.selectionEnd);
      } 
    });
    // 更新儲存游標位置
    let selection = {};
    oInput.addEventListener("keydown", e => {
      e = e || window.event;
      const target = e.target || e.srcElement;
      selection = {
        selectionStart: target.selectionStart,
        selectionEnd: target.selectionEnd
      }
    });

參考

https://search.chongbuluo.com/

https://www.cnblogs.com/xcsn/p/3413074.html

https://mp.weixin.qq.com/s/p3fO8mt87ngalH11kk6WOg

-----smile