3 回答

TA貢獻1806條經驗 獲得超8個贊
使用用戶必須按下才能執行此操作的鍵號創建一個對象:
const KeysEnum = {
"ENTER": 16,
"SHIFT": 13,
}
let keysPressed = {
};
const handleEventShiftAndEnterPress = () => {
console.log ('User Press Shift Enter');
}
window.document.addEventListener ('keydown', function (event) {
keysPressed[event.keyCode.toString()] = true;
if (keysPressed [KeysEnum.SHIFT] && keysPressed [KeysEnum.ENTER]) {
handleEventShiftAndEnterPress ();
keysPressed [KeysEnum.SHIFT] = false;
keysPressed [KeysEnum.ENTER] = false;
}
});
只要你控制擊鍵對象,你就可以隨時做和知道每個鍵的狀態,所以很容易做你需要的:)

TA貢獻2037條經驗 獲得超6個贊
你可以e.getModifierState("NumLock") status根據它是 ON 還是 OFF來確定你的條件,因為當它打開時你e.shiftKey是false,如果它關閉你e.shiftKey是true
按Num lock測試
var el = document.getElementById("myInput");
el.addEventListener("keyup", function(e) {
console.log(e.getModifierState("NumLock"))
});
<input type="text" id="myInput" />

TA貢獻1810條經驗 獲得超4個贊
不幸的是,這似乎是 Windows 操作系統的一種限制,我不知道為什么存在這種限制。我在 StackOverflow 上看到過開發人員在其他上下文中遇到同樣問題的例子。
現在,這里有一個似乎有效的解決方案。我不喜歡它,我認為我不應該這樣做,但這是我能找到的最好的東西。
我發現當 NumLock 開啟時,如果我按住 [Shift] 并按下 [Num5],則會在 [Num5] 的 keydown 事件之前立即觸發來自 [Shift] 的 keyup 事件。在我的工作站上,如果我獲取這兩個事件的時間戳,它們將是 5 毫秒或更短的部分。我只是編寫了代碼來檢查這兩個時間戳,如果它們相距 10 毫秒或更短,我的應用程序就會響應輸入,考慮到用戶按住 [Shift] 并按下 [Num5]。
由于此代碼在瀏覽器中運行,我認為其他平臺不會有此限制,它仍然會檢查事件以指示 [Shift] 被按下。
添加回答
舉報