Myślałem, że odpowiedź na to pytanie znajdzie się gdzieś na Stack Overflow, ale nie mogę tego znaleźć.
Jeśli oczekuję zdarzenia naciśnięcia klawisza, czy powinienem używać .keyCode
lub .which
ustalić, czy naciśnięto klawisz Enter?
Zawsze robiłem coś takiego:
$("#someid").keypress(function(e) {
if (e.keyCode === 13) {
e.preventDefault();
// do something
}
});
Ale widzę przykłady, które używają .which
zamiast .keyCode
. Co za różnica? Czy jedno jest bardziej przyjazne dla różnych przeglądarek niż drugie?
javascript
jquery
ScottE
źródło
źródło
Odpowiedzi:
Uwaga: Odpowiedź poniżej została napisana w roku 2010. Tutaj wiele lat później, zarówno
keyCode
iwhich
są przestarzałe na rzeczkey
(dla klucza logicznego) orazcode
(w przypadku fizycznego umieszczenia klucza). Ale zauważ, że IE nie obsługujecode
, a jego obsługakey
oparta jest na starszej wersji specyfikacji, więc nie jest całkiem poprawna. Gdy piszę to, obecny Edge oparty na EdgeHTML i Chakra też nie obsługujecode
, ale Microsoft wprowadza na Blink - i V8 zamiennik Edge'a, który prawdopodobnie tak / będzie.Niektóre przeglądarki używają
keyCode
, inne używająwhich
.Jeśli używasz jQuery, możesz niezawodnie używać,
which
ponieważ jQuery standaryzuje rzeczy ; Więcej tutaj.Jeśli nie używasz jQuery, możesz to zrobić:
Lub alternatywnie:
... która radzi sobie z taką
e.which
ewentualnością0
(przywracając ją0
na końcu za pomocą niezwykle potężnego||
operatora JavaScript ).źródło
var key = event.which || event.keyCode;
który będzie używany,event.which
jeśli jest zdefiniowany, a nie falsey, lubevent.keyCode
jeśliwhich
jest niezdefiniowany lub falsey. Technicznie prawdopodobnie powinienem to zrobić,var key = typeof event.which === "undefined" ? event.keyCode : event.which;
ale jeśli takevent.which
jest0
(czy to możliwe0
?), Raczej nie dbam o rzeczy, które robię.which
, co, jak sądzę, jest zapewnione tylko przez jQuery, ale nie jestem w 100% pewien, ale powinien zacząć od zobaczenia różnice w przeglądarkach)which
jest przewidzianykeypress
przez wszystkie przeglądarki oprócz IE. Tryb quirksmode nie jest tutaj autorytatywny. Jako odniesienie, link opublikowany przez @TJ Crowder jest znacznie lepszy: unixpapa.com/js/key.html .which
może wynosić zero, co może mieć duże znaczenie dla większości aplikacji. Na przykład klucze niedrukowalne w przeglądarce Firefox mająwhich
właściwość zero i taką samąkeyCode
właściwość jakkeydown
. Klawisz Home makeyCode
na moim komputerze 36 znaków w Firefoksie, który jest kodem znaków dla „$”, co uniemożliwiłoby rozróżnienie między naciśnięciem klawisza Home a użytkownikiem wpisującym znak $event.which || event.keyCode
.jQuery normalizuje się w
event.which
zależności od tegoevent.which
,event.keyCode
czyevent.charCode
jest obsługiwana przez przeglądarkę:Dodatkową zaletą
.which
jest to, że jQuery robi to również dla kliknięć myszką:źródło
var key = event.which || event.charCode || event.keyCode
event.wich == null && ...
test na wartość zerową lub tylko niezdefiniowaną. twójevent.wich || ...
test na fałsz (niezdefiniowany, zerowy, fałszywy, 0, '' itd.)0
. I nie sądzę, żeby sprawdzać""
czy[]
boli.Jeśli korzystasz z waniliowego Javascript, pamiętaj, że keyCode jest już nieaktualny i zostanie usunięty:
https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
Zamiast tego użyj: .key lub .code w zależności od pożądanego zachowania: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code https://developer.mozilla.org/en -US / docs / Web / API / KeyboardEvent / key
Oba są zaimplementowane w nowoczesnych przeglądarkach.
źródło
key
zamiastcode
. Na przykład, jeśli masz klawiaturę z klawiszami sterowania multimediami, naciśnięcie przycisku Odtwarzaj / Wstrzymaj powoduje wyświetlenie „MediaPlayPause” dlakey
i „” dlacode
.spójrz na to: https://developer.mozilla.org/en-US/docs/Web/API/event.keyCode
W przypadku naciśnięcia klawisza wartość Unicode wciśniętego klawisza jest przechowywana we właściwości keyCode lub charCode, nigdy w obu przypadkach. Jeśli naciśnięty klawisz generuje znak (np. „A”), charCode jest ustawiany na kod tego znaku, z uwzględnieniem wielkości liter. (tzn. charCode bierze pod uwagę, czy klawisz Shift jest wciśnięty). W przeciwnym razie kod naciśniętego klawisza jest zapisywany w keyCode. keyCode jest zawsze ustawiany w zdarzeniach keydown i keyup. W takich przypadkach charCode nigdy nie jest ustawiony. Aby uzyskać kod klucza, niezależnie od tego, czy został zapisany w keyCode czy charCode, zapytaj, która właściwość. Znaki wprowadzone za pomocą edytora IME nie rejestrują się za pomocą keyCode ani charCode.
źródło
Polecam
event.key
obecnie. Dokumenty MDN: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyevent.KeyCode
ievent.which
oba mają nieprzyjemne przestarzałe ostrzeżenia na górze swoich stron MDN:https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode https://developer.mozilla.org/en-US / docs / Web / API / KeyboardEvent / which
W przypadku klawiszy alfanumerycznych
event.key
wydaje się być implementowany identycznie we wszystkich przeglądarkach. W przypadku klawiszy sterujących (tab, enter, escape itp.)event.key
Ma tę samą wartość w Chrome / FF / Safari / Opera, ale inną wartość w IE10 / 11 / Edge (IE najwyraźniej używają starszej wersji specyfikacji, ale pasują do siebie, ponieważ z 14 stycznia 2018 r.).W przypadku klawiszy alfanumerycznych czek wyglądałby następująco:
W przypadku znaków kontrolnych musisz zrobić coś takiego:
Użyłem tutaj tego przykładu do testowania na wielu przeglądarkach (musiałem otworzyć w codepen i edytować, aby uruchomić go z IE10): https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/ kod
event.code
jest wymieniony w innej odpowiedzi jako możliwość, ale IE10 / 11 / Edge nie implementuje go, więc nie działa, jeśli chcesz obsługi IE.źródło
Solidna biblioteka JavaScript do przechwytywania danych z klawiatury i wprowadzonych kombinacji klawiszy. Nie ma zależności.
http://jaywcjlove.github.io/hotkeys/
Klawisze skrótu rozumie następujących wyrażeń:
⇧
,shift
,option
,⌥
,alt
,ctrl
,control
,command
, i⌘
.Następujące klawisze specjalne mogą być wykorzystywane do skrótów:
backspace
,tab
,clear
,enter
,return
,esc
,escape
,space
,up
,down
,left
,right
,home
,end
,pageup
,pagedown
,del
,delete
if1
dziękif19
.źródło
event.keyCode
.W przeglądarce Firefox właściwość keyCode nie działa w przypadku zdarzenia onkeypress (zwraca tylko 0). W przypadku rozwiązania dla różnych przeglądarek użyj właściwości what wraz z keyCode, np .:
źródło