簡體   English   中英

"檢測組合按鍵(Control、Alt、Shift)?"

[英]Detecting combination keypresses (Control, Alt, Shift)?

我試圖在按下 Ctrl<\/kbd> + Alt<\/kbd> + e<\/kbd>時運行腳本。
Tampermonkey 如何同時使用 ctrl、alt 和 e 鍵觸發?

我試過ctrlKey<\/code>和altKey<\/code> 。 我沒有發現任何有用的東西。
如何編輯下面的腳本以在Ctrl<\/kbd> + Alt<\/kbd> + e<\/kbd>上觸發,而不僅僅是e<\/kbd> ?

有關鍵盤事件,請參閱 W3C 規范 提供了幾個布爾屬性來確定修改鍵是否與您感興趣的任何目標鍵一起按下。它們是:

  • ctrlKey “控制”鍵也被按下。
  • shiftKey -- "Shift" 鍵也被按下。
  • altKey ——“Alt”鍵也被按下。
  • metaKey ——“Meta”鍵也被按下。

其他重要說明

  1. 不推薦使用which屬性
  2. 使用keydown因為Chrome 不會觸發已知鍵盤快捷鍵的keypress事件。
  3. 一些規范的屬性,例如key在 Firefox 中只是部分功能
  4. 您不需要將代碼包裝在像 Tampermonkey(或 Greasemonkey 或大多數用戶腳本引擎)那樣的匿名函數中。 范圍保護是自動提供的。

因此,您的代碼將變為:

document.addEventListener ("keydown", function (zEvent) {
    if (zEvent.ctrlKey  &&  zEvent.altKey  &&  zEvent.key === "e") {  // case sensitive
        // DO YOUR STUFF HERE
    }
} );

運行這個方便的演示(現在更新, key是完全支持)

 var targArea = document.getElementById ("keyPrssInp"); targArea.addEventListener ('keydown', reportKeyEvent); function reportKeyEvent (zEvent) { var keyStr = ["Control", "Shift", "Alt", "Meta"].includes(zEvent.key) ? "" : zEvent.key + " "; var reportStr = "The " + ( zEvent.ctrlKey ? "Control " : "" ) + ( zEvent.shiftKey ? "Shift " : "" ) + ( zEvent.altKey ? "Alt " : "" ) + ( zEvent.metaKey ? "Meta " : "" ) + keyStr + "key was pressed." ; $("#statusReport").text (reportStr); //--- Was a Ctrl-Alt-E combo pressed? if (zEvent.ctrlKey && zEvent.altKey && zEvent.key === "e") { // case sensitive this.hitCnt = ( this.hitCnt || 0 ) + 1; $("#statusReport").after ( '<p>Bingo! cnt: ' + this.hitCnt + '</p>' ); } zEvent.stopPropagation (); zEvent.preventDefault () }
 <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script> <p><label>Press keys in here:<input type="text" value="" id="keyPrssInp"></label> </p> <p id="statusReport"></p>

keypress事件在按鍵被按下后立即觸發。 如果您按下多個鍵,每次按下都會觸發事件,因此它們被視為獨立的按鍵。

相反,您可以同時使用keydownkeyup事件來檢測多個按鍵。 您可以擁有一個包含 3 個鍵和一個布爾狀態的對象。 keydown事件中,如果當前鍵與對象中的鍵匹配,則將該鍵的狀態設置為true keyup事件中,您將當前鍵的狀態重置為false 如果在最后一次按鍵時所有 3 個狀態都為true ,則觸發該事件。

請參閱使用 jQuery 實現此邏輯的示例

更新Brock 的答案對於您將修飾鍵與單個鍵代碼目標結合使用是一個更好的解決方案,因為ctrlKeyaltKey修飾符是組合檢測的,而不是獨立處理的。 例如,如果您想同時檢測多個鍵代碼,例如EF ,您需要按照上面的方法使用keydownkeyup來跟蹤它們。

如果您像我一樣來到這里了解如何檢測“Alt Gr”鍵與字母鍵的組合,那么例如 event.altKey 之類的屬性不能用於此,因為沒有 event.AltGrKey財產。

在這種情況下,您可以使用

event.getModifierState('AltGraph')

有關更多詳細信息,請參閱https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/getModifierState

我正在使用hotkeys-js<\/a>來抽象功能,但仍然必須讓用戶選擇自己的自定義快捷方式(事先不知道)。 然后我嘗試了@Brock Adams 的答案,以獲得輸入框中按下的快捷鍵的等效格式的 hotkeys-js。

我在實驗時發現的東西(在 Chrome 92 上的意大利 QWERTY 鍵盤布局上):

速記。 如果您檢測到班次,那么您需要將要檢查的任何字母大寫。 Shift 將通常的小寫字母大寫。

對比

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM