Как обнаружить нажатие клавиши escape с помощью чистого JS или jQuery?

Возможный дубликат:
Какой ключевой код для escape-клавиши с jQuery

Как определить нажатие клавиши escape в IE, Firefox и Chrome? Код ниже работает в IE и предупреждает 27, но в Firefox он предупреждает 0

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

person Mithun Sreedharan    schedule 30.07.2010    source источник
comment
сделать какое-нибудь обнаружение браузера в первую очередь?   -  person ina    schedule 30.07.2010
comment
Я считаю, что quirksmode.org всегда надежен, чтобы узнать, что работает в каком браузере: quirksmode.org/js/ keys.html. Там вы можете обнаружить, что только keyup или keydown в сочетании с keyCode работает во всех браузерах.   -  person Felix Kling    schedule 30.07.2010
comment
Я думаю, что заголовок этого вопроса должен быть: Как обнаружить нажатие клавиши escape с помощью jquery? Или ответы должны быть на собственном javascript ...   -  person Wilt    schedule 30.01.2014
comment
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);}); Привет из 2014   -  person Kalle H. Väravas    schedule 02.03.2014
comment
Возможный дубликат какой ключевой код для escape-клавиши с jQuery   -  person Cœur    schedule 10.07.2018


Ответы (10)


Примечание. keyCode устаревает, используйте вместо этого key.

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

Фрагмент кода:

var msg = document.getElementById('state-msg');

document.body.addEventListener('keypress', function(e) {
  if (e.key == "Escape") {
    msg.textContent += 'Escape pressed:'
  }
});
Press ESC key <span id="state-msg"></span>


keyCode устаревает

Кажется, keydown и keyup работают, хотя keypress может и не работать


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

Какой ключевой код для escape-клавиши с jQuery

person jmj    schedule 30.07.2010
comment
для отмены привязки: $ (document) .unbind (keyup, keyUpFunc); - person Plattsy; 06.05.2013
comment
Для отмены привязки вы также можете использовать пространство имен для события $(document).on('keyup.unique_name', ...) и $(document).unbind('keyup.unique_name'). - person Lachlan McD.; 13.05.2013
comment
Рекомендуется использовать e.which (вместо e.keycode), чтобы проверить, какая клавиша была нажата. jQuery нормализует код клавиш и кодировку (используется в старых браузерах) - person DMTintner; 18.03.2014
comment
@DMTintner: по той же теме см. Комментарий Джордана Бро stackoverflow.com/a/1160109/759452 - person Adrien Be; 18.08.2014
comment
Вы всегда должны использовать ===. - person pmandell; 03.02.2016
comment
@pmandell: За исключением причин стиля кода, таких как согласованность, здесь нет никакой пользы от использования === вместо ==. - person Tim Down; 12.04.2018
comment
@LachlanMcD - имейте в виду (5 лет спустя!), Что .unbind теперь устарела с jQuery 3.0. .. вам следует использовать .off - person freefaller; 24.04.2018
comment
Большое спасибо, это спасло мне день - person Anand Choudhary; 09.05.2018
comment
e.keyCode устарел. - person Dieter Donnert; 19.09.2018
comment
Кажется, Chrome не позволяет перехватить клавишу Escape. keydown, используемый для работы (stackoverflow.com/questions/3901063/), но похоже, что Google отключил и это. - person Spero; 21.09.2018
comment
@Spero jsfiddle.net/t0bmuaxw Я тестировал последнюю версию Chrome, доступную на сегодняшний день (69.0.3497.100 (Official Build) (64-bit) 21st Sep, 18 нажатие клавиши работает - person jmj; 21.09.2018
comment
2019-07-04: Не работает в длительном Chrome на ChromeBook. Я попробовал Fiddle. Ничего не заставило это работать. - person FlorianB; 04.07.2019
comment
Длинный список ключевых значений: developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/ - person Bob Stein; 23.11.2019
comment
keypress не работал в моем случае (firefox 73.0.1). по крайней мере, не при побеге. mdn утверждает, что его недорогое сочетание клавиш / нажатия клавиш работает нормально. - person honk31; 11.03.2020
comment
keypress не работает в Chrome 87 для клавиши Escape. document.body.addEventListener('keydown',... выполняет свою работу. - person Andrej; 24.01.2021
comment
Ваш фрагмент кода не работает, при нажатии ничего не всплывает. - person Thielicious; 05.03.2021

Событие keydown отлично работает для Escape и позволяет использовать 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

person Tim Down    schedule 30.07.2010
comment
Обратите внимание, что вы также можете добавить слушателя к элементу <input>, и поэтому он будет запускаться только тогда, когда этот элемент находится в фокусе. - person Mike; 19.02.2013
comment
Я пытался, но не смог: document.getElementById('test').onkeydown = function(evt) { if ((evt || window.event).keyCode == 27) { alert() } } - person Ranmocy; 09.10.2014
comment
@Ranmocy: Что это за элемент (с идентификатором test)? Только элементы, которые могут получать фокус (входные данные формы, элементы, поддерживающие контент, элементы с установленным tabindex), запускают ключевые события. - person Tim Down; 10.10.2014
comment
Вы также можете проверить if (evt.key === 'Escape') { вместо использования устаревшего keyCode - person Keysox; 19.05.2016
comment
@Keysox: для большинства современных браузеров - да, хотя на данный момент вам все еще нужны запасные варианты. Отредактирую свой ответ. - person Tim Down; 20.05.2016
comment
К вашему сведению, ссылка MDN на keyCode (включает устаревшую узел) - person Steven; 02.06.2016
comment
key для меня 'Esc' в IE - person tobymackenzie; 20.09.2016
comment
@tobymackenzie: Так оно и есть. Разве это не чудесно? Добро пожаловать в дивный новый мир веб-разработки на основе стандартов. - person Tim Down; 20.09.2016
comment
@tobymackenzie: В любом случае, я обновил пример. Спасибо, что указали на это. - person Tim Down; 20.09.2016
comment
Если вы хотите узнать, можете ли вы безопасно использовать .key, см. caniuse.com/#feat=keyboardevent-key - person Jasper de Vries; 14.01.2018
comment
Кажется, что в Chrome нет возможности получить событие нажатия клавиши из любого элемента, однако, когда Escape имеет поле формы, теряет фокус (размытие). Вы можете попробовать, запустив приведенный выше фрагмент кода, затем переключив внимание на текстовое поле «Ваш ответ» и нажав Escape. Если у кого-нибудь есть надежный способ обхода этого, я был бы признателен. - person Aurélien Martin; 12.04.2018

Используя 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.');
    }
});
person Subodh Ghulaxe    schedule 11.07.2014
comment
Intellij сообщает, что ваш фрагмент кода vanilla js устарел. Когда мне следует прекратить его использовать? - person Dimitri Kopriwa; 03.11.2020

проверьте keyCode && which & keyup || keydown

$(document).keydown(function(e){
   var code = e.keyCode || e.which;
   alert(code);
});
person jAndy    schedule 30.07.2010
comment
Я вижу, что это не работает, jsfiddle.net/GWJVt просто для побега ... кажется неудобным? - person Reigel; 30.07.2010
comment
$ (document.body) .keypress () не запускается - person Mithun Sreedharan; 30.07.2010
comment
@Reigel: действительно, похоже, не работает должным образом с нажатием клавиш. Как бы то ни было, я не могу понять «неудобную» часть. - person jAndy; 30.07.2010
comment
KeyPress вызывается для символьных клавиш (в отличие от KeyDown и KeyUp, которые также возникают для не символьных клавиш), пока клавиша нажата. - person Marta; 16.09.2015

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

В этом примере

e.preventDefault();

отключит нажатие клавиши ESC.

Вы можете сделать что угодно, чтобы скрыть div следующим образом:

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

Также учитывается нажатие клавиши ESC:

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

Вы можете удалить это условие if, если хотите применить его ко всем. Или вы можете указать здесь 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);
person Tarik    schedule 03.01.2017

Лучший способ - сделать это

ФУНКЦИЯ:

$.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!');
})
person Ivijan Stefan Stipić    schedule 19.11.2014
comment
На самом деле кажется, что keypress не срабатывает при нажатии клавиши выхода. По крайней мере, не в Chrome на Mac. - person samson; 20.07.2015
comment
Спасибо за этот отзыв, я сделал обновление и изменение правила. keydown исправьте проблему. - person Ivijan Stefan Stipić; 21.07.2015
comment
Я обновил ваше решение, чтобы можно было использовать его «только один раз». Вот пример: jsfiddle.net/oxok5x2p. - person d.h.; 08.08.2016
comment
Холодный раствор только один раз - person Ivijan Stefan Stipić; 27.10.2020

Чистый JS

вы можете прикрепить слушателя к событию keyUp для документа.

Кроме того, если вы хотите убедиться, что никакая другая клавиша не нажата вместе с клавишей Esc, вы можете использовать значения ctrlKey, altKey и shifkey.

 document.addEventListener('keydown', (event) => {
        
        if (event.key === 'Escape') {
         //if esc key was not pressed in combination with ctrl or alt or shift
            const isNotCombinedKey = !(event.ctrlKey || event.altKey || event.shiftKey);
            if (isNotCombinedKey) {
                console.log('Escape key was pressed with out any group keys')
              
            }
        }
    });
person Irshad    schedule 20.10.2020

В Firefox 78 используйте это (нажатие клавиши не работает для клавиши Escape):

function keyPress (e)(){
  if (e.key == "Escape"){
     //do something here      
  }
document.addEventListener("keyup", keyPress);
person Petr L.    schedule 17.07.2020

чистый JS (без JQuery)

document.addEventListener('keydown', function(e) {
    if(e.keyCode == 27){
      //add your code here
    }
});
person Dead Pool    schedule 10.01.2021
comment
Привет, спасибо за ответ на этот вопрос, в соответствии с правилами сайта, пожалуйста, добавьте пояснительный текст, чтобы объяснить, как / почему это работает. Спасибо! - person Nathaniel Flick; 11.01.2021

Я думаю, что самый простой способ - это ванильный javascript:

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

Обновлено: изменен ключ = ›keyCode

person Duan Walker    schedule 30.11.2016
comment
На моем Chrome (версия 55.0.2883.95 (64-разрядная)) я получаю Escape как event.key, а не 27 - person MosheZada; 25.12.2016
comment
Должно быть event.keyCode, чтобы быть 27. - person Jens Törnell; 28.01.2020