Saf JS veya jQuery ile kaçış tuşuna basmayı nasıl tespit edebilirim?


524

Olası Çoğaltma:
jQuery ile kaçış anahtarı için hangi anahtar kodu

IE, Firefox ve Chrome'da kaçış tuşuna basmayı nasıl tespit edebilirim? Aşağıdaki kod IE'de çalışır ve uyarır 27, ancak Firefox'ta uyarır0

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

1
önce tarayıcı algılaması yapılıyor mu?
ina

7
Hangi tarayıcıda neyin işe yaradığını bulmak için quirksmode.org'u her zaman güvenilir buluyorum: quirksmode.org/js/keys.html . Orada sadece keyupveya tüm tarayıcılarda çalışır keydownile birlikte bulabilirsiniz keyCode.
Felix Kling

1
Ben bu sorunun başlığı "jquery ile kaçış tuşuna basın nasıl tespit edilir?" Ya da cevaplar yerli javascriptte olmalıdır ...
Wilt

3
$(document).on("keyup", function (e) {var code = e.keyCode || e.which; alert('key pressed: ' + code);});2014'ten selamlar
Kalle H. Väravas

Yanıtlar:


957

Not: keyCodeedilir kaldırılan alma kullanımını keyyerine.

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

İşte jsfiddle


keyCode kullanımdan kaldırılıyor

Öyle görünüyor keydownve keyupeser halde keypressolmayabilir


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

JQuery ile kaçış anahtarı için hangi anahtar kodu


11
bağlamak için: $ (document) .unbind ("keyup", keyUpFunc);
Plattsy

54
Ayrıca olay hakkında bir ad kullanabilirsiniz unbind, için $(document).on('keyup.unique_name', ...)ve$(document).unbind('keyup.unique_name')
Lachlan McD.

9
Hangi tuşa basıldığını kontrol etmek için e.which (e.keycode yerine) kullanılması önerilir. jQuery anahtar kodu ve kodu normalleştirir (eski tarayıcılarda kullanılır)
DMTintner

1
@DMTintner: aynı konuda, Jordan Brough tarafından bırakılan yoruma bakın stackoverflow.com/a/1160109/759452
Adrien Be

8
Her zaman kullanmalısın ===.
pmandell

211

keydownOlay Escape cezasını çalışmak ve kullanmak için izin yararı vardır edecek keyCodetüm tarayıcılarda. Ayrıca, dinleyiciyi documentvücuda değil de bağlamanız gerekir .

Mayıs 2016 Güncellemesi

keyCodeşu anda kullanımdan kaldırılıyor ve çoğu modern tarayıcı keyözelliği şimdi sunuyor, ancak şimdilik iyi tarayıcı desteği için bir geri dönüşe ihtiyacınız olacak (Chrome ve Safari'nin mevcut sürümlerini yazarken desteklemiyor).

Eylül 2018 Güncellemesi evt.key artık tüm modern tarayıcılar tarafından destekleniyor.

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
Ayrıca, dinleyiciyi bir <input>öğeye de ekleyebilirsiniz ve bu nedenle yalnızca bu öğenin odağı olduğunda tetiklenir.
Mike

1
@Ranmocy: Ne tür bir unsur ('test' kimliğine sahip)? Yalnızca odak alabilen öğeler (form girişleri, içerik düzenlenebilir öğeler, tabindex setine sahip öğeler) ateş tuşu olayları.
Tim Down

1
Kullanımdan if (evt.key === 'Escape') {kaldırılmış yerine kullanmak da kontrol edebilirsinizkeyCode
Keysox

1
@tobymackenzie: Öyle. Harika değil mi? Standartlara dayalı web geliştirmenin cesur yeni dünyasına hoş geldiniz.
Tim Down

1
Güvenli bir şekilde kullanıp kullanamayacağınızı öğrenmek istiyorsanız .key, bkz. Caniuse.com/#feat=keyboardevent-key
Jasper de Vries


17

denetlemek keyCode&& which& keyup||keydown

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

Bu işe yaramaz görüyorum, jsfiddle.net/GWJVt sadece kaçış için ... garip görünüyor?
Reigel

$ (document.body) .keypress () ateş etmiyor
Mithun Sreedharan

@ Reigel: gerçekten, tuşa basma ile düzgün çalışmıyor gibi görünüyor. Ne olursa olsun, 'garip' kısmı anlayamıyorum.
jAndy

3
Tuşa basıldığında, KeyPress karakter tuşları için (karakter olmayan tuşlar için de yükseltilen KeyDown ve KeyUp'ın aksine) yükseltilir.
Marta

7

Bunun için işlev yapmanın en iyi yolu

İŞLEVİ:

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

MİSAL:

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

4
Aslında, keypresskaçış anahtarına ateş etmiyor gibi görünüyor . En azından Mac'te Chrome'da değil.
samson

1
Bu geri bildirim için teşekkürler, bir güncelleme ve değişiklik kuralı belirledim. keydownsorunu çöz.
Ivijan Stefan Stipić

'Yalnızca bir kez' kullanımı destekleyebilmek için çözümünüzü güncelledim. İşte bir örnek: jsfiddle.net/oxok5x2p .
dh

6

Aşağıda sadece ESC anahtarını devre dışı bırakmakla kalmayıp aynı zamanda basıldığı durumu da kontrol eden kod ve duruma bağlı olarak eylemi gerçekleştirecek veya etmeyecek.

Bu örnekte,

e.preventDefault();

ESC tuş basma eylemini devre dışı bırakır.

Bununla bir div'ı gizlemek gibi bir şey yapabilirsiniz:

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

ESC tuşuna basıldığında da dikkate alınır:

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

Eğer herkese uygulamak istiyorsanız, koşul kısmı varsa bunu kaldırabilirsiniz. Veya bu eylemi yalnızca imleç giriş kutusundayken uygulamak için INPUT hedefleyebilirsiniz.

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

en basit yol vanilya javascript olduğunu düşünüyorum:

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

6
Benim krom (Sürüm 55.0.2883.95 (64-bit)) ben almak Escapeolarak event.keydeğil, 27
MosheZada

Bu olmalı event.keyCode27. olmaya
Jens Tornell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.