2011-02-10 4 views

risposta

67

Per rilevare più chiavi mantenuto premuto, utilizzare i keydown e keyup eventi.

var keys = {}; 

$(document).keydown(function (e) { 
    keys[e.which] = true; 
}); 

$(document).keyup(function (e) { 
    delete keys[e.which]; 
}); 

Ho messo insieme una demo qui: http://jsfiddle.net/gFcuU/. È divertente, anche se ho notato che la mia tastiera è in grado di rilevare al massimo 6 tasti.

+1

Simpatico script, sono riuscito a ottenere solo 6 chiavi allo stesso tempo massimo quando i loro codici char erano distanti tra loro (2 o più differenze). ps. perché cancellare la chiave e non impostarla solo su false? – jerone

+0

@jerone Immagino di non volere che l'oggetto ingombra con una cronologia di tutti i tasti, e salverà alcune iterazioni nel ciclo 'printKeys'. Ma in pratica hai ragione, è una piccola differenza. –

+0

Posso anche fare circa 7 tasti, tuttavia per quello che voglio (tasti freccia) ci sono alcune combinazioni che permettono o 3 o 2, ma mai 4 ... interessante – ajax333221

1

No. keypress scatterà per ogni singolo tasto premuto - ad eccezione dei tasti di modifica come CTRL, ALT e MAIUSC, è possibile combinarli con altre chiavi, purché sia ​​solo un'altra chiave.

47

Dipende. Per i tasti "normali", che significa Non- Maiusc, Ctrl, ALT, (CMD), la risposta è no, il gestore di eventi prenderà/incendio in una coda, uno dopo l'altro.

Per i tasti di modifica sopra menzionati, esiste una proprietà sull'oggetto evento.

Esempio:

$(document).bind('keypress', function(event) { 
    if(event.which === 65 && event.shiftKey) { 
     alert('you pressed SHIFT+A'); 
    } 
}); 

Jsfiddle demo.

Altre propertys sono:

  • event.ctrlKey
  • event.altKey
  • event.metaKey
+0

@jAndy Qual è 'event.metaKey' per? –

+1

per motivi pratici è il tasto windows/command (ma ... http://en.wikipedia.org/wiki/Meta_key) – Mauricio

+0

@Jacob, sto indovinando il tasto windows/mac? Da w3: "Su alcune piattaforme questa chiave può essere associata a un nome di chiave alternativo." –

-1

Come il mio succo scaduto (nessuno stava usando :() ho deciso di aggiornare la risposta con più soluzioni 2017. Controlla qui sotto.

Puoi usare il mio plug-in per jQuery per rilevare le scorciatoie.

'fondamentalmente eventi e di cache di ottenere ciò che si premono i tasti al momento. Se tutti i tasti sono premuti spara funzione.

https://github.com/maciekpaprocki/bindShortcut (scaduto!)

Yo Hai una piccola spiegazione su come usarlo nel file readme. Spero che questo ti aiuti. Feedback più che apprezzato.

Edit 2017:

E 'il 2017 e non abbiamo bisogno di plugin jQuery per risolvere cose del genere.In breve avrete bisogno di qualcosa di simile:

let pressed = {}; 

document.addEventListener('keydown', (event) => { 
    pressed[event.key] = true; 
}); 
document.addEventListener('keyup', (event) => { 
    delete pressed[event.key]; 
}); 

//and now write your code 
document.addEventListener('keydown', (event) => { 
    if(pressed[firstKey]&&pressed[secondKey]){ 
    //dosomething 
    } 
}); 

browser più vecchi potrebbero avere alcune stranezze, però da IE9 tutto dovrebbe funzionare bene, tranne gli importi marginali di sistemi operativi che non supportano la delega evento (super vecchio ubuntu etc.). Non c'è modo di risolverlo in quanto non è questo il problema del browser.

Ci sono alcune stranezze nei nuovi Mac connessi a chiavi booleane come ad esempio il blocco delle maiuscole.

Per saperne di più: https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent#Key_names_and_Char_values

+1

"Pagina non trovata"): –

+0

Sarebbe bello vedere un po 'di codice. Questo collegamento interrotto rende la risposta obsoleta. –

+0

Purtroppo vedo che il mio senso è stato rimosso. In entrambi i casi. Il plugin jQuery per qualcosa di simile nel 2017 è solo uno scherzo, quindi aggiornerò presto la risposta con la soluzione. Se non mi metti in discussione fino a quando lo faccio :) –

2

Se si desidera solo per sparare un gestore quando diversi tasti vengono premuti in serie, provare qualcosa di simile:

jQuery.multipress = function (keys, handler) { 
    'use strict'; 

    if (keys.length === 0) { 
     return; 
    } 

    var down = {}; 
    jQuery(document).keydown(function (event) { 
     down[event.keyCode] = true; 
    }).keyup(function (event) { 
     // Copy keys array, build array of pressed keys 
     var remaining = keys.slice(0), 
      pressed = Object.keys(down).map(function (num) { return parseInt(num, 10); }), 
      indexOfKey; 
     // Remove pressedKeys from remainingKeys 
     jQuery.each(pressed, function (i, key) { 
      if (down[key] === true) { 
       down[key] = false; 
       indexOfKey = remaining.indexOf(key); 
       if (indexOfKey > -1) { 
        remaining.splice(indexOfKey, 1); 
       } 
      } 
     }); 
     // If we hit all the keys, fire off handler 
     if (remaining.length === 0) { 
      handler(event); 
     } 
    }); 
}; 

Per esempio, per sparare sulla st,

+0

Ci sono sicuramente soluzioni migliori là fuori, ma se stai solo aggiungendo tasti per l'attivazione del codice di debug, ecc, è bello non aggiungere un'altra dipendenza. –

0

Ecco una soluzione jQuery basata su risposta di Maciej https://stackoverflow.com/a/21522329/

// the array to add pressed keys to 
var keys = []; 
// listen for which key is pressed 
document.addEventListener('keydown', (event) => { 
    if ($.inArray(event.keyCode, keys) == -1) { 
     keys.push(event.keyCode); 
    } 
    console.log('keys array after pressed = ' + keys); 
}); 
// listen for which key is unpressed 
document.addEventListener('keyup', (event) => { 
    // the key to remove 
    var removeKey = event.keyCode; 
    // remove it 
    keys = $.grep(keys, function(value) { 
     return value != removeKey; 
    }); 
    console.log('keys array after unpress = ' + keys); 
}); 
// assign key number to a recognizable value name 
var w = 87; 
var d = 68; 
var s = 83; 
var a = 65; 
// determine which keys are pressed 
document.addEventListener('keydown', (event) => { 
    if ($.inArray(w, keys) != -1 && $.inArray(d, keys) != -1) { // w + d 
    console.log('function for w + d combo'); 
    } else if ($.inArray(s, keys) != -1 && $.inArray(a, keys) != -1) { // s + a 
    console.log('function for s + a combo'); 
    } 
}) 

violino demo

https://jsfiddle.net/Hastig/us00zdo6/

Problemi correlati