Как да открием натискане на клавиш за изход с чист JS или jQuery?

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

Как да разпозная натискането на клавиш за изход в 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/ ключове.html . Там можете да откриете, че само keyup или keydown в комбинация с keyCode работи във всички браузъри.   -  person Felix Kling    schedule 30.07.2010
comment
Мисля, че заглавието на този въпрос трябва да бъде Как да разпозная натискането на клавиш за изход с 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 нормализира keycode и charcode (използвани в по-стари браузъри) - person DMTintner; 18.03.2014
comment
@DMTintner : по същата тема вижте коментара, оставен от Jordan Brough 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 keydown работи - 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
натискането на клавиш не работи в моя случай (firefox 73.0.1). поне не при бягство. mdn твърди, че оттегленият keyup/keydown работи добре. - 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: Какъв вид елемент е (този с ID „test“)? Само елементи, които могат да получат фокус (въведени формуляри, елементи с възможност за редактиране на съдържание, елементи с набор от индекси на раздели), задействат ключови събития. - 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
FYI, препратката на 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 да получи събитието keydown от всеки елемент, когато 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 казва, че вашият ванилен 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