Tasti freccia vincolanti in JS / jQuery


418

Come posso associare una funzione ai tasti freccia sinistra e destra in Javascript e / o jQuery? Ho guardato il plugin js-hotkey per jQuery (racchiude la funzione di bind integrata per aggiungere un argomento per riconoscere tasti specifici), ma non sembra supportare i tasti freccia.


Risposte:


541
document.onkeydown = 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)
};

Se è necessario supportare IE8, avviare il corpo della funzione come e = e || window.event; switch(e.which || e.keyCode) {.


(modifica 2020)
Nota che KeyboardEvent.whichora è deprecato. Vedi questo esempio usandoKeyboardEvent.key per una soluzione più moderna per rilevare i tasti freccia.


28
Di gran lunga la migliore risposta. Usi e.whichcome jQuery consiglia per cross-browser, utilizza e.preventDefault()invece di return false( return falsesu un gestore di eventi jQuery innesca entrambi e.preventDefault()e e.stopPropagation(), il secondo dei quali causerà il fallimento di eventuali eventi aggiunti successivamente poiché l'evento non si propaga a loro), e al fine dell'interruttore, tornerà senza chiamare e.preventDefault()se si tratta di un tasto diverso da quelli ricercati per non ostacolare l'utilizzo di altri tasti e invece di $.ui.keyCode.DOWNconfrontarlo con i numeri (MOLTO più veloce).
Jimbo Jonny,

2
Nathan: sembra che non tutti i codici chiave siano coerenti tra i browser, ma i tasti freccia sono alcuni di quelli che lo sono. Vedi qui: stackoverflow.com/questions/5603195/...
Sygmoral

1
@MichaelScheper - 1) variabili! = Costanti, indipendentemente dal fatto che siano o meno destinate a essere modificate ... il motore deve ancora trattarle come var fino a quando le costanti ES6 sono abbastanza onnipresenti che jQuery può usare le costanti 2) non lo sono numeri davvero magici quando c'è un commento proprio accanto a loro che dice esattamente cosa sono, e 3) ... continua
Jimbo Jonny

2
... 3) quando accedi alla $.ui.keyCode.DOWNtua ricerca $nel tuo ambito lessicale, non trovandola, salendo di livello ... cercando $, ripeti fino a portata globale, trovala sul globale window, accesso $sulla finestra, accesso uisu window.$, accesso keyCodesu window.$.ui, accedi DOWNsu window.$.ui.keyCodeper arrivare al valore primitivo che desideri confrontare, quindi esegui il confronto effettivo. Che la velocità sia importante per te è una decisione personale, ho semplicemente la tendenza ad evitare 4 livelli di accesso quando c'è una situazione in cui posso scrivere / commentare altrettanto facilmente la primitiva.
Jimbo Jonny,

1
@NathanArthur Qui ho trovato due buoni strumenti online per testare i codici chiave della tastiera: keycode.info asquare.net/javascript/tests/KeyCode.html unixpapa.com/js/key.html
Riccardo Volpe

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

Codici carattere:

37 - sinistra

38 - su

39 - giusto

40 - giù


4
C'è uno scopo per il ritorno?
Alex S

19
Ferma qualsiasi ulteriore evento di keydown colpito.
s_hewitt,

9
Ombra: no, significa che impedisce all'evento keydown di sparare su altri elementi DOM
JasonWoof,

3
Tranne 39 è anche apostrofo, non è vero?
Paul D. Waite,

25
Quando si utilizza jQuery, utilizzare e.whichanziché e.keyCodeper ulteriore supporto del browser. Vedi il mio commento qui sotto.
Sygmoral,

108

È possibile utilizzare il keyCode dei tasti freccia (37, 38, 39 e 40 per sinistra, su, destra e giù):

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

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

Controlla qui l' esempio sopra .


1
Non sono sicuro del tuo utilizzo di || operatore in linea 2. Un valore diverso da zero o implementazione diversa da zero non è specifico e non è garantito? Vorrei usare qualcosa di più simile a: var keyCode = (e.keyCode? E.keyCode: e.which); +1 per l'uso dell'oggetto freccia per assegnare nomi leggibili ai casi.
Mnebuerquo,

6
Se si utilizza jQuery, non è necessario eseguire il test di e.which: The event.which property normalizes event.keyCode and event.charCode- api.jquery.com/event.which
JCM

Sto cercando di mettere un listener di eventi chiave su un tavolo, ma non funzionerebbe. Esiste un numero limitato di tipi di selettori che supportano i listener di eventi chiave?
Arman Bimatov,

23

Questo è un po 'in ritardo, ma HotKeys ha un bug molto grave che causa l'esecuzione di eventi più volte se si collega più di un tasto di scelta rapida a un elemento. Usa semplicemente jQuery.

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

2
+1 per l'utilizzo dell'oggetto keycode dell'interfaccia utente. Molto più facile da capire rispetto a 37, 38, 39 o 40. Non so perché la risposta migliore stia usando e.keyCode quando la documentazione di jQuery afferma esplicitamente di usare e.ich per tenere conto delle differenze del browser. Spero che questa risposta ottenga un maggiore riconoscimento per averlo fatto bene.
Nessuno

2
L'uso di $ .ui.keyCode.DOWN ad ogni pressione dei tasti è MOLTO più lento rispetto all'utilizzo del numero. Aggiungi un commento se preoccupato per la chiarezza, soprattutto perché deve essere eseguito ogni volta che viene premuto un tasto.
Jimbo Jonny,

16

Ho semplicemente combinato i bit migliori delle altre risposte:

$(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
Da dove viene "ui"? Ottenere "TypeError: $ .ui non è definito" EDIT - Mi mancava l'interfaccia utente di JQuery. Ho caricato questo - niente più errori.
un programmatore

3
Apparentemente sta anche usando l'interfaccia utente di jQuery che deve avere quell'enum. Non includerei l'interfaccia utente di jQuery solo per quello, tra l'altro.
Jethro Larson

14

Puoi usare KeyboardJS. Ho scritto la libreria per attività come questa.

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'); });

Dai un'occhiata alla libreria qui => http://robertwhurst.github.com/KeyboardJS/


14

Una soluzione concisa che utilizza Javascript semplice (grazie a Sygmoral per i miglioramenti suggeriti):

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

Vedi anche https://stackoverflow.com/a/17929007/1397061 .


Probabilmente vale anche la pena legare viadocument.addEventListener('keydown', myFunction);
nathanbirrell il

9

Sei sicuro che jQuery.HotKeys non supporti i tasti freccia? Ho fatto un casino con la loro demo prima e ho osservato che funzionava a sinistra, a destra, su e giù quando l'ho testato in IE7, Firefox 3.5.2 e Google Chrome 2.0.172 ...

EDIT : sembra che jquery.hotkeys sia stato trasferito su Github: https://github.com/jeresig/jquery.hotkeys


Stavo leggendo dove diceva che si basava su un'altra libreria e supponevo che l'elenco di chiavi supportate fosse ancora applicato.
Alex S,


4

Esempio di puro js con andare a destra o a sinistra

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

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

            }
        });

3

Puoi usare jQuery bind:

$(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');
    }
});

2

Puoi controllare se arrow keyviene premuto un:

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

0

impedisce la freccia disponibile solo per qualsiasi altro oggetto SELEZIONA, beh in realtà non ho tes su un altro oggetto LOL. ma può interrompere l'evento freccia sulla pagina e sul tipo di input.

cerco già di bloccare la freccia sinistra e destra per modificare il valore dell'oggetto SELECT usando "e.preventDefault ()" o "return false" nell'evento "keypress" "keydown" e "keyup" ma cambia comunque il valore dell'oggetto. ma l'evento ti dice ancora che la freccia è stata premuta.


0

Una robusta libreria Javascript per acquisire input da tastiera e combinazioni di tasti immessi. Non ha dipendenze.

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

Sono venuto qui alla ricerca di un modo semplice per consentire all'utente, quando focalizzato su un input, utilizzare i tasti freccia per +1 o -1 un input numerico. Non ho mai trovato una buona risposta, ma ho reso il seguente codice che sembra funzionare alla grande, rendendo questo sito adesso.

$("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);
    }
}); 

-1

Con caffè e 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()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.