Як виявити натискання клавіші втечі за допомогою чистого JS або jQuery?


524

Можливий дублікат:
який код коду ключа для втечі з jQuery

Як виявити натискання клавіші втечі в IE, Firefox та Chrome? Нижче код працює в IE та сповіщеннях 27, але у Firefox він попереджає0

$('body').keypress(function(e){
    alert(e.which);
    if(e.which == 27){
        // Close my modal window
    }
});

1
дещо виявити браузер спочатку?
іна

7
Я вважаю quirksmode.org завжди надійним, щоб дізнатися, що працює в тому браузері: quirksmode.org/js/keys.html . Там ви можете виявити , що тільки keyupабо keydownв комбінації з keyCodeроботи у всіх браузерах.
Фелікс Клінг

1
Я думаю, що заголовок цього питання повинен бути "Як виявити натискання клавіші втечі за допомогою jquery?" Або відповіді повинні бути у рідному javascript ...
Wilt

3
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);});Привітання з 2014 року
Kalle H. Väravas

Відповіді:


957

Примітка: keyCodeце стає застарілими використовувати keyзамість цього.

function keyPress (e) {
    if(e.key === "Escape") {
        // write your logic here.
    }
}

Ось jsfiddle


keyCode - Застарення

Здається, keydownі keyupпрацює, хоч keypressі не може


$(document).keyup(function(e) {
     if (e.key === "Escape") { // escape key maps to keycode `27`
        // <DO YOUR WORK HERE>
    }
});

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


11
від’єднати: $ (document) .unbind ("keyup", keyUpFunc);
Платці

54
Для від’єднання ви також можете використовувати простір імен події, $(document).on('keyup.unique_name', ...)і$(document).unbind('keyup.unique_name')
Lachlan McD.

9
Рекомендується використовувати e.which (замість e.keycode), щоб перевірити, яка клавіша була натиснута. jQuery нормалізує код і шар-код (використовується в старих браузерах)
DMTintner

1
@DMTintner: з тієї ж теми дивіться коментар, залишений Джорданом Бро stackoverflow.com/a/1160109/759452
Адрієн Бе

8
Ви завжди повинні використовувати ===.
pmandell

211

keydownПодія буде працювати штраф за втечу і має перевагу дозволяє використовувати keyCodeв усіх браузерах. Також потрібно приєднати слухача, documentа не тіла.

Оновлення травня 2016 року

keyCodeзараз процес застарілого, і більшість сучасних веб-переглядачів пропонують цю keyвластивість зараз, хоча для отримання гідної підтримки браузера вам все ще знадобиться резервна підтримка (на момент написання поточних версій Chrome і Safari не підтримують її).

Оновлення вересня 2018 року evt.key тепер підтримується всіма сучасними браузерами.

document.onkeydown = function(evt) {
    evt = evt || window.event;
    var isEscape = false;
    if ("key" in evt) {
        isEscape = (evt.key === "Escape" || evt.key === "Esc");
    } else {
        isEscape = (evt.keyCode === 27);
    }
    if (isEscape) {
        alert("Escape");
    }
};
Click me then press the Escape key


3
Зверніть увагу, ви можете також додати слухача до <input>елемента, і він буде запускатися лише тоді, коли цей елемент має фокус.
Майк

1
@Ranmocy: Що це за елемент (той, з ідентифікатором 'test')? Тільки елементи, які здатні отримувати фокус (входи форми, змістовні елементи, елементи із набором табіндексу), викликають ключові події.
Тім Даун

1
Ви також можете перевірити if (evt.key === 'Escape') {замість використання застарілогоkeyCode
Keysox

1
@tobymackenzie: Так і є. Хіба це не дивовижно? Ласкаво просимо у новий відважний світ розробки веб-сторінок на основі стандартів.
Tim Down

1
Якщо ви хочете знати, чи можете ви безпечно користуватися .key, перегляньте сторінку caniuse.com/#feat=keyboardevent-key
Джаспер де Вріс

37

За допомогою JavaScript ви можете перевірити робочу jsfiddle

document.onkeydown = function(evt) {
    evt = evt || window.event;
    if (evt.keyCode == 27) {
        alert('Esc key pressed.');
    }
};

За допомогою jQuery ви можете перевірити робочу jsfiddle

jQuery(document).on('keyup',function(evt) {
    if (evt.keyCode == 27) {
       alert('Esc key pressed.');
    }
});

17

перевірити keyCode&& which& keyup||keydown

$(document).keydown(function(e){
   var code = e.keyCode || e.which;
   alert(code);
});

я бачу, що це не працює, jsfiddle.net/GWJVt лише для втечі ... здається незручним?
Рейгель

$ (document.body) .keypress () не стріляє
Mithun Sreedharan

@Reigel: справді, здається, не працює належним чином із натисканням клавіші. Що б там не було, я не можу зрозуміти «незграбну» частину.
jAndy

3
KeyPress піднімається для символьних клавіш (на відміну від KeyDown та KeyUp, які також піднімаються для нехарактерних клавіш) під час натискання клавіші.
Марта

7

Найкращий спосіб - це функціонувати для цього

ФУНКЦІЯ:

$.fn.escape = function (callback) {
    return this.each(function () {
        $(document).on("keydown", this, function (e) {
            var keycode = ((typeof e.keyCode !='undefined' && e.keyCode) ? e.keyCode : e.which);
            if (keycode === 27) {
                callback.call(this, e);
            };
        });
    });
};

ПРИКЛАД:

$("#my-div").escape(function () {
    alert('Escape!');
})

4
Насправді, здається, що keypressне спрацьовує клавіша втечі. Принаймні, не в Chrome на Mac.
Самсон

1
Дякую за цей відгук, я створив правило оновлення та зміни. keydownвиправити проблему.
Івіджан Стефан Стипич

Я оновив ваше рішення, щоб мати можливість підтримувати використання лише одного разу. Ось приклад: jsfiddle.net/oxok5x2p .
dh

6

Нижче наведено код, який не лише вимикає клавішу ESC, але і перевіряє стан, де вона натиснута, і залежно від ситуації, зробить дію чи ні.

У цьому прикладі

e.preventDefault();

вимкне дію натискання клавіші ESC.

Ви можете зробити щось подібне, щоб приховати діва з цим:

document.getElementById('myDivId').style.display = 'none';

Якщо натиснута клавіша ESC також враховується:

(e.target.nodeName=='BODY')

Ви можете видалити це, якщо умова частина, якщо ви хочете застосувати до цього всі. Або ви можете націлити тут INPUT, щоб застосувати цю дію лише тоді, коли курсор знаходиться у полі введення.

window.addEventListener('keydown', function(e){
    if((e.key=='Escape'||e.key=='Esc'||e.keyCode==27) && (e.target.nodeName=='BODY')){
        e.preventDefault();
        return false;
    }
}, true);

0

я думаю, найпростіший спосіб - ванільний javascript:

document.onkeyup = function(event) {
   if (event.key === 27){
     //do something here
   }
}

6
На своєму хромі (версія 55.0.2883.95 (64-розрядна)) я отримую Escapeяк, event.keyа не 27
MosheZada

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