2009-09-09 16 views
376

Jak uzyskać powiązanie funkcji z lewymi i prawymi strzałkami w JavaScript i/lub jQuery? Spojrzałem na wtyczkę js-hotkey dla jQuery (zawija wbudowaną funkcję bind, aby dodać argument rozpoznawania określonych kluczy), ale nie obsługuje klawiszy strzałek.Wiążące klawisze strzałek w JS/jQuery

Odpowiedz

476
$(document).keydown(function(e) { 
    switch(e.which) { 
     case 37: // left 
     break; 

     case 38: // up 
     break; 

     case 39: // right 
     break; 

     case 40: // down 
     break; 

     default: return; // exit this handler for other keys 
    } 
    e.preventDefault(); // prevent the default action (scroll/move caret) 
}); 

umieścić swój kod niestandardowy dla klawiszy strzałek pomiędzy odpowiadającymi case i break linii.

e.which jest znormalizowany przez jQuery, więc działa we wszystkich przeglądarkach. Dla czystego podejścia JavaScript, wymienić pierwsze z dwóch linii:

document.onkeydown = function(e) { 
    e = e || window.event; 
    switch(e.which || e.keyCode) { 


(edycja 2017)
Jeśli czujesz fantazyjne, można wykorzystać e.key zamiast e.which lub e.keyCode teraz. e.key staje się zalecanym standardem, umożliwiając sprawdzanie ciągów znaków: 'ArrowLeft', 'ArrowUp', 'ArrowRight', 'ArrowDown'. Nowe przeglądarki obsługują je natywnie, check here.

+27

Zdecydowanie najlepszą odpowiedzią. Używa 'e., Który' jak jQuery zaleca dla przeglądarki, używa 'e.preventDefault()' zamiast 'return false' (' return false' na module obsługi zdarzeń jQuery wyzwala zarówno 'e.preventDefault()' jak i 'e .stopPropagation() ', z których druga spowoduje niepowodzenie późniejszych dodanych zdarzeń, ponieważ zdarzenie nie będzie się do nich propagować), a na końcu przełącznika zwróci * bez * wywoływania' e.preventDefault () 'jeśli jest to jakikolwiek inny klucz niż te, których szukania nie przeszkadza użycie innego klucza, a zamiast' $ .ui.keyCode.DOWN' porównuje się do liczb (DUŻO szybciej). –

+0

Gdzie znajdziesz te kluczowe kody? –

+2

Nathan: wygląda na to, że nie wszystkie kody klawiszy są zgodne między przeglądarkami, ale klawisze strzałek to tylko niektóre z nich. Zobacz tutaj: http://stackoverflow.com/questions/5603195/full-list-of-javascript-keycodes – Sygmoral

441
$(document).keydown(function(e){ 
    if (e.keyCode == 37) { 
     alert("left pressed"); 
     return false; 
    } 
}); 

kody Charakter:

37 - left

38 - up

39 - right

40 - down

+4

Czy istnieje jakiś cel w zamian? –

+18

Zatrzymuje wszelkie kolejne uderzenia keydown. –

+1

O rację ... Właśnie napisałem to za pomocą przełącznika i zrywałem. –

100

Można używać keyCode z klawiszy strzałek (37, 38, 39 i 40 w lewo, w górę, w prawo iw dół):

$('.selector').keydown(function (e) { 
    var keyCode = e.keyCode || e.which, 
     arrow = {left: 37, up: 38, right: 39, down: 40 }; 

    switch (keyCode) { 
    case arrow.left: 
     //.. 
    break; 
    case arrow.up: 
     //.. 
    break; 
    case arrow.right: 
     //.. 
    break; 
    case arrow.down: 
     //.. 
    break; 
    } 
}); 

Sprawdź powyższy przykład here.

+1

Nie jestem pewien co do korzystania z || operator w linii 2. Czy nie jest to wartość inna niż zerowa lub niezerowa, a nie gwarantowana? Chciałbym użyć czegoś więcej jak: var keyCode = (e.keyCode? E.keyCode: e.which); +1 za użycie obiektu strzałki, aby nadać imienne nazwy. – Mnebuerquo

+5

Jeśli używasz jQuery, nie musisz testować dla e., Które: 'Zdarzenie. Właściwość normalizuje event.keyCode i event.charCode' - http://api.jquery.com/event.which/ – JCM

+0

. Próbuję umieścić kluczowego detektora zdarzeń na stole, ale to nie zadziała. Czy istnieje ograniczona liczba typów selektorów obsługujących kluczowe detektory zdarzeń? –

9

Czy na pewno program jQuery.HotKeys nie obsługuje klawiszy strzałek? Zdarzyło mi się, że robiłem demo i obserwowałem je w lewo, w prawo, w górę i w dół, gdy testowałem w IE7, Firefox 3.5.2 i Google Chrome 2.0.172 ...

EDIT: jquery.hotkeys został przeniesiony do Github: https://github.com/jeresig/jquery.hotkeys

+0

Czytałem, gdzie napisano, że było oparte na innej bibliotece i założyłem, że lista obsługiwanych kluczy nadal jest stosowana. –

22

Trochę za późno, ale HotKeys ma bardzo poważny błąd, który powoduje, że zdarzenia są wykonywane wielokrotnie, jeśli do elementu zostanie dołączony więcej niż jeden skrót. Po prostu użyj zwykłego jQuery.

$(element).keydown(function(ev) { 
    if(ev.which == $.ui.keyCode.DOWN) { 
     // your code 
     ev.preventDefault(); 
    } 
}); 
+2

+1 za użycie obiektu ui keycode. Znacznie łatwiej zrozumieć niż 37, 38, 39 lub 40. Nie wiem, dlaczego najlepszą odpowiedzią jest użycie e.keyCode, gdy dokumentacja jQuery wyraźnie stwierdza, że ​​używa e., Aby uwzględnić różnice przeglądarki. Mam nadzieję, że ta odpowiedź zyska większe uznanie za robienie tego dobrze. –

+1

Używanie $ .ui.keyCode.DOWN na każdym naciśnięciu klawisza jest DUŻO wolniejsze niż użycie numeru. Wystarczy dodać komentarz, jeśli chodzi o przejrzystość, zwłaszcza, że ​​musi być uruchamiany za każdym naciśnięciem dowolnego klawisza. –

5

Zamiast return false; jak w przykładach powyżej, można użyć e.preventDefault(); który robi to samo, ale jest łatwiejsze do zrozumienia i odczytania.

+4

'return false;' i 'e.preventDefault();' nie są dokładnie takie same. Zobacz http://stackoverflow.com/a/1357151/607874 –

16

ja po prostu łączy najlepsze kawałki z innych odpowiedzi:

$(document).keydown(function(e){ 
    switch(e.which) { 
     case $.ui.keyCode.LEFT: 
     // your code here 
     break; 

     case $.ui.keyCode.UP: 
     // your code here 
     break; 

     case $.ui.keyCode.RIGHT: 
     // your code here 
     break; 

     case $.ui.keyCode.DOWN: 
     // your code here 
     break; 

     default: return; // allow other keys to be handled 
    } 

    // prevent default action (eg. page moving up/down) 
    // but consider accessibility (eg. user may want to use keys to choose a radio button) 
    e.preventDefault(); 
}); 
+1

Skąd pochodzi "ui"? Pobieranie "TypeError: $ .ui jest niezdefiniowane" EDIT - Brakowało mi interfejsu użytkownika JQuery. Mam to załadowane - nie więcej błędów. –

+1

Najwyraźniej również używa interfejsu jQuery UI, który musi mieć to wyliczenie. Nie użyłbym jQuery UI tylko do tego, przy okazji. –

14

Można użyć KeyboardJS. Napisałem bibliotekę do zadań podobnych do tego.

KeyboardJS.on('up', function() { console.log('up'); }); 
KeyboardJS.on('down', function() { console.log('down'); }); 
KeyboardJS.on('left', function() { console.log('right'); }); 
KeyboardJS.on('right', function() { console.log('left'); }); 

Zamówienie biblioteka tutaj =>http://robertwhurst.github.com/KeyboardJS/

10

lakoniczny rozwiązanie przy użyciu zwykłego Javascript (dzięki Sygmoral proponowanych usprawnień):

document.onkeydown = function(e) { 
    switch (e.keyCode) { 
     case 37: 
      alert('left'); 
      break; 
     case 39: 
      alert('right'); 
      break; 
    } 
}; 

zobaczyć również https://stackoverflow.com/a/17929007/1397061.

+0

Prawdopodobnie również warte wiązania za pomocą 'document.addEventListener ('keydown', myFunction);' – nathanbirrell

3

Można użyć jQuery wiąże:

$(window).bind('keydown', function(e){ 
    if (e.keyCode == 37) { 
     console.log('left'); 
    } else if (e.keyCode == 38) { 
     console.log('up'); 
    } else if (e.keyCode == 39) { 
     console.log('right'); 
    } else if (e.keyCode == 40) { 
     console.log('down'); 
    } 
}); 
-1

Przy kawie & Jquery

$(document).on 'keydown', (e) -> 
    switch e.which 
     when 37 then console.log('left key') 
     when 38 then console.log('up key') 
     when 39 then console.log('right key') 
     when 40 then console.log('down key') 
    e.preventDefault() 
2

Można sprawdzić pogoda w arrow key zostanie naciśnięty przez:

$(document).keydown(function(e){ 
    if (e.keyCode > 36 && e.keyCode < 41) { 
     alert("arrowkey pressed"); 
     return false; 
    } 
}); 
0

zapobiec strzałkę dostępne tylko dla jakikolwiek inny obiekt WYBIERZ, a właściwie nie mam innego obiekt LOL. , ale może zatrzymać zdarzenie ze strzałką na stronie i typie wejścia.

Już próbuję zablokować strzałkę w lewo i prawo, aby zmienić wartość obiektu SELECT, używając "e.preventDefault()" lub "return false" na zdarzeniu "kepress" "keydown" i "keyup", ale wciąż zmienia wartość obiektu. ale wydarzenie nadal mówi ci, że strzałka została naciśnięta.

0

Solidna biblioteka JavaScript do przechwytywania wprowadzonych klawiszy i wprowadzonych kombinacji klawiszy. Nie ma żadnych zależności.

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

hotkeys('right,left,up,down', function(e, handler){ 
    switch(handler.key){ 
     case "right":console.log('right');break 
     case "left":console.log('left');break 
     case "up":console.log('up');break 
     case "down":console.log('down');break 
    } 
}); 
0

Przyjechałem tu szuka prosty sposób, aby użytkownik, gdy koncentruje się na wejściu, za pomocą klawiszy strzałek do +1 lub -1 wejście numerycznej. Nigdy nie znalazłem dobrej odpowiedzi, ale napisałem poniższy kod, który wydaje się działać świetnie - teraz robię to w całej witrynie.

$("input").bind('keydown', function (e) { 
    if(e.keyCode == 40 && $.isNumeric($(this).val())) { 
     $(this).val(parseFloat($(this).val())-1.0); 
    } else if(e.keyCode == 38 && $.isNumeric($(this).val())) { 
     $(this).val(parseFloat($(this).val())+1.0); 
    } 
}); 
3

Przykład czystych js z wyjazdem prawo lub w lewo

 window.addEventListener('keydown', function (e) { 
      // go to the right 
      if (e.keyCode == 39) { 

      } 
      // go to the left 
      if (e.keyCode == 37) { 

      } 
     }); 
Powiązane problemy