問題
如何監聽鍵盤複製,貼上與刪除?
實現
監聽複製貼上和刪除,相容windows和mac:
const onKeyDown = (e) => {
const { metaKey, ctrlKey, key } = e
const isCtrlOrCommand = ctrlKey || metaKey
if (isCtrlOrCommand && key.toLocaleLowerCase() === 'c') {
console.log('複製')
return
}
if (isCtrlOrCommand && key.toLocaleLowerCase() === 'v') {
console.log('貼上')
return
}
if (['Delete', 'Backspace'].includes(key)) {
console.log('刪除')
return
}
}
當滑鼠聚焦在其他元素上時,不觸發鍵盤事件:
const onKeyDown = (e) => {
const { tagName } = document.activeElement || {}
if (tagName && tagName.toLocaleUpperCase() !== 'BODY') {
return
}
const { metaKey, ctrlKey, key } = e
const isCtrlOrCommand = ctrlKey || metaKey
if (isCtrlOrCommand && key.toLocaleLowerCase() === 'c') {
console.log('複製')
return
}
if (isCtrlOrCommand && key.toLocaleLowerCase() === 'v') {
console.log('貼上')
return
}
if (['Delete', 'Backspace'].includes(key)) {
console.log('刪除')
return
}
}
鍵盤事件有哪些?
監聽鍵盤事件操作有三種:keydown, keypress, keyup。按下鍵盤觸發鍵盤事件順序為:keydown -> keypress ->keyup。
keydown
當使用者按下鍵盤上的任意鍵時觸發,會重複觸發此事件;
keypress
當使用者按下鍵盤上的字元鍵時觸發,會重複觸發此事件;
keyup
當使用者釋放鍵盤上的字元鍵時觸發此事件;
區別
- keypress: 只能捕捉單個字元,可以捕獲單個字元的大小寫,不區分小鍵盤和主鍵盤的數字字元,不能監聽功能鍵;
- keydown/keyup: 可以捕獲組合鍵,不能區分字母的大小寫, 區分小鍵盤和主鍵盤數字字元;
KeyboardEvent
KeyboardEvent
物件描述了使用者與鍵盤的互動。每個物件都描述了使用者與鍵盤(一個按鍵和修飾鍵的組合)的單個互動;
常用屬性
屬性名 | 型別 | 描述 |
---|---|---|
altKey | Boolean | 當 Windows 上 Alt 鍵 或 Mac 上 Option 或 ⌥ 鍵被按下,該值為 true |
metaKey | Boolean | 當 Mac 上 Command 鍵 或 Windows 上 ⊞ 鍵被按下,該值為 true |
ctrlKey | Boolean | 當 Ctrl 鍵被按下,該值為 true |
shiftKey | Boolean | 當 Shift 鍵被按下,該值為 true |
code | String | 標識按下的具體是哪個物理鍵,鍵盤上每一個按鍵都對應一個唯一的值。 |
key | String | 指明具體輸入的字元內容,如果是非列印字元(例如Enter鍵、Esc鍵、Shift鍵、Alt鍵等),則返回具體的非列印字元的英文名稱,如果輸入內容與輸入法有關則返回固定的 Process 名稱。 |
keyCode | Number | 【過時屬性,不推薦使用】此值是跟著鍵盤走,而不是字元內容。相同按鍵可能有不同keyCode,相同字元可能有不同keyCode。 |
mac 按 command 鍵的 KeyboardEvent為:
mac 按 f 鍵的 KeyboardEvent為: