Какой код ключа для ключа escape с jQuery

У меня есть две функции. При нажатии кнопки функции выполняются корректно, но при нажатии кнопки сброса нет. Какое правильное число для ключа эвакуации?

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

Ответ 1

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

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

Ответ 2

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

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, unsure of others) определяют глобальный объект KeyEvent, который предоставляет вам эти типы констант. Этот вопрос SO показывает хороший способ определения этого объекта в других браузерах.

Ответ 3

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

Вам нужно использовать 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 vs Firefox. Иногда keypress не регистрируется, а значения для "which" и "keyCode" меняются), тогда как keyup является непротиворечивым.

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

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

(из http://api.jquery.com/event.which/)

Ответ 4

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

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

Ответ 5

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

Ответ 6

Попробуйте 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;
}

Ответ 7

Лучше всего

$(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 нормализует. чтобы вы могли надежно использовать его для извлечения key code. Эта код соответствует клавише на клавиатуре, включая коды для специальных таких как стрелки. Чтобы поймать фактический ввод текста,.keypress() может быть лучшим выбором.

Другой интересный объект: JavaScript Keypress Library

Ответ 8

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

Ответ 9

Ваш код работает отлично. Скорее всего, это окно не сфокусировано. Я использую аналогичную функцию для закрытия полей 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';
    }

});

Ответ 10

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

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

Ответ 11

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

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

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

Источник: quirksmode

Ответ 12

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

Ответ 13

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

$.ui.keyCode.ESCAPE

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

Ответ 14

Введена надежная библиотека 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;
    }
});

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

Для ярлыков можно использовать следующие специальные клавиши: backspace tab, clear, enter, return, esc, escape, space, up, down, left, right, home, end, pageup, pagedown, del, delete и f1 через f19.

Ответ 15

Просто отправьте обновленный ответ, чем e.keyCode считается DEPRECATED на 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);