2014-12-09 25 views
16

Sto sviluppando un'applicazione in cui è necessario eseguire alcune operazioni di post-elaborazione quando l'utente preme CMD + SINISTRA su una particolare casella di testo. Devo fare questo dopo, la funzionalità predefinita del browser (vale a dire dopo aver portato il cursore in primo piano nella linea fisica corrente).Quando si tiene premuto il tasto CMD, la chiave non viene attivata per nessun altro tasto

Il problema è keyup è non essere attivato per il tasto sinistro (o qualsiasi tasto per questo) fino a quando la chiave CMD è giù.

Ho provato questo con i tasti CTRL e MAIUSC e ho rilevato che il keyup viene attivato come previsto per la chiave secondaria. Quindi, se fai CTRL + SINISTRA e poi rilascerai LEFT e poi rilascerai CTRL, otterrai quattro eventi in totale, 2 keydown e 2 keyup. Per la chiave CMD, tuttavia, otteniamo 2 keydown, ma solo un evento keyup (quello per la chiave CMD stesso quando lo rilasciamo alla fine).

Ho provato questo con il tasto MAIUSC e ho rilevato che la chiave viene attivata come previsto per la chiave secondaria. Quindi, se si fa MAIUSC + SINISTRA e poi si rilascia SINISTRA e poi si rilascia SHIFT, si ottengono 4 eventi in totale, 2 keydown e 2 keyup. Per la chiave CMD, tuttavia, otteniamo 2 keydown, ma solo un evento keyup (quello per la chiave CMD stesso quando lo rilasciamo alla fine).

Cosa potrebbe essere? C'è un modo per ottenere keyup attivato per il tasto SINISTRA (o qualsiasi tasto) quando CMD non funziona?

Sto provando questo con l'ultimo Google Chrome su OSX 10.9.5. Il comportamento è esattamente lo stesso anche su Firefox. Quindi questo non è un problema di Chrome.

Demo: http://jsfiddle.net/techfoobar/xu0o11nh/4/

In sostanza:

$('#mytextbox') 

    // this gets correctly triggered for the meta key as well as the secondary key 
    // when you press CMD and LEFT in sequence, you get two lines in the console one for 
    // the CMD key and one for the LEFT key 
    .keydown(function(_e) { 
     console.log('Keydown: ' + _e.keyCode); 
    }) 

    // however, if I release the LEFT key (while keeping the CMD key down) 
    // this does NOT get triggered for the LEFT key 
    .keyup(function(_e) { 
     console.log('Keyup: ' + _e.keyCode); 
    }); 
+0

in Chrome ricevo tutti gli eventi. jQuery invia una chiave nell'evento che si chiama 'ctrlKey' dove puoi controllare se ctrl è premuto ... io dodnt controllo quale è cmd ma puoi facilmente trovarlo da console completo evento – Mephiztopheles

+0

@Mephiztopheles - Il problema è solo con la chiave CMD ('event.metaKey' courtesy jQuery). – techfoobar

+0

O non ho capito il tuo problema o non ho potuto simularlo. Ecco la mia console: '70 (indice): 34 Keydown: 17 (indice): 34 Keydown: 37 (indice): 37 Keyup: 37 (indice): 37 Keyup: 17' –

risposta

2

Questo è known behavior con il tasto Meta, e non v'è, purtroppo, alcuna soluzione nota.

Per il vostro caso, si può considerare l'attuazione del comportamento del browser predefinito te (how to do that), quindi implementare il comportamento personalizzato che vi serve, e finirlo con _e.preventDefault();

+0

Grazie. Questo è quello. Problema conosciuto. Non c'è soluzione facile. L'implementazione personalizzata di CMD + LEFT (prendere il caret in prima posizione nella riga fisica del testo considerando il wrapping, ecc.) È troppo complicato per il mio semplice scopo. – techfoobar

1

Questo è quasi certamente a che fare con il sistema di set 'caldo keys'.Apparently Secondo la documentazione questo evento keyup manca è expected behaviour troppo.

Quando faccio cmdspazio Neppure non ottengo un evento KeyDown per il spazio come appare la finestra di evidenziazione.

Sulla menzione del ctrl chiave: perché ho 'spazi' istituito quando ho ctrllasciato o ctrldestra non ottengo alcuna sinistra o eventi KeyDown destra sparati, tuttavia ctrlsu o ctrlin basso almeno spara i loro eventi di keydown.

Penso che sarebbe difficile assumere l'uso di un sistema che non ha l'impostazione predefinita dei tasti di scelta rapida.

+0

Ciao, grazie mille per la risposta. Ma su un Mac, CMD + Sinistra/Destra non ha alcuna azione * di sistema *, ma solo un'azione * componente * (casella di testo) - cioè portando il cursore nella prima posizione nella linea orizzontale di testo corrente. Questo è paragonabile a Shift + LEFT, che estende la selezione a sinistra di una posizione - ma con Shift, otteniamo 4 eventi chiave come delineato nella domanda, cioè posso eseguire l'elaborazione dopo che Shift + Left è terminato estendendo la selezione. Il caso con CMD + Spazio è comprensibile perché ha un'azione * sistema * - Spotlight, stessa cosa con Ctrl + Sinistra/Destra (controllo missione). – techfoobar

+0

Inoltre, il comportamento è esattamente lo stesso in Firefox, quindi questo non è un problema di Chrome. – techfoobar

+0

D'accordo, non mi aspetterei che questo fosse un comportamento specifico di Chrome. Forse una soluzione potrebbe risiedere nel rilevare la modifica della posizione del punto di inserimento: http://stackoverflow.com/a/19803814/648350. Tuttavia, questo è ancora associato all'evento 'keydown' quindi non è sicuro se sia quello che stai cercando – haxxxton

0

non credo che avrai bisogno di un settimeout.

Ho cambiato il codice per rilevare 2 codici. questo può essere rifatto ulteriormente con un codice più pulito.

http://jsfiddle.net/7nd7hf16/1/

var cmdDown = false; 
$('#foo') 
.keydown(function(_e) { 
    if(_e.keyCode == 91) 
     cmdDown = true; 

    if(cmdDown && _e.keyCode == 37) 
     console.log('cmd + left'); 

    console.log('Keydown: ' + _e.keyCode); 
}) 
.keyup(function(_e) { 
    if(_e.keyCode == 91) 
     cmdDown = false; 

    console.log('Keyup: ' + _e.keyCode); 
}) 
.focus(); 
+0

Ciao , Grazie per la tua risposta Il problema non è nel rilevare la chiave per la chiave cmd (che è la tua risposta), ma la chiave per la chiave secondaria fino a quando il tasto cmd viene tenuto premuto. Inoltre, nota che jQuery ci fornisce '_e.metaKey' per rilevare se il cmd viene premuto (cioè non abbiamo bisogno di rilevarlo come nella tua risposta). – techfoobar

+0

'if (cmdDown && _e.keyCode == 37) console.log ('cmd + sinistra');' Credo che tu abbia saltato il codice di cui sopra .. così, il cmd keydown utilizzando codice chiave o metakey hai impostato un 'cmdDown' su true e su key up lo cambi di nuovo in falso .. dato che conosci lo stato della chiave cmd ora puoi controllare il secondo tasto premuto .. – hackerone

+0

Giusto. Posso ottenere l'evento ** keydown ** correttamente per 'CMD + ' come hai mostrato - L'unico problema è ottenere l'evento ** keyup ** per la seconda chiave (LEFT nel nostro caso) per tanto tempo man mano che il CMD viene tenuto premuto. – techfoobar

Problemi correlati