Какой код клавиши для escape-ключа с помощью jQuery

У меня есть две функции. Когда нажата кнопка ввода, функции работают правильно, а когда нажата кнопка выхода - нет. Какой правильный номер для клавиши escape?

$(document).keypress(function(e) { 
    if (e.which == 13) $('.save').click();   // enter (works as expected)
    if (e.which == 27) $('.cancel').click(); // esc   (does not work)
});

16 ответов

Решение

Попробуйте с событием keyup:

$(document).keyup(function(e) {
  if (e.keyCode === 13) $('.save').click();     // enter
  if (e.keyCode === 27) $('.cancel').click();   // esc
});

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

var KEYCODE_ENTER = 13;
var KEYCODE_ESC = 27;

$(document).keyup(function(e) {
  if (e.keyCode == KEYCODE_ENTER) $('.save').click();
  if (e.keyCode == KEYCODE_ESC) $('.cancel').click();
});

Некоторые браузеры (например, FireFox, неуверенный в других) определяют глобальный KeyEvent объект, который выставляет эти типы констант для вас. Этот ТАК вопрос показывает хороший способ определения этого объекта в других браузерах.

(Ответ извлечен из моего предыдущего комментария)

Вам нужно использовать keyup скорее, чем keypress, например:

$(document).keyup(function(e) {
  if (e.which == 13) $('.save').click();     // enter
  if (e.which == 27) $('.cancel').click();   // esc
});

keypress Похоже, что он не обрабатывается последовательно между браузерами (попробуйте демонстрацию на http://api.jquery.com/keypress в IE против Chrome против Firefox. Иногда keypress не регистрируется, и значения для "which" и "keyCode" варьируются), тогда как keyup согласуется.

Так как было некоторое обсуждение e.which против e.keyCode: Обратите внимание, что e.which является нормализованным значением jquery и рекомендуется для использования:

Свойство event.which нормализует event.keyCode и event.charCode. Рекомендуется следить за событием, которое для ввода с клавиатуры.

http://api.jquery.com/event.which/)

Чтобы найти код клавиши для любой клавиши, используйте эту простую функцию:

document.onkeydown = function(evt) {
    console.log(evt.keyCode);
}

27 код для управляющего ключа:)

Ваша лучшая ставка

$(document).keyup(function(e) { 
    if (e.which === 13) $('.save').click();   // enter 
    if (e.which === 27) $('.cancel').click(); // esc   

    /* OPTIONAL: Only if you want other elements to ignore event */
    e.preventDefault();
    e.stopPropagation();
});

Резюме

  • which является более предпочтительным, чем keyCode потому что это нормализовано
  • keyup является более предпочтительным, чем keydown потому что нажатие клавиши может происходить несколько раз, если пользователь удерживает ее нажатой.
  • Не использовать keypress если вы не хотите захватить реальных персонажей.

Интересно, что Bootstrap использует keydown и keyCode в своем выпадающем компоненте (по состоянию на 3.0.2)! Я думаю, что это, вероятно, плохой выбор там.

Связанный фрагмент из документа JQuery

Хотя браузеры используют разные свойства для хранения этой информации, jQuery нормализует свойство.which, чтобы вы могли надежно использовать его для получения кода ключа. Этот код соответствует клавише на клавиатуре, включая коды для специальных клавиш, таких как стрелки. Для отлавливания фактического ввода текста, .keypress() может быть лучшим выбором.

Другие интересные вещи: JavaScript Keypress Library

Просто опубликовать обновленный ответ, чем e.keyCode считается УСТАРЕЛО на MDN.

Скорее вы должны выбрать e.key вместо этого, который поддерживает чистые имена для всего. Вот соответствующая копия пасты

window.addEventListener("keydown", function (event) {
  if (event.defaultPrevented) {
    return; // Do nothing if the event was already processed
  }

  switch (event.key) {
    case "ArrowDown":
      // Do something for "down arrow" key press.
      break;
    case "ArrowUp":
      // Do something for "up arrow" key press.
      break;
    case "ArrowLeft":
      // Do something for "left arrow" key press.
      break;
    case "ArrowRight":
      // Do something for "right arrow" key press.
      break;
    case "Enter":
      // Do something for "enter" or "return" key press.
      break;
    case "Escape":
      // Do something for "esc" key press.
      break;
    default:
      return; // Quit when this doesn't handle the key event.
  }

  // Cancel the default action to avoid it being handled twice
  event.preventDefault();
}, true);

Попробуйте плагин jEscape ( скачать с Google Drive)

$(document).escape(function() { 
   alert('ESC button pressed'); 
});

или получите код для кросс-браузера

var code = (e.keyCode ? e.keyCode : e.which);
if (code === 27) alert('ESC');
if (code === 13) alert('ENTER');

может быть, вы можете использовать переключатель

var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
    case 27:
       alert('ESC');
       break;
     case 13:
       alert('ENTER');
       break;
}

Ваш код работает просто отлично. Скорее всего, это окно не сфокусировано. Я использую аналогичную функцию, чтобы закрыть окна iframe и т. Д.

$(document).ready(function(){

    // Set focus
    setTimeout('window.focus()',1000);

});

$(document).keypress(function(e) {

    // Enable esc
    if (e.keyCode == 27) {
      parent.document.getElementById('iframediv').style.display='none';
      parent.document.getElementById('iframe').src='/views/view.empty.black.html';
    }

});

Я пытался сделать то же самое, и это выводило меня из себя. В Firefox, кажется, что если вы пытаетесь сделать что-то, когда нажата клавиша ESC, он продолжает обрабатывать клавишу ESC, которая затем отменяет все, что вы пытались сделать. Оповещение работает отлично. Но в моем случае я хотел вернуться в историю, которая не сработала. Наконец выяснилось, что я должен был заставить распространение события остановиться, как показано ниже...

if (keyCode == 27)
{
    history.back();

    if (window.event)
    {
        // IE works fine anyways so this isn't really needed
        e.cancelBubble = true;
        e.returnValue = false;
    }
    else if (e.stopPropagation)
    {
        // In firefox, this is what keeps the escape key from canceling the history.back()
        e.stopPropagation();
        e.preventDefault();
    }

    return (false);
}

Чтобы объяснить, где другие ответы не имеют; проблема в том, что вы используете keypress,

Возможно, это событие просто неправильно названо, но keypress определяется для стрельбы, когда when an actualcharacteris being inserted, Т.е. текст.
Тогда как вы хотите keydown / keyup, который срабатывает всякий раз (до или после, соответственно) the user depresses akey, Т.е. эти вещи на клавиатуре.

Разница появляется здесь, потому что esc является управляющим символом (буквально "непечатный символ") и поэтому не пишет никакого текста, таким образом, даже не стреляя keypress,
enter странно, потому что, даже если вы используете его в качестве управляющего символа (т.е. для управления пользовательским интерфейсом), он все равно вставляет символ новой строки, который будет запускать keypress,

Источник: причудливый режим

Чтобы получить шестнадцатеричный код для всех символов: http://asciitable.com/

Надежная библиотека Javascript для ввода ввода с клавиатуры и введенных комбинаций клавиш. У него нет зависимостей.

http://jaywcjlove.github.io/hotkeys/

hotkeys('enter,esc', function(event,handler){
    switch(handler.key){
        case "enter":$('.save').click();break;
        case "esc":$('.cancel').click();break;
    }
});

Горячие клавиши понимают следующие модификаторы: , опция сдвига команда управления alt ctrl и .

Следующие специальные клавиши могут быть использованы для сочетаний клавиш: вкладка " Backspace ", очистка, ввод, возврат, esc, escape, пробел, вверх, вниз, влево, вправо, home, end, pageup, pagedown, del, delete и f1 - f19.

Я знаю, что этот вопрос касается jquery, но для тех, кто использует jqueryui, существуют константы для многих кодов клавиш:

$.ui.keyCode.ESCAPE

http://api.jqueryui.com/jQuery.ui.keyCode/

Я всегда использовал keyup и e.which, чтобы поймать escape-ключ.

      $(document).on('keydown', function(event) {
   if (event.key == "Escape") {
       alert('Esc key pressed.');
   }
});
Другие вопросы по тегам