2012-05-05 27 views
5

Situazione: Ho un gestore keydown con un switch per quello tasto viene premuto roba, abbastanza standard, ma quando un tasto è premuto l'evento keydown più volte (e non solo una volta quando il tasto è effettivamente premuto).forza keydown evento a fuoco una sola volta per keyCode

Perché è un problema: voglio mantenere la keydown ascoltatore attivo, vale a dire essere in grado di rilevare più di un tasto premuto in una sola volta, ma hanno solo il fuoco evento una volta per keydown. Voglio fare qualcosa sullo keyup per quello keyCode in base al tempo tra il basso e l'alto, ma quel momento si sta facendo rovinare a causa dei licenziamenti multipli.

Quello che ho provato: Attualmente sto tenere un elenco di keyCodes che sono in calo, e controllando contro quelli della mia keydown gestore per mantenere il comportamento predefinito accada se il keyCode è nella mia lista. Tuttavia, l'evento continua a sparare molto spesso e sono preoccupato dell'efficienza/eleganza di questa soluzione.

La domanda attuale: C'è un buon modo per limitare la cottura della keydown evento per solo quando la chiave è fisicamente spinto verso il basso, o solo ascoltare keycodes specifici?

+0

"essere in grado di rilevare più di un tasto premuto contemporaneamente" Ciò significa che cosa? – epascarello

+0

Ad esempio, tieni premuto il tasto 'y', quindi tieni premuto il tasto 'o'. Ciò esclude la soluzione di rimuovere l'evento keydown e aggiungerlo nuovamente dopo la chiave. –

risposta

8

Nel gestore del keydown, controllare se la chiave è uguale all'ultima chiave gestita. Se lo era, esci presto. Alla chiave, dimentica l'ultima chiave gestita.

Ad esempio:

var lastEvent; 
var heldKeys = {}; 

window.onkeydown = function(event) { 
    if (lastEvent && lastEvent.keyCode == event.keyCode) { 
     return; 
    } 
    lastEvent = event; 
    heldKeys[event.keyCode] = true; 
}; 

window.onkeyup = function(event) { 
    lastEvent = null; 
    delete heldKeys[event.keyCode]; 
};​ 

Demo here (clicca sul pannello "Risultato" e premere i tasti).

0

Definire un valore booleano per registrare se si preme il tasto. Impostalo su true nell'evento key down. Fai controllare il loop principale se il valore è true e gestisci l'evento, quindi imposta il tasto su false. Avere un altro booleano da registrare se la chiave è rilasciata (inizialmente falso). Se l'evento di key-up si attiva, impostalo su rilasciato. Imposta il valore premuto a tastiera solo su true (nell'evento key down) se il valore "rilasciato" è vero.

+0

Questa è una buona risposta. L'unica cosa che probabilmente aggiungo è che definirei una serie di oggetti per memorizzare i valori booleani per ogni codice chiave mentre è premuto, e in quell'oggetto sarebbe [{"43": true}, ...] e quindi basta rimuovere quel keycode come suggerito sopra. – LocalPCGuy

+0

Questo è in realtà quello che sto facendo ora, mi dispiace se non è stato chiaro. Sto mantenendo i codici chiave 'down' memorizzati e rimuovendoli sulla chiave. Sono interessato a qualsiasi alternativa che potrebbe essere più efficiente di controllare più volte al secondo contro il mio elenco di codici chiave. –

0

Ecco un esempio di quello che penso che si vuole raggiungere: jsFiddle Example

Attualmente le combinazioni CTRL + B è l'unico i thats rilevato. Basta premere alcuni numeri per ottenere un registro delle attività. Quando il tasto è già premuto, rileva l'azione di attesa.

Problemi correlati