2012-04-22 23 views
9

Ho trovato molte domande correlate (qui e altrove), ma non ho trovato questo in particolare.Javascript: Evento Keydown: tasto freccia "Su" che impedisce ulteriori eventi Keydown con i tasti freccia? (risposta: tastiera fantasma)

Sto cercando di ascoltare gli eventi di keydown per i tasti freccia (37-40), tuttavia quando si utilizzano i tasti freccia in un determinato ordine, la freccia successiva non genera eventi "keydown".

Esempio: http://blog.pothoven.net/2008/05/keydown-vs-keypress-in-javascript.html

  1. In quella pagina, fare clic nella "tipo qui ->" scatola.
  2. Tenere premuto il tasto freccia destra: aggiornamenti della tabella di KeyCode 39
  3. Continuando a tenere freccia destra sulla, tenere premuto il tasto freccia: aggiornamenti della tabella a 38
  4. Mentre si continua a tenere i tasti freccia destra e su, premere e tenere premuto tasto freccia sinistra: tavolo non si aggiornamento

Tuttavia, se faccio la stessa cosa ma con giù freccia invece di fino freccia allora funziona come previsto.

Inoltre, se utilizzo la tastiera anziché i tasti freccia, funziona come previsto.

Sto impedendo il normale funzionamento dell'evento keydown (restituendo entrambi false nel listener di eventi e chiamando preventDefault()), ma il comportamento persiste.

Ho pensato che potesse essere la mia tastiera, ma succede su un laptop e su un computer di un amico.

Qualcuno ha qualche idea di cosa sta succedendo? O qualche buona idea su soluzioni alternative?

[modifica] Ecco un esempio di cosa intendo. Mi rendo conto che questo potrebbe non funzionare su tutti i browser, ma ho appena buttato questo insieme sul mio portatile per dimostrare ciò che sta accadendo per me (su Chrome su W7 e anche cromo & Safari su Mac OS 10.6.8)

<html> 
<body> 
<script> 

var keysDown = {}; 
addEventListener("keydown", function(e) { 
    keysDown[e.keyCode] = true; 
    document.getElementById('latestKeydown').value=e.keyCode; 
}, false); 

addEventListener("keyup",function(e){ 
    delete keysDown[e.keyCode]; 
}, false); 

var loop = function(){ 
    document.getElementById('upinput').value=keysDown[38]; 
    document.getElementById('downinput').value=keysDown[40]; 
    document.getElementById('leftinput').value=keysDown[37]; 
    document.getElementById('rightinput').value=keysDown[39]; 
} 

setInterval(loop,1); 

</script> 
Up: <input id="upinput" type=text size=10><br /> 
Down: <input id="downinput" type=text size=10><br /> 
Left: <input id="leftinput" type=text size=10><br /> 
Right: <input id="rightinput" type=text size=10><br /> 
Recent Keydown: <input id="latestKeydown" type=text size=10><br /> 

</body> 
</html> 

Di nuovo, il problema è: Se tengo premuto A, poi S, poi D, poi F, poi G, puoi vedere il "recente keydown" che si aggiorna ogni volta che inizio a tenere una nuova chiave.

Tuttavia, se tengo premuto la freccia destra, quindi la freccia su, quindi la freccia sinistra, non vedo l'aggiornamento "Recent Keydown" per il tasto freccia sinistra.

+1

In attesa di alcune righe di codice. –

+0

Benvenuti in Stack Overflow! –

+0

* "... il PC potrebbe non capirlo a causa del modo in cui le tastiere sono cablate" * oO –

risposta

3

Non riesco a parlare di autorizzazione su questo, ma in base a https://stackoverflow.com/a/4177260/562209, a meno che non si stia lavorando con la pressione contemporanea di un tasto/i di modifica e un tasto non modificatore, per quanto riguarda la pressione di più tasti "il PC potrebbe non capirlo a causa del modo in cui le tastiere sono cablate ".

+3

Ecco una bella spiegazione di questo problema: http://www.microsoft.com/appliedsciences/antighostingexplained.mspx – user123444555621

+0

Gah :(Grazie, gente, questo sembra il probabile colpevole. – ElleryTheJones