javascript - js keypress enter trigger




Обнаружение нескольких ключей в одном событии нажатия клавиши в jQuery (8)

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

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

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

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

https://code.i-harness.com


Вам нужно будет захватить три ключевых события отдельно и запустить ваше действие только после третьего.

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

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

Отказ от ответственности: я понимаю, что в первоначальном вопросе говорилось, что ключи должны «сжиматься». Это просто альтернатива, поскольку другие ответчики уже предоставили достаточные решения для сжимания ключей.


Возможно, проще было бы упростить сочетание клавиш?

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

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

if(e.shiftKey && e.altKey && e.keyCode == 68)
{
  alert('l33t!');
}

Если вам небезразличен порядок, а также нужно удерживать клавишу и нажать другую (например: Shift + DEL, DEL, DEL ...), не поднимая первую клавишу, чтобы снова запустить событие ... Я изменил комментарий @ [BladePlumm], который продлил комментарий @ lu1s на ответ @ ParthThakkar.

Кроме того, использование jQuery's .on () позволяет прослушивать последовательность клавиш только для определенных элементов. Измените «тело» на «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/


Если вы хотите обнаружить, что все ключи d , e и v были одновременно опущены, вам нужно посмотреть как keydown и keyup и сохранить карту тех, которые не работают. Когда они все упадут, запустите свое мероприятие.

Например: Живая копия | source

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

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


Немного более современное решение, использует функции стрелок и параметры отдыха :

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>


Подобно Vega's ... но проще

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

Я попробовал три лучших ответа (начиная с этого поста), и никто из них не работал для меня. Они не сбросили ключи .

Если понадобилось 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/


если я хорошо понял: пример скрипки, 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()));




jquery-events