2011-08-23 17 views
5

Ho una funzione javascript che viene eseguita quando si preme il tasto 'giù'. Mi piacerebbe che, se il tasto 'down' fosse premuto, la funzione non funzionasse affatto.Differenzia tra tasto premuto e tenuto premuto

Ho pensato al tempo tra keydown e keyup, se il tempo è inferiore a 1 secondo, la funzione verrebbe eseguita in keyup. Il problema è che se tengo premuto il tasto il browser lo vede come il tasto premuto più volte in successione.

C'è un modo migliore per farlo?

Grazie

+1

Qual è il contesto?Se sei in una casella di testo, avrebbe senso tracciare il valore dell'input prima dell'ultimo tasto premuto, quindi verificare se sono stati aggiunti più personaggi al successivo evento di key up? Basta pescare in giro ... – Guttsy

+1

Puoi impostare un flag (ad esempio una variabile booleana) quando viene attivato il primo evento '' keydown'' (ma non se è già impostato), e disinserirlo quando viene attivato '' keyup''? –

risposta

1

Se ho ben capito il tuo problema è che il browser interpreta una chiave che si terrà come più eventi KeyDown. Vuoi che succeda qualcosa di diverso se un tasto viene tenuto contro quando viene semplicemente premuto; e tu vuoi che la differenza sia basata su un tempo che ritieni debba costituire "tenere" la chiave. Quindi è necessario differenziare tra una conservazione e una stampa rintracciando l'evento keyup. Il seguente pseudocodice risolverà questo problema:

On KeyDown:

if !yourBool 
    start timer 

yourBool = true 

su KeyUp:

if timer < yourTime 
    do something 

yourBool = false 

Ciò funzionerà perché il timer non riparte a meno che non si sia verificato keyup evento.

Ora ... se il tuo browser interpreta ritenuta della chiave come:
keydown, keyup, keydown, keyup .......
allora avete un problema con questo approccio.

0

Forse si potrebbe innescare un contatore sul keydown e poi ascoltare per la prossima keyup. Non appena il contatore supera i cinque secondi, o per quanto tempo si ritenga, è possibile avviare la funzione. Ha senso?

0

I successivi keydown non generano una chiave, quindi è possibile distinguerli.

http://jsfiddle.net/pimvdb/xMFGQ/

$('body').keydown(function() { 
    if(!$(this).data('timeDown')) { // if not pressed yet, save time 
     $(this).data('timeDown', +new Date); 
    } 
}).keyup(function() { 
    var diff = new Date - $(this).data('timeDown'); // time difference 
    if(diff < 1000) { // less than one second 
     alert(123); 
    } 
    $(this).data('timeDown', null); // reset time 
}); 
0

Il browser vede il tasto premuto molte volte ma l'evento keydown si verifica solo alla prima stampa.

Quello che si desidera è cronometrare dall'evento keydown e non keypressed.

2

Ho appena scritto questo piccolo script che distingue tra un tasto premuto e un campo chiave premuto per 200 millisecondi. Forse si può fare uso esso:

document.onkeydown = function(e){ 
    var keycode = window.event ? window.event.keyCode : e.which; 
    if(keycode == 40){ 
     var timer = setTimeout(function(){ 
      alert('Down key held'); 
      document.onkeyup = function(){}; 
     }, 200); 
     document.onkeyup = function(){ 
      clearTimeout(timer); 
      alert('Down key pressed'); 
     } 
    } 
}; 

JSFiddle

0

Ho avuto un problema simile. Volevo catturare tutti gli eventi "first" keydown, ma ignorare gli eventi successivi se erano il risultato di una chiave che veniva tenuta giù. Non so se è quello che vuoi, ma ecco un approccio:

var repeat = false; 
el.addEventListener("keyup", function() { repeat = false; }); 
el.addEventListener("keydown", function() { 
    if (!repeat) { 
    // Run your code. 
    repeat = true; 
    } 
}); 
Problemi correlati