比較 keydown, keypress, keyup 的差異

Tommy
3 min readOct 6, 2016

在網頁的鍵盤事件操作有三種 keydown, keypress, keyup,針對這三者之間的差異,以下就做個簡單的分享與介紹:

  1. keydown
    所謂的keydown就是指按下鍵盤的那個剎那,任何的鍵盤按鍵按下都可以取得對應的鍵盤代碼,也就是所謂的keyCode。例如:a -> 65、b -> 66、 c -> 67……依此類推,但不區分大小寫。也就是說大寫和小寫是一樣的keyCode。其中也包括Enter -> 13、ESC -> 27、方向鍵 -> 37~40、倒退鍵 -> 8 ......等等。此外當按下鍵盤不放時,則會不斷地連續觸發該事件。
  2. keypress
    與keydown不同在於,keypress只會針對可以輸出文字符號的按鍵有效,也就是說ESC、方向鍵、倒退鍵......等等。這類沒有辦法輸出文字的鍵無法觸發該事件。此外也會因為大小寫的不同取得不同的keyCode,舉例來說:a -> 97、A -> 65、b -> 98、B -> 66......依此類推。也和keydown一樣當按下鍵盤不放時,則會不斷地連續觸發該事件。
  3. keyup
    而keyup是指放開鍵盤的那個剎那,觸發該事件。因為每次只會放開鍵盤一次,所以不會有連續觸發的狀況發生。取得keyCode的部分基本上跟keydown是一樣的。不過若是想要取得input的value,也只有在keyup的事件上可以拿到目前最新的value。

這三者事件的觸發優先順序為:keydown→keypress→keyup

另外關於組合鍵的部分,可以使用keydown事件來偵測,因為上述有提到keypress基本上只針對可以輸出文字符號按鍵有效。而keyup則是鍵盤放開才會觸發,因此只有在keydown事件時來偵測按下的組合鍵。

組合鍵的 KeyboardEvent(後面用e表示)中有提供對應的按鍵屬性,例如Alt為e.altKey、Ctrl為e.ctrlKey、Shift為e.shiftKey……等等。若被按下則會回傳true,沒有被按下則會回傳false。搭配e.key可以取得對應按鍵的值(key value),就可以做到類似:Ctrl + C 或 Ctrl +V 這類的組合鍵操作了。

測試網址:
http://output.jsbin.com/deqosodadi

參考資料:
http://webcache.googleusercontent.com/search?q=cache:oqJLk6C9yhcJ:fanli7.net/a/bianchengyuyan/C__/20130816/412082.html+&cd=4&hl=zh-TW&ct=clnk&gl=tw

--

--