Який код ключа для втечі з jQuery


559

У мене дві функції. При натисканні клавіші введення функції запускаються правильно, але при натисканні клавіші введення не відбувається. Яке правильне число ключа для втечі?

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

Натискання клавіші поверне символ, підключений до клавіші (у правильних кришках тощо), Keyup поверне кількість натиснутої апаратної кнопки. Для ESC вам потрібно апаратний код 27 (не символ ascii 27)
Joeri


Існує дійсно простий трюк, щоб дізнатися, який саме ключКод ви хочете. Просто відкрийте нову вкладку, помістіть document.addEventListener("keydown", e => console.log(e.keyCode))у консоль браузера, натисніть у вікно і натисніть клавішу, яку ви шукаєте.
анархіст912

Відповіді:


925

Спробуйте з подією клавіатури :

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

39
Це не має нічого спільного з клавіатурою та натисканням клавіш. Щоб захопити ESCAPE, вам потрібно подивитися на e.keyCode на відміну від e.which (що це робиться у цьому прикладі).
dkamins

211
"Це не має нічого спільного з клавіатурою та натисканням клавіш" - це неправильно, dkamins. Здається, натискання клавіш не обробляється послідовно між браузерами (спробуйте демонстрацію на api.jquery.com/keypress в IE проти Chrome проти Firefox - іноді він не реєструється, і обидва "які" та "keyCode" змінюються) тоді як клавіатура послідовна. напр., яке є нормованим значенням jquery, тому "які" або "keyCode" повинні працювати як у клавіатурі.
Джордан Бро

13
@ Джордан Бро - я хотів би попросити вас опублікувати ваш коментар як відповідь, щоб люди його прочитали і зрозуміли власне значення вашого коментаря! оскільки ваш коментар такий же важливий, як відповідь, що пояснює
Муртаза

15
keydownбуде імітувати рідну поведінку - принаймні в Windows, де натискання клавіші ESC або Return у діалоговому вікні запустить дію до того, як клавіша буде відпущена.
thomthom

2
@gibberish Я додав тут свій коментар як відповідь: stackoverflow.com/a/28502629/58876
Джордан Бро

77

Замість того, щоб вводити жорсткі коди значень ключового коду у вашій функції, подумайте про використання названих констант, щоб краще передати своє значення:

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об'єкт, який виставляє ці типи констант для вас. Це запитання ТА показує хороший спосіб визначення цього об'єкта і в інших браузерах.


15
Що, 27 не просто вискочить на вас, як на ключ втечі?!? Чесно кажучи, це дійсно потрібно робити більше людей. Я називаю їх "магічні числа" та "магічні струни". Що означає 72? Чому у вашій кодовій базі 300 разів скопійовано дуже специфічну та мінливу стрічку? пр.
vbullinger

1
Або ви можете просто додати коментар над кожним, оскільки ви, ймовірно, використовуєте їх кожен раз. ІМО так само читабельний
Іван Дерст

8
@IvanDurst ви можете використовувати їх лише один раз за методом , але я використовую їх кілька разів у своїх проектах. Ви дійсно припускаєте, що ви хочете (1) шукати значення та (2) коментувати їх щоразу, коли ви бажаєте використовувати код ключа? Я не знаю про вас, але у мене немає ні бажання запам'ятати їх, ні віри, що інші програмісти будуть коментувати їх послідовно. Йдеться про те, щоб зробити кодування простішим та послідовнішим, а не просто читабельніше.
Сет Петрі-Джонсон

2
Той, хто знає, що вони означають, не повинен шукати значення, щоб прокоментувати їх, а набрати коментар так само швидко, як і ввести довге ім’я.
NetMage

6
Що трапилось із старими добрими часами, коли ми використовували кодові константи в шістнадцятковій формі? Усі знають, що це ESC, 0x1Bі Enter є 0x0D, правда?
David R Tribble

42

(Відповідь вилучена з мого попереднього коментаря )

Вам потрібно використовувати, 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 vs Chrome vs Firefox. Іноді keypressне реєструється, і значення "і", і " keyCode 'змінюється), тоді як keyupє послідовним.

Оскільки було обговорено e.whichvs e.keyCode: Зауважте, що e.whichце нормалізоване значення jquery і є рекомендованим для використання:

Властивість event.wich нормалізує event.keyCode та event.charCode. Рекомендується переглянути event.which для клавіш клавіатури.

(від http://api.jquery.com/event.which/ )


5
Я також хотів би додати тут, що браузери, які не спрацьовують keypressпід час втечі, роблять це правильно. keypressпокликаний стріляти лише тоді, коли ключ видає символ, тоді як keyupвогонь завжди. developer.mozilla.org/en-US/docs/Web/Events/keypress
ohcibi

26

Щоб знайти код коду для будь-якої клавіші, використовуйте цю просту функцію:

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

14

27- код ключа для втечі. :)


1
У мене є дві функції при натисканні, функції виконуються правильно, але не клавішею клавіші .. $ (document) .keypress (функція (e) {if (напр. = 13) {$ ('. Save'). ();} if (напр. == 27) {$ ('. Скасувати'). click ();}});
Шишант

$ (document) .keypress (функція (e) {y = e.keyCode? e.keyCode: e.which;}); Коли я попереджую (y), він повідомляє 27 в IE та FF. Ви впевнені, що з вашим кодом щось інше не так?
Солоне

14

Ваша найкраща ставка

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

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

Інші цікаві місця: Бібліотека JavaScript Keypress


10

Спробуйте плагін 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

Ваш код працює чудово. Це, швидше за все, вікно, яке не зосереджене. Я використовую подібну функцію, щоб закрити рамки 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';
    }

});

8

Я намагався зробити те ж саме, і це виривало з мене лайно. У Firefox виявляється, що якщо ви намагаєтеся робити деякі речі, коли натискається клавіша втечі, вона продовжує обробляти клавішу втечі, яка потім скасовує все, що ви намагалися зробити. Сповіщення працює чудово. Але в моєму випадку я хотів повернутися в історію, яка не спрацювала. Нарешті з'ясував, що я повинен змусити розповсюдження події припинити, як показано нижче ...

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

8

Пояснити, де інших відповідей немає; проблема полягає у вашому використанні keypress.

Можливо , ця подія є просто неправильно названо , але keypressвизначається при пожежі . Тобто текст. Тоді як те, що ви хочете, є / , яке спрацьовує щоразу (до або після, відповідно) . Тобто ті речі на клавіатурі.when an actualcharacteris being inserted
keydownkeyupthe user depresses akey

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

Джерело: quirksmode


1
Кудо для читання спец! Це має бути прийнята відповідь точно :)
DylanYoung

7

Щоб отримати шістнадцятковий код для всіх символів: http://asciitable.com/


2
Я хотів би сказати ..... Я ненавиджу, що цей сайт знаходиться на вершині результатів пошуку, тому що це так чортово негарно, але він передає необхідну інформацію.
mpen

1
Зауважте, що залежно від події та браузера, ключові коди не завжди відповідають таблицям ascii.
Алан Х.

2
downvote: не відповідає на питання, навіть не займається питанням, hex не має нічого спільного з питанням, і OP вже продемонстрував знання esc == 27.
Джеремі

7

Лише розміщення оновленої відповіді, ніж 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);

3
Але це, здається, підтримується лише у Firefox та Chrome.
Gayan Weerakutti


На жаль, принаймні деякі версії Internet Explorer передають код, Escа не стандартний Escape.
Робін Стюарт

6

Надійна бібліотека 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;
    }
});

гарячі клавіші розуміють такі модифікатори: , shiftoptionaltctrlcontrolcommandі .

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


5

Я завжди використовував клавіатуру і, наприклад, для того, щоб зловити ключ втечі.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.