43

キープレスの混合を組み合わせて単一のイベントを発生させることはまったく可能ですか?

$(document).keyup(function(e){
    if (e.keyCode == 68 && e.keyCode == 69 && e.keyCode == 86) {
        alert('oh hai');
    }
});

Chrome で試してみましたが、イベントが発生しません。

私をクレイジーと呼んでいますが、私は Chrome 拡張機能を作成していて、D+ E+Vキーを一緒に押して非表示の開発者モードに強制したいと考えています。

4

12 に答える 12

77

de、およびvキーがすべて同時に押されたことを検出したい場合は、両方keydownを監視し、押されたキーkeyupのマップを保持する必要があります。それらがすべてダウンしたら、イベントを開始します。

例:ライブコピー| ソース

var map = {68: false, 69: false, 86: false};
$(document).keydown(function(e) {
    if (e.keyCode in map) {
        map[e.keyCode] = true;
        if (map[68] && map[69] && map[86]) {
            // FIRE EVENT
        }
    }
}).keyup(function(e) {
    if (e.keyCode in map) {
        map[e.keyCode] = false;
    }
});

ある時点で同時にすべてが押されている限り、それらがどの順序で押されているかは気にしないと思います(確実に押すのは面倒なので)。

于 2012-05-18T15:16:31.203 に答える
21

Vega に似ていますが、よりシンプルです

var down = {};
$(document).keydown(function(e) {
    down[e.keyCode] = true;
}).keyup(function(e) {
    if (down[68] && down[69] && down[86]) {
        alert('oh hai');
    }
    down[e.keyCode] = false;
});​
于 2012-05-18T15:18:48.847 に答える
9

おそらく、より単純なキーの組み合わせの方が簡単でしょうか?

Shift + Alt + Dのようなものはどうですか?(ほとんどのブラウザはすでにCtrl + Dを何らかの方法で解釈しているため、おそらくControlキーを使用しないでください)

このためのコードは次のようになります。

if(e.shiftKey && e.altKey && e.keyCode == 68)
{
  alert('l33t!');
}
于 2012-05-18T15:30:41.937 に答える
1

3つの主要なイベントを個別にキャプチャし、3番目のイベントの後でのみアクションを実行する必要があります。

var keys = {
        d: { code: 100, pressed: false, next: 'e' },
        e: { code: 101, pressed: false, next: 'v' },
        v: { code: 118, pressed: false, next: 'd' }
    },
    nextKey = 'd';

$(document).keypress(function(e) {
    if (e.keyCode === keys[nextKey].code) {
        keys[nextKey].pressed = true;
        nextKey = keys[nextKey].next;
    } else {
        keys.d.pressed = false;
        keys.e.pressed = false;
        keys.v.pressed = false;
        nextKey = 'd';
    }

    if (keys.d.pressed && keys.e.pressed && keys.v.pressed) {
        alert('Entering dev mode...');
    }
});​

もちろん、これを行うにはいくつかの方法があります。この例では、キーを同時に押し続ける必要はありません。キーを順番に入力するだけですd e v

これを使用した場合は、pressed一定の時間間隔の後にフラグをクリアするためにこれを拡張することをお勧めします。

これが実際のです。


免責事項:元の質問では、キーを「一緒に押す」必要があると言われていました。他の回答者がキーを一緒に押すための十分な解決策をすでに提供しているため、これは単なる代替手段です。

于 2012-05-18T15:14:42.010 に答える
1

もう少し現代的なソリューションでは、アロー関数残りのパラメーターを利用します。

const multipleKeypress = (function($document) {
  // Map of keys which are currently down.
  const keymap = {}
  // Update keymap on keydown and keyup events.
  $document.on(
    "keydown keyup"
    // If the key is down, assign true to the corresponding
    // propery of keymap, otherwise assign false.
   ,event => keymap[event.keyCode] = event.type === "keydown"
  )
  // The actual function.
  // Takes listener as the first argument,
  // rest of the arguments are key codes.
  return (listener, ...keys) =>
    $document.keydown(() => {
      // Check if every of the specified keys is down.
      if (keys.every(key => keymap[key]))
        listener(event)
    })
// Pass a jQuery document object to cache it.
}($(document)))

// Example usage:
multipleKeypress(() => console.log("pressed"), 68, 69, 86)

// Automatically focus the snippet result
window.focus()
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>Try pressing <kbd>d</kbd>, <kbd>e</kbd> and <kbd>v</kbd> at once.</p>

于 2016-02-07T04:09:05.300 に答える
0

複数のキーを「同時に」処理するには、keydown および keyup イベントを使用する必要があります。

input.on("keydown", function (e) {
                        if (e.which == 17) {
                            isCtrl = true; // Ctrl
                            return;
                        }

                        /* Ctrl and "c" */
                        if (isCtrl && e.which == 67) {
                            //some code 
                        }
                    }).keyup(function (e) {
                        if (e.which == 17) {
                            isCtrl = false; // no Ctrl
                        }
                    });
于 2012-05-18T15:15:16.613 に答える
0

このコードを使用して、複数回のキー押下によってイベントをトリガーし、ミスタイプを防ぐために 100 ミリ秒後にタイムアウトします。この例では、A、Z、E が 100 ミリ秒以内に押されると、イベントがトリガーされます。

var map = {65:false,90:false,69:false}; //Modify keyCodes here
$(document).keydown(function(e){
    console.log(e.keyCode);
    map[e.keyCode] = e.keyCode in map ? true : map[e.keyCode] || false;
    var result = Object.keys(map).filter(function(key){
        return map[key];
    }).length === Object.keys(map).length ? true : false;
    if(result){
        //Your event here
        Object.keys(map).forEach(function(key){
            map[key] = false;
        });
    }
    setTimeout(function(){
        map[e.keyCode] = false;
    },100);
});
于 2017-11-16T15:34:46.707 に答える
0

私がよく理解していれば:フィドルの例、http://jsfiddle.net/gAtTk/(あなたのjsコンソールを見てください)

このコードでは、「dev」という単語を入力できます (この例では、最後にイベントkeyupが削除されます) 。

(function(seq) {
    var tmp = seq.slice();
    $(document).on("keyup.entersequence", function(e){
        if (!(e.keyCode === tmp.pop())) {
           tmp = seq.slice();
        }
        else {
           console.log(e.keyCode);  
            if (!tmp.length) {
               console.log('end');
               $(document).off("keyup.entersequence");
            }
        }
    });
}([68,69,86].reverse()));
于 2012-05-18T15:15:00.183 に答える
-1

https://github.com/JesseBuesking/jquery.hotkeys.extended

これをチェックしてください。あなたはこれを探しているかもしれません。

複数のキーを押すと関数をトリガーできます。例: p+t+k

 $(document).hotkeys('p', 't', 'k', function (){
        //show blurbox
        $('#popup').blurbox({
            blur: 10, animateBlur: true, bgColor: 'rgba(255,255,0,0.2)'
        })bb.show();
    });

多分あなたはこれを探しています。

于 2014-10-23T11:29:36.077 に答える
-1

順序が気になり、キーを押したまま別のキーをタップする必要がある場合 (例: Shift + DEL、DEL、DEL...)、イベントを再度発生させるために最初のキーを持ち上げる必要はありません... @ParthThakkar の回答に対する @lu1s のコメントを拡張した @BlakePlumm の [fiddle] コメントを修正しました。

また、jQuery の .on() を使用すると、特定の要素でのみキー シーケンスをリッスンできます。「body」を「input.selector」などに変更します。

var map = [];
var down = [];
$(document).on('keydown','body', function(e) {
    if(!map[e.which]){
        down.push(e.which);
        if(down[0] === 68 && down[1] === 69 && down[2] === 86) {
            console.log('D + E + V');
        } else if(down[0] === 16 && down[1] === 46) {
            console.log('SHIFT + DEL');
        }
        /* more conditions here */
    }
    map[e.which] = true;
}).keyup(function(e) {
    map[e.which] = false;

    /* important for detecting repeat presses of
       last key while holding first key(s)
       (can be shortened. see fiddle) */
    var len = down.length;
    while (len--) {
        if(down[len] === e.which) down.splice(len,1); //removes only the keyup'd key
    }        
    $('.alert').html('');
});

追加の考え: 順序だけを気にする場合 - つまり、メインのイベント起動キーが最後に押されている限り (CTRL + SHIFT + TAB、TAB、TAB など)、最初のキーを押すだけで済みます。この条件を追加します。

else if(down.length>2) {
    if($.inArray(68,down)!=-1 && $.inArray(69,down)!=-1 && down[2] === 86) {
        $('.alert').html('A hacky D+E+V was pressed');
    }
}

より素晴らしいオプションとライブデモをいじる: - http://jsfiddle.net/kstarr/4ftL1p3k/

于 2014-10-12T18:14:31.883 に答える