Events - klawisze

keyDown, keyUp

Najczęściej używanymi zdarzeniami w przypadku klawiatury są:

keydown naciśnięcie, przytrzymanie klawisza
keyup puszczenie klawisza

Istnieje też zdarzenie keypress, które jest bardzo podobne do keydown, z tym że działa tylko dla klawiszy graficznych. W dzisiejszych czasach nie jest zalecane używanie tego zdarzenia.

Który klawisz został naciśnięty

Jak w przypadku innych zdarzeń przekazywany do naszej funkcji obiekt udostępnia nam dużo pożytecznych informacji.

Aby odczytać, który klawisz został naciśnięty możemy posłużyć się dwoma właściwościami: event.key oraz event.code.

event.key Nazwa klawisza z uwzględnieniem wielkości liter
event.code Kod klawisza bez uwzględnienia wielkości liter

const input = document.querySelector("#keyTestEvent")
const div = document.querySelector("#keyTestEventShow");

input.addEventListener("keydown", e => {
    div.innerHTML = `
        e.key: <b>${e.key}</b><br>
        e.code: <b>${e.code}</b><br>
        e.keyCode: <b>${e.keyCode}</b>
    `;
});

Niektórzy użytkownicy mogą przełączać się między językami lub układami klawiatury. W takim przypadku event.key zwróci literę która przypisana jest do danego klawisza, natomiast event.code zawsze zwróci ten sam kod fizycznego klawisza.

Mobilna klawiatura

W przypadku klawiatur mobilnych znanych pod nazwą IME (Input-Method Editor), standard W3C wskazuje, że właściwość event.keyCode dla każdego klawisza powinna wynosić 229, natomiast właściwość event.key powinna wynosić "Unidentified". Powinna...

Przetestowałem kilka przeglądarek mobilnych, które miałem pod ręką. Różnie z tym bywało.

input

Korzystanie ze zdarzeń keyUp, keyDown nie zawsze będzie najlepszym wyborem, ponieważ mamy kontrolki, których zawartość możemy zmieniać za pomocą dodatkowych elementów. Dla pola number są to dodatkowe strzałeczki, a dla pola input:search jest to dodatkowy "x", który pojawia się po wpisaniu zawartości do takiego pola. Dla tych pól zdarzenia keydown i keyup nie będzie dobrym wyborem, ponieważ zdarzenia te nie reagują, gdy zawartość pól zmieniamy za pomocą np. strzałeczek.


{
    const input = document.querySelector("#input1");
    const div = document.querySelector("#div1");
    input.addEventListener("keyup", e => {
        div.innerText = input.value;
    })
}

{
    const input = document.querySelector("#input2");
    const div = document.querySelector("#div2");
    input.addEventListener("input", e => {
        div.innerText = input2.value;
    })
}

Sprawdź poniższy przykład w debugerze. Wpisz z palca, lub zmień zawartość strzałeczkami:

Blokowanie wpisywania

Dość częstą sytuacją będzie konieczność zablokowania wpisywania określonych znaków do danego pola. Przykładem może być pole number. W przeglądarce Chrome możemy do niego wpisywać tylko cyfry (plus ich naukowy zapis poprzedzony literą e), natomiast Firefox pozwala wpisywać dowolny znak.

Różne są techniki na rozwiązanie tego problemu. Część z nich lepsza, część gorsza. Poniżej pokaże ci dwie sprawdzone.

Pierwsza z nich polega na sprawdzaniu aktualnej wartości pola (za pomocą wyrażeń regularnych) i w razie błędu cofaniu do poprzedniego stanu. W tym przypadku najlepiej sprawdzi się zdarzenie input.


const input = document.querySelector("input");
const s = Symbol();
input[s] = input.defaultValue; //odkładam poprzednia wartość
input.addEventListener("input", e => {
    if (/^[abcdef]*$/i.test(input.value)) {
        input[s] = input.value;
    } else {
        input.value = input[s];
    }
})

W drugiej technice skorzystamy ze zdarzenia beforeinput. Działa ono podobnie do zdarzenia input, ale dzieje się przed wstawieniem tekstu do pola. Możemy tutaj odczytać dodatkową właściwość data, która wskazuje na wstawianą do pola treść:


const input = document.querySelector("input");
input.addEventListener("beforeinput", e => {
    if (e.data !== null && !/^[abcdef]+$/i.test(e.data)) e.preventDefault();
})
Tylko litery a - f:

Trening czyni mistrza

Jeżeli chcesz sobie potrenować zdobytą wiedzę, zadania znajdują się w repozytorium pod adresem: https://github.com/kartofelek007/zadania

Wszelkie prawa zastrzeżone. Jeżeli chcesz używać jakiejś części tego kursu, skontaktuj się z autorem.
Aha - i ta strona korzysta z ciasteczek.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.