JavaScriptでCtrl + Zキーの組み合わせをキャプチャする


86

私はこのコードでJavaScriptでctrl+zキーの組み合わせをキャプチャしようとしています:

<html>
<head>
    <title>Untitled Document</title>
</head>
<body>

    <script type='text/javascript'>
        function KeyPress(e) {
            var evtobj = window.event? event : e


            //test1 if (evtobj.ctrlKey) alert("Ctrl");
            //test2 if (evtobj.keyCode == 122) alert("z");
            //test 1 & 2
            if (evtobj.keyCode == 122 && evtobj.ctrlKey) alert("Ctrl+z");
        }

        document.onkeypress = KeyPress;
    </script>

</body>
</html>

コメント行「test1」は、ctrlキーを押したまま他のキーを押すとアラートを生成します。

コメント行「test2」は、zキーを押すとアラートを生成します。

「テスト1&2」の後の行に従ってそれらをまとめ、ctrlキーを押したままzキーを押しても、期待どおりにアラートが生成されません。

コードの何が問題になっていますか?

回答:


95
  1. 使用onkeydown(またはonkeyup)ではなくonkeypress
  2. keyCode122ではなく90を使用

オンラインデモ:http//jsfiddle.net/29sVC/

明確にするために、キーコードは文字コードと同じではありません。

文字コードはテキスト用です(エンコーディングによって異なりますが、多くの場合、0-127はASCIIコードのままです)。キーコードは、キーボードのキーにマップされます。たとえば、Unicode文字では0x22909は好を意味します。実際にこのための鍵を持っているキーボードは(もしあれば)多くはありません。

OSは、ユーザーが構成した入力方法を使用して、キーストロークを文字コードに変換します。結果はkeypressイベントに送信されます。(一方、キーダウンとキーアップは、テキストを入力するのではなく、ユーザーがボタンを押すことに応答します。)


1
ありがとう、それはうまくいきます。onkeypressとkeyCode122が機能しないのはなぜですか?
Paul Johnston

ソリューションでアラートの代わりにDefault()を防ぐ方法を教えてください。Ctrl + tをテストしています。
Surendra Jnawali 2013

@SJnawali:それが可能かどうかはわかりませんctrl+t
zerkms 2013

4
keyCode 122が機能しないのはなぜですか?よく、122のためであるF11の:)キー
赤ちゃん

7
@PaulJohnstonキーコードは文字コードと同じではないためです。文字コードはテキスト用です(エンコーディングによって異なりますが、多くの場合、0-127はASCIIコードのままです)。キーコードは、キーボードのキーにマップされます。たとえば、Unicode文字では0x22909は好を意味します。実際にこれの鍵を持っているキーボードは(もしあれば)多くはありません。OSは、ユーザーが構成した入力方法を使用して、キーストロークを文字コードに変換します。結果はkeypressイベントに送信されます。(一方keydownkeyupテキストを入力するのではなく、ボタンを押すユーザーに応答します。)
Aidiakapi 2014年

32

この質問に出くわした将来の人々のために、これが仕事を成し遂げるためのより良い方法です:

document.addEventListener('keydown', function(event) {
  if (event.ctrlKey && event.key === 'z') {
    alert('Undo!');
  }
});

を使用event.keyすると、コードが大幅に簡素化され、ハードコードされた定数が削除されます。IE9以降をサポートしています。

さらに、を使用document.addEventListenerすると、他のリスナーが同じイベントに参加することはありません。

最後に、を使用する理由はありませんwindow.event。積極的に推奨されておらず、コードが壊れやすくなる可能性があります。


さらに、KeyboardEvent.keyCode数年前から非推奨になっていることを付け加えておきます。すべてのブラウザをキャプチャする最良の方法は、e.key最初にチェックしてからにフォールバックすることe.keyCodeです。または、このポリフィルを使用できます
はいバリー

9

Ctrl+tも可能です... 84のようにキーコードを使用するだけです

if (evtobj.ctrlKey && evtobj.keyCode == 84) 
 alert("Ctrl+t");

6
$(document).keydown(function(e){
  if( e.which === 89 && e.ctrlKey ){
     alert('control + y'); 
  }
  else if( e.which === 90 && e.ctrlKey ){
     alert('control + z'); 
  }          
});

デモ


3

90がZ鍵であり、これにより必要なキャプチャが実行されます...

function KeyPress(e){
     // Ensure event is not null
     e = e || window.event;

     if ((e.which == 90 || e.keyCode == 90) && e.ctrlKey) {
         // Ctrl + Z
         // Do Something
     }
}

要件によっては、e.preventDefault();ifステートメント内にinを追加して、カスタム機能を排他的に実行することもできます。


0
document.onkeydown = function (e) {
    var special = e.ctrlKey || e.shiftKey;
    var key = e.charCode || e.keyCode;
  console.log(key.length);
  if (special && key == 38 || special && key == 40 ) { 
    // enter key do nothing
    e.preventDefault();
  }        
}

これは、Shift +またはCtrl +キーの組み合わせの2つのキーをブロックする方法です。

&&は、キーの組み合わせを支援します。組み合わせがない場合は、すべてのCtrlキーまたはShiftキーをブロックします。


-3

私が作ったこのプラグインは役に立つかもしれません。

プラグイン

このプラグインを使用して、このように実行するためのキーコードと関数を提供する必要があります

simulatorControl([17,90], function(){console.log('You have pressed Ctrl+Z');});

コードでは、Ctrl+の実行方法を示しましたZ。リンクに詳細なドキュメントがあります。プラグインは、Codepenの私のペンのJavaScriptコードセクションにあります。


-5

CTRL+にはこのコードを使用しますZ。キーZプレスでのキーコードは122で、CTRL+Zは26です。コンソール領域でこのキーコードを確認してください

 $(document).on("keypress", function(e) {
       console.log(e.keyCode);
       /*ctrl+z*/
       if(e.keyCode==26)
       {
          //your code here
       }
    });
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.