Захват комбинации клавиш ctrl + z в javascript

86

Я пытаюсь захватить комбинацию клавиш ctrl+ zв javascript с помощью этого кода:

<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клавишу.

Соедините их вместе, как указано в строке после «test 1 & 2», и удерживание ctrlклавиши, а затем нажатие zклавиши не генерирует предупреждение, как ожидалось.

Что не так с кодом?

Пол Джонстон
источник

Ответы:

95
  1. Используйте onkeydown(или onkeyup), а неonkeypress
  2. Используйте keyCode90, а не 122

Онлайн-демонстрация: http://jsfiddle.net/29sVC/

Чтобы уточнить, коды клавиш - это не то же самое, что коды символов.

Коды символов предназначены для текста (они различаются в зависимости от кодировки, но во многих случаях 0–127 остаются кодами ASCII). Коды клавиш соответствуют клавишам на клавиатуре. Например, в символе юникода 0x22909 означает 好. Не так много клавиатур (если они есть), у которых есть для этого ключ.

ОС заботится о преобразовании нажатий клавиш в коды символов, используя методы ввода, настроенные пользователем. Результаты отправляются в событие нажатия клавиши. (В то время как keydown и keyup реагируют на нажатие пользователем кнопок, а не на ввод текста.)

Зеркмс
источник
1
Спасибо, работает. Почему не работают onkeypress и keyCode 122?
Пол Джонстон
Как предотвратить использование Default () вместо предупреждения в вашем решении, пожалуйста? Я тестирую Ctrl + t.
Сурендра Джнавали
@SJnawali: Я не уверен, что это возможноctrl+t
zerkms
4
почему keyCode 122 не работает? ну, 122это для клавиши F11 :)
Baby
7
@PaulJohnston Потому что код клавиши - это не то же самое, что код символа . Коды символов предназначены для текста (они различаются в зависимости от кодировки, но во многих случаях 0–127 остаются кодами ASCII). Коды клавиш соответствуют клавишам на клавиатуре. Например, в символе юникода 0x22909 означает 好. Не так много клавиатур (если они есть), у которых есть для этого ключ. ОС заботится о преобразовании нажатий клавиш в коды символов, используя методы ввода, настроенные пользователем. Результаты отправляются на keypressмероприятие. (В то время как keydownи keyupреагировать на пользователя, нажимая кнопки, а не набирая текст.)
Айдиакапи
32

Для будущих людей, которые столкнутся с этим вопросом, вот лучший способ выполнить работу:

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

Использование event.keyзначительно упрощает код, удаляя жестко запрограммированные константы. Имеет поддержку IE 9+.

Кроме того, использование document.addEventListenerозначает, что вы не будете сбивать других слушателей с того же события.

Наконец, нет причин использовать window.event. Это очень не рекомендуется и может привести к нестабильному коду.

lazd
источник
Кроме того, я бы добавил, что KeyboardEvent.keyCodeтеперь он устарел пару лет назад. Лучший способ захватить все браузеры - e.keyсначала проверить, а затем вернуться к e.keyCode. Или вы можете использовать этот полифилл
Да, Барри
9

Ctrl+ tтакже возможно ... просто используйте код клавиши 84, например

if (evtobj.ctrlKey && evtobj.keyCode == 84) 
 alert("Ctrl+t");
chandramouli.jamadagni
источник
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 исключительно для выполнения ваших пользовательских функций.

JDandChips
источник
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 +.

&& помогает с комбинациями клавиш, без комбинаций он блокирует все клавиши ctrl или shift.

новый парень12121
источник
-3

Этот созданный мной плагин может быть вам полезен.

Плагин

Вы можете использовать этот плагин, чтобы указать ключевые коды и функции, которые будут запускаться следующим образом

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

В коде я показал, как выполнять для Ctrl+ Z. Подробную документацию вы получите по ссылке. Плагин находится в разделе кода JavaScript моего пера на Codepen.

10011101111
источник
-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
       }
    });
Картикеян Ганесан
источник