.keyCode ve .which karşılaştırması


228

Bunun Stack Overflow'da bir yerde cevaplanacağını düşündüm, ama bulamıyorum.

Bir tuşa basma olayı dinliyorsam Enter tuşuna basıp basılmadığını belirlemek için .keyCodeveya .whichtuşunu kullanmalı mıyım?

Her zaman aşağıdaki gibi bir şey yaptım:

$("#someid").keypress(function(e) {
  if (e.keyCode === 13) {
    e.preventDefault();
    // do something
  }
});

Ama .whichbunun yerine kullanılan örnekleri görüyorum .keyCode. Fark ne? Çapraz tarayıcılardan biri diğerinden daha kolay mı?


Yanıtlar:


209

Not: Cevap aşağıda sonradan 2010. Burada uzun yıllar yazılmış, hem keyCodeve whichlehine artık kullanılmamaktadır key(mantıksal anahtar için) ve code(anahtarın fiziksel yerleşimi için). Ancak IE'nin desteklemediğini codeve desteğinin keydaha eski bir sürümüne dayandığını unutmayın, bu yüzden oldukça doğru değildir. Ben bu satırları yazarken, EdgeHTML ve Çakra göre geçerli Kenar desteklemez codeya, ama Microsoft, yayıyoruz Blink - ve V8 / tahminen yapar Edge için esaslı değiştirme, olacak -.


Bazı tarayıcılar kullanır keyCode, bazıları kullanır which.

JQuery kullanıyorsanız which, jQuery işleri standartlaştırdığı için güvenle kullanabilirsiniz ; Daha fazla burada.

JQuery kullanmıyorsanız bunu yapabilirsiniz:

var key = 'which' in e ? e.which : e.keyCode;

Veya alternatif olarak:

var key = e.which || e.keyCode || 0;

... bu e.whichda 0( olasılıkla JavaScript'in merak uyandırıcı güçlü operatörünü0 kullanarak geri yükleme ) olabilir.||


2
Teşekkürler TJ Bunun için bir referans nerede bulabilirim? Sana inanmadığım için değil, sadece merak ediyorum! ... bunu eklediğini görüyorum, teşekkürler. Yani, jquery kullanmayanlar için bile, daha iyi bir seçim hangisidir?
ScottE

7
@ScottE: jQuery kullanmıyorsanız, bunu kendiniz açıkça ele almalısınız. Genellikle böyle yapmak var key = event.which || event.keyCode;kullanacak Yani event.whicho tanımlanmış olup Falsey eğer, ya event.keyCodeeğer whichtanımlanmamış veya Falsey edilir. Teknik olarak muhtemelen yapmalıyım var key = typeof event.which === "undefined" ? event.keyCode : event.which;ama eğer event.whicholduğunu 0(o olabilir 0?), Yapmam şeylerin türlü bakımı için olası değildir.
TJ Crowder

2
@ScottE, işte temel bir referans: quirksmode.org/js/keys.html (içermiyor which, bence sadece jQuery tarafından sağlanıyor, ancak% 100 emin değilim, ama görmeye başlamanız gerekiyor tarayıcılarındaki farklılıklar)
Mottie

1
@fudgey: IE dışındaki tüm tarayıcılar tarafından whichsağlanır keypress. Ve tuhaflık burada yetkili değil. Referans olarak, @TJ Crowder'ın gönderdiği bağlantı çok daha iyidir: unixpapa.com/js/key.html .
Tim Down

5
@TJ Crowder: Evet, etkinliğin whichözelliği sıfır olabilir ve bu çoğu uygulama için büyük bir fark yaratabilir. Örneğin, Firefox'ta yazdırılamayan anahtarlar whichsıfır özelliğe ve aynı keyCodeözelliğe sahiptir keydown. Home tuşu, keyCodeFirefox'taki bilgisayarımda "$" için karakter kodu olan 36'dan bir tanesine sahiptir, bu da Ana Ekran tuşuna basan kullanıcı ile bir $ karakteri yazan kullanıcı arasında ayrım yapmayı imkansız hale getirir event.which || event.keyCode.
Tim Down

32

jQuery normale döner event.whichbağlı olarak event.which, event.keyCodeya da event.charCodetarayıcı tarafından desteklenir:

// Add which for key events
if ( event.which == null && (event.charCode != null || event.keyCode != null) ) {
   event.which = event.charCode != null ? event.charCode : event.keyCode;
}

Ek bir avantajı, .whichjQuery'nin fare tıklamaları için de yapmasıdır:

// Add which for click: 1 === left; 2 === middle; 3 === right
// Note: button is not normalized, so don't use it
if ( !event.which && event.button !== undefined ) {
    event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) ));
}

2
var key = event.which || event.charCode || event.keyCode
Anne van Rossum

@ anne-van-rossum, event.wich == null && ...yalnızca null veya undefined için test edin. sizin event.wich || ...için bir test falsy (tanımsız, boş, Yanlış, 0 '', vs)
aMarCruz

@ aMarCruz Falsy bilerek. Örneğin bugs.webkit.org/show_bug.cgi?id=16735 Webkit raporlama ile 0. Ve kontrol etmeyi ""ya da []acıtmayı düşünmüyorum .
Anne van Rossum

20

Vanilya Javascript'te kalıyorsanız, keyCode'un artık kullanımdan kaldırıldığını ve bırakılacağını lütfen unutmayın:

Bu özellik Web standartlarından kaldırıldı. Bazı tarayıcılar yine de destekleyebilse de, bırakılma aşamasındadır. Kullanmaktan kaçının ve mümkünse mevcut kodu güncelleyin; kararınızı yönlendirmek için bu sayfanın altındaki uyumluluk tablosuna bakın. Bu özelliğin herhangi bir zamanda çalışmayı bırakabileceğini unutmayın

https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode

Bunun yerine , istediğiniz davranışa bağlı olarak : .key veya .code kullanın : https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code https://developer.mozilla.org/en -ABD / docs / Web / API / KeyboardEvent / anahtar

Her ikisi de modern tarayıcılarda uygulanır.


.code , klavyedeki tuşun fiziksel konumuna karşılık gelirken, .key , konumdan bağımsız olarak basılan tuş tarafından üretilen karaktere karşılık gelir.
Christopher

1
Hem 'kod' hem de 'anahtar'ın modern tarayıcılarda tuhaflıkları var. Farklı tarayıcılarda MDN developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code üzerinde "Deneyin" örneğini kullanmak IE11 / IE Edge'in 'kod' ve 'anahtar' uygulamadığını gösterir uygulama, Chrome / FF / Safari'deki uygulama ile eşleşmiyor (farklılıklar çoğunlukla Escape ve Enter gibi kontrol karakterlerinde görünüyor). Bence bu kaprisleri kendiniz hesaplamak istemiyorsanız kütüphane kullanmak en kolay yol olabilir. Bunun cevap olmasını gerçekten istiyorum, ama IE bunu berbat ediyor :-(
Akrikos

Hmm ... aslında anahtarı çapraz tarayıcı yöntemiyle uygulamak çok kötü görünmüyor. Düzenli alfasayısal tuşlar yalnızca değerlerini döndürür ve spesifikasyonun eski bir sürümünü uygulayan IE11 / Edge dışında çoğu tarayıcıda aynı şekilde uygulanan kontrol tuşları (kaçış, enter, sekme vb.) Görüntülenir, bu nedenle en azından her biri için yalnızca iki olası değer vardır. tuşuna basın.
Akrikos

Bunun keyyerine kullanmayı tavsiye ederim code. Örneğin, medya kontrol tuşlarına sahip bir klavyeniz varsa Oynat / Duraklat düğmesine basıldığında "MediaPlayPause" keyve "" için çıktılar code.
thdoan

6

şuna bak: https://developer.mozilla.org/en-US/docs/Web/API/event.keyCode

Bir keypress olayında, basılan anahtarın Unicode değeri keyCode veya charCode özelliğinde saklanır, asla ikisinde birden saklanmaz. Basılan tuş bir karakter üretirse (örn. 'A'), charCode, harf büyüklüğüne uygun olarak bu karakterin koduna ayarlanır. (yani charCode, shift tuşunun basılı olup olmadığını dikkate alır). Aksi takdirde, basılan tuşun kodu keyCode içinde saklanır. keyCode her zaman keydown ve keyup olaylarında ayarlanır. Bu durumlarda, charCode asla ayarlanmaz. KeyCode veya charCode içinde depolanmış olmasına bakılmaksızın anahtarın kodunu almak için hangi özelliği sorgulayın. IME aracılığıyla girilen karakterler keyCode veya charCode aracılığıyla kaydedilmez.


6

event.keyŞu anda tavsiye ederim . MDN dokümanları: https://developer.mozilla.org/tr-TR/docs/Web/API/KeyboardEvent/key

event.KeyCodeve event.whichher ikisinin de MDN sayfalarının üstünde kötü uyarılar var:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode https://developer.mozilla.org/en-US / docs / Web / API / KeyboardEvent / hangi

Alfasayısal tuşlar için, event.keytüm tarayıcılarda aynı şekilde uygulandığı görülmektedir. Kontrol tuşları (sekme, enter, escape vb.) İçin event.keyChrome / FF / Safari / Opera'da aynı değere sahiptir, ancak IE10 / 11 / Edge'de farklı bir değere sahiptir (IE'ler görünüşe göre spesifikasyonun eski bir sürümünü kullanır, ancak birbiriyle eşleşir) 14 Ocak 2018).

Alfasayısal tuşlar için bir kontrol şöyle görünecektir:

event.key === 'a'

Kontrol karakterleri için aşağıdakine benzer bir şey yapmanız gerekir:

event.key === 'Esc' || event.key === 'Escape'

Burada örneği birden çok tarayıcıda test etmek için kullandım (IE10 ile çalışabilmek için kod alanında açıp düzenlemek zorunda kaldım): https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/ kod

event.code olasılık olarak farklı bir cevapta belirtilmiştir, ancak IE10 / 11 / Edge bunu uygulamamaktadır, bu yüzden IE desteği istiyorsanız dışarıdadır.


2

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('ctrl+a,ctrl+b,r,f', function(event,handler){
    switch(handler.key){
        case "ctrl+a":alert('you pressed ctrl+a!');break;
        case "ctrl+b":alert('you pressed ctrl+b!');break;
        case "r":alert('you pressed r!');break;
        case "f":alert('you pressed f!');break;
    }
});

kısayol tuşları aşağıdaki değiştiricileri anlar: , shift, option, , alt, ctrl, control, command, ve .

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


Yine de Array.prototype.indexOf'u shim yapar, bu yüzden bunu başka bir kütüphanede kullanıyorsanız, global kapsamı değiştirdiği için uygun olmayabilir. Ayrıca kullanımdan kaldırılmış gibi görünüyor event.keyCode.
Akrikos

Bu kütüphane Vaio dizüstü bilgisayarımda Fn tespit etmedi.
thdoan

0

Firefox'ta, keyCode özelliği onkeypress olayında çalışmaz (yalnızca 0 döndürür). Çapraz tarayıcı çözümü için keyCode ile birlikte hangi özelliği kullanın, örn:

var x = event.which || event.keyCode;  // Use either which or keyCode, depending on browser support
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.