Domanda

Questo è un po 'strano, quindi immagino che mi manchi qualcosa di ovvio o questo è un difetto con il modo in cui questi eventi sono implementati nei browser.

Consentitemi di riassumere prima uno scenario di esempio Questo problema viene presentato prima di fornire un caso di caso isolato;

I tasti freccia vengono utilizzati per spostare il giocatore (poiché una funzione HandleKeyDown viene sparata ogni volta che una chiave viene colpita ovunque sulla pagina). Allo stesso modo, ogni volta che viene rilasciata una chiave un'altra funzione viene licenziata (HandleKeyup).

Mentre tu (il giocatore) tieni premuto il tasto sinistro, la funzione HandleKeyDown viene ripetutamente attivata (il che è vero che penso che sfida ciò che ti aspetteresti e ciò che il nome implica, ma tuttavia, questo è un comportamento normale su tutti i browser come sono sicuro sai).

Quindi ecco cosa succede: il giocatore tiene una direzione per camminare in quella direzione; Quindi prendono un tasto numerico (per l'oggetto a chiave a caldo) mentre continuano a camminare mantenendo la direzione. Quello che succede qui è che quando rilasci il tasto numerico per l'oggetto a chiave, la ripetizione per il movimento del giocatore si ferma!

Ho scritto un esempio isolato molto piccolo di questo comportamento:

<html>
<head>
    <script type='text/javascript' src='jquery-1.5.1.min.js'></script>
    <script type='text/javascript'>
        var log = {};
        var keyState = {};
        var keyCount = {'down': 0, 'up': 0};
        window.addEventListener('keydown', handleKeyDown, false);
        window.addEventListener('keyup', handleKeyUp, false);
        function handleKeyDown (e)
            {
            keyState[e.keyCode] = true;
            keyCount.down++;
            log.prepend(" ["+e.keyCode+"] ");
            return false;
            }
        function handleKeyUp (e)
            {
            keyState[e.keyCode] = false;
            keyCount.down++;
            return true;
            }
        $(function(){log = $('#log');});
    </script>
</head>
<body>
    <div id='debug'></div>
    <div id='log'></div>
</body>

Puoi anche provarlo qui:

http://sikosoft.net/keys.html

Premere i tasti della pagina e vedrai il codice chiave Appare nella pagina. Mentre tieni premuto la chiave, il codice chiave si ripete più e più volte.

Il comportamento diventa eccentrico quando premi un tasto diverso mentre il tasto iniziale è ancora in corso. Al rilascio di quella recente chiave, la ripetizione si ferma dalla prima chiave. È interessante notare che se provi l'esempio e tieni premuto una chiave, quindi tieni premuto una seconda chiave, ma invece di rilasciare il secondo, rilascia il primo: la seconda chiave continua a ripetere.

Quindi quello che sembra accadere è che quando l'evento Keyup viene licenziato, sembra terminare la ripetizione in eventi di keydown che sono stati sparati su una chiave precedente.

Ho provato tutti i tipi di cose che vanno dall'utilizzo di Return False in entrambe le funzioni di gestione degli eventi, restituendo True, provando keyPress invece di keydown, salvando gli stati delle chiavi e il movimento continua se il keystate del pulsante è ancora vero, ma ciò che tutto diminuisce a è che quando il keyup viene licenziato viene ucciso qualsiasi eventi di keydown che propagano attivamente. Ho letto JavaScript Madness: eventi da tastiera E non vedo nulla su questo specifico tipo di comportamento.

È un difetto di design con l'implementazione di eventi chiave o mi manca qualcosa? Osservo questo stesso comportamento in Chrome, IE e Firefox.

Qualche consiglio o input?

È stato utile?

Soluzione

Questo è il modo in cui funziona il sistema operativo/ambiente e, di conseguenza, è il modo in cui funziona il browser.

La ripetizione del keydown non dovrebbe continuare a sparare dopo il keyup da un'altra chiave nel browser, dal momento che non si comporta in questo modo da nessun'altra parte. Apri Blocco note, Vim o Pico o qualunque editor di testo usi ed esegui la stessa sequenza di eventi. Lo vedrai dopo il keyup, il primo tasto che hai premuto non Continua a stampare nuove lettere. Questo è proprio il modo in cui queste cose sono state progettate nel sistema operativo e, di conseguenza, è così che vengono proposti ai redattori e ai browser ecc.

Altri suggerimenti

Ecco il mio sistema per il mio input della tastiera. Puoi vedere come la chiave di ripetizione può essere estratta per il tuo uso qui. Ti permetterà di notare le chiavi trattenute e non fare affidamento su un sistema operativo come un'altra risposta in modo errato.


var down = [140]; //make an array to cover all the keypresses you should need with a normal keyboard

document.addEventListener('keydown', function(event) {
  if (down[event.keyCode]){
    return;
  } else {
   //do the normal things you do when you get key presses
  down[event.keyCode]=true;
  }
}, true);
document.addEventListener('keyup', function(event) {
  down[event.keyCode]=false;
   //do the normal things you do when you get key releases
}, true);

Puoi semplicemente verificare l'array "giù" e la posizione al suo interno di qualunque codice chiave desideri. Lo uso per prevenire i keyrepeat per l'input del gioco. Spero che sia di aiuto!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top