Oto, co mam teraz:
$("input").bind("keydown",function(e){
var value = this.value + String.fromCharCode(e.keyCode);
}
Jeśli e.keyCode
nie może być znaków ASCII ( Alt, backspace, del, arrows., Etc) ... I teraz trzeba by trim
tych wartości ze value
jakoś (najlepiej programowo - nie z tabel odnośników).
Używam jQuery.
Muszę skorzystać z keydown
wydarzenia. keyPress
nie aktywuje dla niektórych klawiszy muszę wychwytywania ( Esc, del, backspace, itd.).
Nie mogę użyć setTimeout
do uzyskania wartości danych wejściowych. setTimeout(function(){},0)
jest zbyt wolny.
javascript
jquery
special-characters
keycode
David Murdoch
źródło
źródło
keydown
do przechwytywania kodów znaków? Czeka cię piekielna przejażdżka: quirksmode.org/js/keys.html (wskazówka: użyjkeypress
!! )document.onkeydown = function(e){ console.log('Key: ' + e.key); }
Odpowiedzi:
Może nie zrozumiałem poprawnie pytania, ale czy nie możesz użyć,
keyup
jeśli chcesz uchwycić oba wejścia?źródło
Z mojego doświadczenia nie
String.fromCharCode(e.keyCode)
można polegać.String.fromCharCode
oczekuje znaków Unicode jako argumentu;e.keyCode
zwraca kody kluczy javascript. Kody klawiszy JavaScript i kody znaków Unicode to nie to samo! W szczególności klawisze numeryczne zwracają coś innegokeycode
niż zwykłe klawisze numeryczne (ponieważ są to różne klawisze), podczas gdy to samokeycode
jest zwracane dla obuupper
ilowercase
liter (nacisnąłeś ten sam klawisz w obu przypadkach), mimo że mają różnecharcodes
.Na przykład zwykły klawisz numeryczny 1 generuje zdarzenie z
keycode
49, podczas gdy klawisz numeryczny 1 (z Numlockwłączonym) generujekeycode
97. Użyty razem zString.fromCharCode
otrzymujemy:String.fromCharCode
oczekuje kodów znaków Unicode, a nie kodów javascript. Klawisz ageneruje zdarzenie zkeycode
wartością 65, niezależnie od wielkości litery, jaką by wygenerował (jest też modyfikator dla tego, czy Shiftklawisz jest wciśnięty, itp. W zdarzeniu). Znak ama unicodecharcode
z 61, podczas gdy postać Amacharcode
41 (w zależności, na przykład, http://www.utf8-chartable.de/ ). Są to jednakhex
wartości, po przeliczeniu na dziesiętne otrzymujemycharcode
65 dla „A” i 97 dla „a”. [1] Jest to zgodne z tym, z czego otrzymujemyString.fromCharCode
te wartości.Moje własne wymaganie ograniczało się do przetwarzania liczb i zwykłych liter (akceptowanie lub odrzucanie w zależności od pozycji w ciągu) i przepuszczanie znaków sterujących ( F-klucze, -coś Ctrl). W ten sposób mogę sprawdzić znaki kontrolne, jeśli nie jest to znak kontrolny, sprawdzam zakres i dopiero wtedy muszę uzyskać właściwy znak. Biorąc pod uwagę, że nie martwię się wielkością liter (i tak zmieniam wszystkie litery na duże) i już ograniczyłem zakres kodów, muszę się tylko martwić o klawisze numeryczne. Do tego wystarczą:
Mówiąc bardziej ogólnie, funkcja niezawodnego zwracania znaku z a
charcode
byłaby świetna (może jako wtyczka jQuery), ale nie mam czasu, aby ją teraz napisać. Przepraszam.Wspomniałbym również
e.which
(jeśli używasz jQuery), który normalizujee.keyCode
ie.charCode
, abyś nie musiał się martwić o to, jaki klawisz został naciśnięty. Problem z połączeniem go zString.fromCharCode
resztkami.[1] Przez chwilę byłem zdezorientowany -. wszyscy doktorzy mówią, że
String.fromCharCode
oczekuje Unicodecharcode
, podczas gdy w praktyce wydawało się, że działa dla znaków ASCII, ale myślę, że było to spowodowane koniecznością konwersji na dziesiętne z szesnastkowego, w połączeniu z faktem, że znaki ASCII i dziesiętne znaki Unicode nakładają się na zwykłe litery łacińskie.źródło
keyCode
to, aby wiedzieć, który klawisz został naciśnięty, a nie wiedzieć, jakiego znaku użyć. Na przykład „U” na klawiaturze Dvoraka ma ten sam kod, co „F” na klawiaturze QWERTY lub „ㄹ” na klawiaturze koreańskiej itp. Chodzi o to, aby nie konwertować go na znak, jest on po to, aby można było łatwo mapować elementy do pozycji klawiatury.Czytelne nazwy kluczy indeksowane według kodu klucza
Istnieje stosunkowo niewiele kodów kluczy, więc po prostu wymieniłem wszystkie odpowiadające im wartości w tablicy statycznej, aby po prostu przekonwertować liczbę
65
naA
użyciekeyboardMap[65]
Nie wszystkie kody klucza są odwzorowywane na znak drukowalny, więc zwracany jest inny możliwy do zidentyfikowania ciąg.
Być może będziesz musiał zmodyfikować tablicę, aby odpowiadała twoim potrzebom i możesz po prostu zwrócić puste ciągi dla wszystkich znaków, których nie chcesz tłumaczyć. Poniższa tablica pozwala mi szybko i niezawodnie określić, który klawisz został naciśnięty w dowolnym środowisku. Cieszyć się!
Wypróbuj następujący fragment kodu, korzystając z tego statycznego podejścia do wyszukiwania tablic ...
Pokaż fragment kodu
Kluczowe kody, na które warto zwrócić uwagę
Litery AZ: (65-90)
Cyfry 0-9: (48-57)
Klawiatura numeryczna 0-9: (96-105)
Klawisze strzałek: (37-40)
Klawisz Tab: (9)
Wprowadź klucz: (13)
Klawisz spacji: (32)
Klucz specyficzny dla systemu operacyjnego (91) Klawisz Windows (Windows) lub klawisz Command (Mac)
Klawisz Alt: (18)
Klawisz sterujący: (17)
Klawisz Shift: (16)
Klawisz Caps Lock: (20)
źródło
Ważna uwaga: zaakceptowana powyżej odpowiedź nie będzie działać poprawnie dla keyCode> = 144, tj. Kropka, przecinek, myślnik itp. Dla tych, którzy powinniście użyć bardziej ogólnego algorytmu:
Jeśli ciekawi Cię dlaczego, jest to najwyraźniej konieczne ze względu na zachowanie wbudowanej funkcji JS
String.fromCharCode()
.keyCode <= 96
Wydaje się, że dla jego wartości można mapować za pomocą funkcji:chrCode = keyCode - 48 * Math.floor(keyCode / 48)
keyCode > 96
Wydaje się, że dla jego wartości można mapować za pomocą funkcji:chrCode = keyCode
Jeśli wydaje się to dziwne zachowanie, to cóż… Zgadzam się. Niestety, byłoby to bardzo dalekie od najdziwniejszej rzeczy, jaką widziałem w rdzeniu JS.
źródło
let
w odpowiedzi na pytanie z 2009 roku. :-)let
to zrobiłem mu przysługę ;-)Zakładam, że dotyczy to gry lub aplikacji szybko reagujących, stąd użycie KEYDOWN niż KEYPRESS.
Edycja : Cholera! Stoję poprawione (dziękuję Crescent Fresh i Davidowi): JQuery (a raczej bazowe hosty DOM) nie ujawniają szczegółów WM_KEYDOWN i innych zdarzeń. Raczej wstępnie przetrawiają te dane, aw przypadku keyDown nawet w JQuery otrzymujemy:
Zauważ, że te właściwości są wartościami UniCode.
Uwaga, nie mogłem znaleźć autorytatywnego odniesienia do tego w dokumentach JQuery, ale wiele renomowanych przykładów w sieci odnosi się do tych dwóch właściwości.
Poniższy kod, zaadaptowany z mojego java (nie javascript), jest zatem całkowicie błędny ...
Poniżej znajdziesz „interesujące” części kodu:
źródło
keydown
lub nie).Wiem, że to stare pytanie, ale natknąłem się na nie dzisiaj, szukając gotowego rozwiązania tego problemu, i nie znalazłem nic, co naprawdę odpowiadałoby moim potrzebom.
Oto rozwiązanie (tylko w języku angielskim), które poprawnie obsługuje wielkie litery (przesunięte), małe litery, znaki interpunkcyjne, klawiaturę numeryczną itp.
Pozwala również na prostą i bezpośrednią identyfikację - i reakcję na - niedrukowalne klawisze, takie jak ESC, strzałki, klawisze funkcyjne itp.
https://jsfiddle.net/5hhu896g/1/
Dziękuję DaveAlgerowi za zaoszczędzenie mi trochę pisania - i wiele odkryć! - dostarczając tablicę nazwanych kluczy.
źródło
Niedawno napisałem w moduł keysight który tłumaczy
keypress
,keydown
orazkeyup
wydarzenia na znaki i klucze odpowiednio.Przykład:
źródło
Dla tych z Was, którzy przybyli tutaj, szukając rzeczywistych wartości znaków Unicode dla kodu klucza, tak jak ja, oto funkcja do tego. Na przykład, biorąc pod uwagę kod unicode ze strzałką w prawo, zwróci to widoczny ciąg
\u001B\u005B\u0043
źródło
Możesz również użyć właściwości tylko do odczytu
key
. Szanuje również klawisze specjalne, takie jakshift itp. I jest obsługiwany przez IE9.Po naciśnięciu niedrukowalnego lub specjalnego znaku, wartość będzie jedną ze zdefiniowanych wartości klucza, takich jak
'Shift'
lub'Multiply'
.event.key
'x'
'X'
'F5'
źródło
Skorzystaj z tego linku Uzyskaj kod klucza z naciśnięcia klawisza i wartości znaku dla dowolnego kodu klucza
źródło