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


559

İki fonksiyonum var. Enter tuşuna basıldığında işlevler doğru çalışır ancak kaçış düğmesine basıldığında çalışmaz. Çıkış anahtarı için doğru sayı nedir?

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

Tuşa basma, bir tuşa bağlı bir karakteri döndürür (doğru büyük harflerle vb.), Keyup basılan donanım düğmesinin sayısını döndürür. ESC için 27 donanım kodunu istersiniz (ascii karakteri 27 değil)
Joeri


İstediğiniz keyCode'u bulmak için gerçekten basit bir hile var. Yeni bir sekme açın, document.addEventListener("keydown", e => console.log(e.keyCode))tarayıcı konsolunuza yerleştirin, pencereye tıklayın ve aradığınız tuşa basın.
anarchist912

Yanıtlar:


925

Keyup etkinliğini deneyin :

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

39
Bunun keyup vs keypress ile ilgisi yoktur. ESCAPE'yi yakalamak için e.keyCode'a e.which (bu örnekte olduğu gibi) yerine bakmanız gerekir.
dkamins

211
"Bunun keyup keypress ile ilgisi yok" - bu yanlış, dkamins. keypress tarayıcılar arasında tutarlı bir şekilde ele alınmıyor gibi görünüyor ( IE vs Chrome vs Firefox'ta api.jquery.com/keypress adresindeki demoyu deneyin - bazen kayıt olmuyor ve hem 'hangi' hem de 'keyCode' değişiyor) oysa keyup tutarlıdır. e. jquery normalleştirilmiş değerdir, bu nedenle 'hangi' veya 'keyCode' her ikisi de keyup'ta çalışmalıdır.
Jordan Brough

13
@Jordan Brough - Yorumunuzu cevap olarak göndermenizi rica ediyorum, böylece insanlar onu okuyor ve yorumunuzun gerçek anlamını anlıyor!
Yorumunuz

15
keydownyerel davranışı taklit eder - en azından bir iletişim kutusunda ESC veya Return tuşuna basmanın tuş bırakılmadan önce eylemi tetikleyeceği Windows'ta.
thomthom

2
@gibberish Yorumumu buraya bir cevap olarak ekledim: stackoverflow.com/a/28502629/58876
Jordan Brough

77

İşlevinizdeki anahtar kod değerlerini sabit kodlamak yerine, anlamınızı daha iyi iletmek için adlandırılmış sabitleri kullanmayı düşünün:

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

Bazı tarayıcılar (FireFox gibi, diğerlerinden emin KeyEventdeğilseniz) bu tür sabitleri sizin için ortaya çıkaran global bir nesne tanımlar . Bu SO sorusu , nesneyi diğer tarayıcılarda tanımlamanın güzel bir yolunu gösterir.


15
Ne, 27 sadece kaçış anahtarı olarak sana atlamak değil mi?!? Dürüst olmak gerekirse, bunun gerçekten daha fazla insan tarafından yapılması gerekiyor. Onlara "sihirli sayılar" ve "sihirli teller" diyorum. 72 ne anlama geliyor? Neden kod tabanınızda 300 kez kopyalanmış çok özel ve geçici bir dize var? vb.
vbullinger

1
Veya her birini yukarıda yorum ekleyebilirsiniz, çünkü bunları yalnızca bir kez kullanıyorsunuzdur. IMO da okunabilir
Ivan Durst

8
@IvanDurst bunları yöntem başına yalnızca bir kez kullanıyor olabilirsiniz , ancak bunları projelerimde birden çok kez kullanıyorum. Gerçekten (1) değerleri aramak ve (2) her anahtar kodu kullanmak istediğinizde yorum yapmak istediğinizi mi öneriyorsunuz? Seni bilmiyorum, ama onları ezberleme arzum ya da diğer programcıların bunları tutarlı bir şekilde yorumlayacağına olan inancım yok. Bu, kodlamayı daha kolay ve daha tutarlı hale getirmekle ilgili, sadece daha okunabilir değil.
Seth Petry-Johnson

2
Ne anlama geldiğini bilen biri, onlara yorum yapmak için anlam aramak zorunda değildir ve bir yorum yazmak, uzun bir ad yazmak kadar hızlıdır.
NetMage

6
Onaltılık karakter sabitlerini kodlarken eski güzel günlere ne oldu? Herkes ESC'nin olduğunu 0x1Bve Enter'ın olduğunu biliyor 0x0D, değil mi?
David R Tribble

42

(Yanıt önceki yorumumdan çıkarıldı )

Bunun keyupyerine kullanmak zorundasınız keypress. Örneğin:

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

keypresstarayıcılar arasında tutarlı bir şekilde ele alınmıyor gibi görünüyor ( IE ile Chrome ve Firefox arasındaki http://api.jquery.com/keypress adresindeki demoyu deneyin . Bazen keypresskaydolmaz ve hem 'hangi' hem de ' keyCode 'değişir), oysa keyuptutarlıdır.

e.whichVs ile ilgili bir tartışma olduğundan e.keyCode: e.whichjquery normalize edilmiş değer ve kullanılması önerilen değer olduğuna dikkat edin:

Event.which özelliği event.keyCode ve event.charCode öğelerini normalleştirir. Etkinliği izlemeniz önerilir. Klavye tuşu girişi için.

( http://api.jquery.com/event.which/ adresinden )


5
Burada ayrıca keypress, kaçış sırasında ateş etmeyen tarayıcıların bunu doğru yaptığını eklemek isterim . keypressyalnızca anahtar bir karakter ürettiğinde ateş ederken, keyupher zaman ateş eder. developer.mozilla.org/tr-TR/docs/Web/Events/keypress
ohcibi

26

Herhangi bir tuşun tuş kodunu bulmak için şu basit işlevi kullanın:

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

14

27çıkış anahtarının kodudur. :)


1
Enter tuşuna basıldığında iki fonksiyonum var, fonksiyonlar doğru çalışıyor ancak çıkış tuşu ile çalışmıyor .. $ (document) .keypress (function (e) {if (e.which == 13) {$ ('. Save'). ();} eğer (e.which == 27) {$ ('. iptal'). ();}}) 'i tıklayın;
Shishant

$ (document) .keypress (işlev (e) {y = e.keyCode? e.keyCode: e.which;}); (Y) 'yi uyartığımda IE ve FF'de 27 uyarıyor. Kodunuzla ilgili başka bir sorun olmadığından emin misiniz?
Salty

14

En iyi bahsiniz

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

özet

  • whichkeyCodenormalleştirildiğinden daha fazla tercih edilir
  • keyupdaha fazla tercih edilir, keydownçünkü kullanıcı basılı tutarsa ​​tuşlar birden çok kez oluşabilir.
  • keypressGerçek karakterleri yakalamak istemiyorsanız kullanmayın .

İlginç bir şekilde Bootstrap, açılan bileşeninde (3.0.2 itibariyle) keydown ve keyCode kullanıyor! Bence orada muhtemelen kötü bir seçim.

JQuery doc'den ilgili snippet

Tarayıcılar bu bilgileri depolamak için farklı özellikler kullanırken, jQuery .which özelliğini normalleştirir, böylece anahtar kodunu almak için güvenilir bir şekilde kullanabilirsiniz. Bu kod, oklar gibi özel tuşların kodları da dahil olmak üzere klavyedeki bir tuşa karşılık gelir. Gerçek metin girişini yakalamak için .keypress () daha iyi bir seçim olabilir.

Diğer ilgi çekici yerler: JavaScript Keypress Library


10

Jescape eklentisini deneyin ( Google Drive'dan indirin )

$(document).escape(function() { 
   alert('ESC button pressed'); 
});

veya çapraz tarayıcı için anahtar kodu alın

var code = (e.keyCode ? e.keyCode : e.which);
if (code === 27) alert('ESC');
if (code === 13) alert('ENTER');

belki anahtarı kullanabilirsiniz

var code = (e.keyCode ? e.keyCode : e.which);
switch (code) {
    case 27:
       alert('ESC');
       break;
     case 13:
       alert('ENTER');
       break;
}

8

Kodunuz iyi çalışıyor. Büyük olasılıkla odaklanmamış pencere. Benzer bir işlevi iframe kutularını vb. Kapatmak için kullanıyorum.

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

Ben de aynı şeyi yapmaya çalışıyordum ve boktan beni rahatsız ediyordu. Firefox'ta, kaçış tuşuna basıldığında bazı şeyler yapmaya çalışırsanız, kaçış anahtarını işlemeye devam eder ve daha sonra yapmaya çalıştığınız her şeyi iptal eder. Uyarı iyi çalışıyor. Ama benim durumumda, işe yaramayan tarihe geri dönmek istedim. Sonunda, olayın yayılmasını aşağıda gösterildiği gibi durmaya zorlamak zorunda olduğumu anladım ...

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

Diğer cevapların nerede olmadığını açıklamak için; sorun sizin kullanımınızdır keypress.

Belki de olay sadece yanlış adlandırılmıştır, ancak keypressne zaman başlayacağı tanımlanmıştır . Yani metin. Oysa ne istediğinizi / , ne zaman (sırasıyla önce veya sonra) ateş . Yani klavyedeki şeyler.when an actualcharacteris being inserted
keydownkeyupthe user depresses akey

Buradaki fark escbir kontrol karakteri (kelimenin tam anlamıyla 'yazdırılmayan karakter') olduğu için görünür ve böylece herhangi bir metin yazmaz, bu nedenle ateşlenmez keypress.
entertuhaftır, çünkü bunu bir kontrol karakteri olarak kullanmanıza rağmen (yani kullanıcı arayüzünü kontrol etmek için), yine de tetiklenecek yeni bir satır karakteri ekler keypress.

Kaynak: quirksmode


1
Spec okumak için Kudos! Bu kesin kabul edilen cevap olmalı :)
DylanYoung

7

Tüm karakterlerin onaltılı kodunu almak için: http://asciitable.com/


2
Söyleyecektim ... Bu sitenin arama sonuçlarının en üstünde olmasından nefret ediyorum çünkü çok çirkin, ama gerekli bilgileri aktarıyor.
mpen

1
Olay ve tarayıcıya bağlı olarak, anahtar kodlarının her zaman ascii tablolarıyla eşleşmediğini unutmayın.
Alan H.

2
downvote: soruyu cevaplamıyor, soruyu bile ele almıyor, hex'in soru ile ilgisi yok ve OP zaten esc == 27 bilgisini gösterdi.
Jeremy

7

e.keyCodeMDN'de DEPRECATED olarak kabul edilenden daha güncel bir yanıt yayınlamanız yeterlidir .

Bunun e.keyyerine, her şey için temiz isimleri destekleyen hangisini tercih etmelisiniz . İşte ilgili kopya makarna

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
Ancak yalnızca Firefox ve Chrome'da destekleniyor gibi görünüyor.
Gayan Weerakutti


Ne yazık ki, Internet Explorer'ın en azından bazı sürümleri kodu Escstandarttan ziyade geçirir Escape.
Robin Stewart

6

Girilen klavye girişini ve tuş kombinasyonlarını yakalamak için sağlam bir Javascript kütüphanesi. Bağımlılığı yoktur.

http://jaywcjlove.github.io/hotkeys/

hotkeys('enter,esc', function(event,handler){
    switch(handler.key){
        case "enter":$('.save').click();break;
        case "esc":$('.cancel').click();break;
    }
});

: kısayol tuşları aşağıdaki değiştiricileri anlar , shiftoptionaltctrlcontrolcommandve .

Aşağıdaki özel tuşlar kısayollar için kullanılabilir: backspacetab, clear, enter, return, esc, escape, space, up, down, left, right, home, end, pageup, pagedown, del, deleteve f1içinden f19.


5

Ben her zaman kaçış anahtarını yakalamak için keyup ve e.


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.