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

487

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

$(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
    Что ты пытаешься сделать?
  • 0
    Нажатие клавиши вернет символ, подключенный к клавише (в правильных заглавных буквах и т. Д.), Keyup вернет количество нажатых аппаратных кнопок Для ESC вам нужен аппаратный код 27 (а не символ ascii 27)
Показать ещё 1 комментарий
Теги:

15 ответов

815
Лучший ответ

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

$(document).keyup(function(e) {
  if (e.keyCode === 13) $('.save').click();     // enter
  if (e.keyCode === 27) $('.cancel').click();   // esc
});
  • 38
    Это не имеет ничего общего с keyup против нажатия клавиш. Чтобы захватить ESCAPE, вам нужно взглянуть на e.keyCode, а не на e.which (что и происходит в этом примере).
  • 206
    «Это не имеет никакого отношения к нажатию клавиш против нажатия клавиш» - это неправильно, дакинс. Кажется, что нажатие клавиш не обрабатывается последовательно между браузерами (попробуйте демонстрацию на api.jquery.com/keypress в IE против Chrome против Firefox - иногда это не регистрируется, и оба «which» и «keyCode» различаются) в то время как keyup является последовательным. е. которое является нормализованным значением jquery, так что 'which' или 'keyCode' должны оба работать в keyup.
Показать ещё 9 комментариев
59

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

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 показывает хороший способ определения этого объекта в других браузерах.

  • 13
    Что, 27 не просто выскочил на тебя как на клавишу спасения?!? Честно говоря, это действительно должно быть сделано большим количеством людей. Я называю их «магическими числами» и «волшебными струнами». Что значит 72? Почему у вас есть очень специфическая и изменчивая строка, скопированная 300 раз в вашу базу кода? и т.п.
  • 1
    Или вы можете просто добавить комментарий над каждым, поскольку вы, вероятно, используете их каждый раз. ИМО так же читабельно
Показать ещё 10 комментариев
29

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

Вам нужно использовать 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/)

  • 5
    Я также хотел бы добавить, что браузеры, которые не keypress при выходе, делают это правильно. keypress предназначен для запуска только тогда, когда ключ производит символ, тогда как keyup срабатывает всегда. developer.mozilla.org/en-US/docs/Web/Events/keypress
25

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

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

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

  • 1
    У меня есть две функции, когда ввод - это нажатие, функции выполняются правильно, но не с клавишей ESC .. $ (document) .keypress (function (e) {if (e.which == 13) {$ ('. Save'). Click ();} if (e.which == 27) {$ ('. cancel'). click ();}});
  • 0
    $ (document) .keypress (function (e) {y = e.keyCode? e.keyCode: e.which;}); Когда я предупреждаю (y), это предупреждает 27 в IE и FF. Вы уверены, что в вашем коде нет ничего плохого?
9

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

Лучше всего

$(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

7

Я пытаюсь сделать то же самое, и это вызывало у меня дерьмо. В 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);
}
7

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

});
7

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

  • 2
    Я собирался сказать ..... Я ненавижу, что этот сайт находится в верхней части результатов поиска, потому что он чертовски уродлив, но он действительно передает необходимую информацию.
  • 1
    также может использовать 'man ascii' в * nix
Показать ещё 2 комментария
5

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

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

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

Источник: quirksmode

  • 0
    Слава за чтение спецификации! Это должен быть принятый ответ наверняка :)
4

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

$.ui.keyCode.ESCAPE

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

4

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

3

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

0

Просто отправьте обновленный ответ, чем 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);
  • 2
    Но, похоже, поддерживается только в Firefox и Chrome.
  • 1
    Вот таблица поддержки caniuse.com/#feat=keyboardevent-key

Ещё вопросы

Сообщество Overcoder
Наверх
Меню