Вопрос по jquery, javascript, keypress, jquery-events – Обнаружение нескольких клавиш в одном событии нажатия клавиши в jQuery

42

Можно ли вообще комбинировать смесь нажатий клавиш? запустить одно событие?

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

Я пробовал это в Chrome, но событие не сработало.

Назовите меня сумасшедшим, но я пишу расширение для Chrome и хочу нажатьD+E+V ключи вместе, чтобы заставить его в скрытый режим разработчика.

Код ключа может представлять только один ключ. Попробуйте использовать комбинацию keydown + keyup + flags, чтобы обнаружить это. yent
Рассмотрите возможность изменения принятого ответа наthis, Он представляет более современный и общий подход. Michał Perłakowski

Ваш Ответ

12   ответов
0

http://jsfiddle.net/gAtTk/ (посмотрите на вашу консоль JS)

этот код позволит вам ввести слово & quot;dev& Quot; (и в этом примере, в конце события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()));
0

чтобы обрабатывать более одного ключа «одновременно».

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
                        }
                    });
Это ошибка, а не функция, а также глобальные переменные плохие.
Который все еще не освобождает вас от использования плохих методов кодирования.
Я знаю, что это должно быть просто демонстрацией событий, а не самого Джа;)
Выcan't присвоить значение переменной, которая еще не была определена.
Переменная, не определенная вначале, будет новой переменной в глобальном стеке. Это должно быть просто примером того, как это возможно. Если хотите, я могу предоставить JSFiddle, но вопрос уже помечен как решенный ...
3

T.J. Crowder в простом JavaScript для тех, кто хотел быavoid Jquery.

//A W S D simultaneously
var map = {65: false, 87: false, 83: false, 68: false};
document.body.addEventListener('keydown', function (e) {
    var e = e || event; //to deal with old IE
    if (e.keyCode in map) {
        map[e.keyCode] = true;
       , if (map[65] && map[87]) {
            console.log('up left');
        }else if (map[83] && map[68]) {
            console.log('down right');
        }else if (map[87] && map[68]) {
            console.log('up right');
        }else if (map[83] && map[65]) {
            console.log('down left');
        }
    }
});
document.body.addEventListener('keyup', function (e) {
    if (e.keyCode in map) {
        map[e.keyCode] = false;
    }
});
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>

-1

а также должны удерживать клавишу и нажать другую (например, Shift + DEL, DEL, DEL ...), не поднимая первую клавишу, чтобы событие снова сработало ... Я изменил комментарий [BlakePlumm's] [fiddle], который расширил @ lu1s & apos; прокомментируйте ответ @ ParthThakkar.

Кроме того, использование jQuery .on () позволяет прослушивать последовательность клавиш только для определенных элементов. Изменить «тело» на «входной.выборщик» или что еще

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/

-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();
    });

Может быть, вы ищете это.

8

Как насчет чего-то вроде Shift + Alt + D? (Вы, вероятно, не должны использовать клавишу Control, потому что большинство браузеров уже так или иначе интерпретируют Ctrl + D)

Код для этого будет выглядеть примерно так:

if(e.shiftKey && e.altKey && e.keyCode == 68)
{
  alert('l33t!');
}
это не ответ на вопрос, не так ли?
хорошо ... это может быть путь ... я просто подумал, что это не ответ на требуемый вопрос, поэтому я просто спросил, что ... без обид!)
@ParthThakkar - Из этого вопроса можно вывести требование: «принудительно перевести его в скрытый режим разработчика». Будучи прагматичным, я предложил простую альтернативу для достижения того же конечного результата
Основываясь на этом обсуждении в Комментариях @GPlumb, было бы неплохо включить замечания о том, что это альтернатива рассматриваемому подходу и почему ...
70

d, e, а также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;
    }
});

Я полагаю, что вам все равно, в каком порядке они нажаты (так как надежно было бы нажимать), если все они одновременно выключены в какой-то момент.

Хорошо, работал для меня.
мм, как вы упомянули, я думаю, что порядок важен для сочетаний клавиш ..ctrl+v не то же самое, чтоv+ctrl
@DreamWave: Нет,keyup Обработчик очищает флаги.
@Vega: клавиши-модификаторы - это другой чайник рыбы.
17

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;
});​
Это действительно хорошо и будет хорошо работать. Если вам нужно сопоставить последовательность клавиш, вы можете проверить порядок, нажав на массив: вместоdown[e.keyCode]=true, сказатьdown.push(e.keyCode) и подтвердите вместо этого:if(down[68]&&down[69]&&down[86]), как это:if(down[0]===68&&down[1]===69&&down[2]===86).
Я создалfiddle дополнить комментарий lu1s.
возьмите это здесь:jsfiddle.net/5QYKH
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);
});
1

свое действие только после третьего.

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 флаги через некоторый промежуток времени.

Вот эторабочий пример.

Disclaimer: I realize the original question said that the keys should be "pressed together". This is just an alternative as other answerers have already provided sufficient solutions for the keys being pressed together.

Я проверил это в Chrome, и он не работал с исходными кодами клавиш. Я уже сталкивался с этим раньше, но я забыл, почему они разные.
1

и ни один из них не работал для меня.They didn't reset the keys.

Если для запуска скрипта потребовалось 3 клавиши, то после его запуска один раз - нажатие любой из 3 клавиш запустит его снова.

Я только что написал этот скрипт, и он работает очень хорошо. Он использует Shift + S для стрельбы, но вы можете легко это изменить. Сбрасывается после нажатия комбинации.

var saveArray = new Array();
saveArray[0] = false;
saveArray[1] = false;

$(document).ready(function(){

    $(document).keydown(function (f){
        if (f.keyCode == 16) {
            saveArray[0] = true;
        }
    });

    $(document).keyup(function (g){
        if(g.which == 16){
            saveArray[0] = false;
        }
    });

    $(document).keydown(function (h){
        if (h.keyCode == 83) {
            saveArray[1] = true;
            if(saveArray[0] == true && saveArray[1] == true){
                saveArray[0] = false;
                saveArray[1] = false;
                keypressSaveFunction();
            }
        }
    });

    $(document).keyup(function (i){
        if (i.which == 83) {
            saveArray[1] = false;
        }
    });
});

    function keypressSaveFunction(){
        alert("You pressed Shift+S");
    }

Скрипки:http://jsfiddle.net/9m8yswwo/13/

пожалуйстаdon't использованиеnew Array().
Это не сработает, если пользователь продолжает удерживать клавишу Shift и нажимает S во второй раз. форсированиеsaveArray[0] = false в событии keydown S (которое предполагает, что клавиша Shift была отпущена) это довольно ужасный хак. С другой стороны, это может быть просто причиной того, что это сработало для вас.

Похожие вопросы