2011-08-23 23 views
5

Tengo una función de javascript que se ejecuta cuando se presiona la tecla 'hacia abajo'. Me gustaría que, si se mantiene presionada la tecla 'hacia abajo', la función no se ejecute en absoluto.Diferenciar entre tecla presionada y tecla mantenida

Pensé en la sincronización entre keydown y keyup, si el tiempo es inferior a 1 segundo, la función se ejecutará en keyup. El problema es que, si mantengo presionada la tecla, el navegador la ve como la tecla presionada varias veces seguidas.

¿Hay una mejor manera de hacerlo?

Gracias

+1

¿Cuál es el contexto?Si está en un cuadro de texto, ¿tendría sentido seguir el valor de la entrada antes de presionar la última tecla, luego verificar para ver si se agregaron varios caracteres en el siguiente evento de tecla? Simplemente pescando ... – Guttsy

+1

¿Podría establecer un indicador (por ejemplo, una variable booleana) cuando el primer evento '' keydown'' se dispare (pero no si ya está configurado), y lo desactive cuando se active ''keyup''? –

Respuesta

1

Si entiendo su problema es que el navegador interpreta una clave que se celebra como múltiples eventos keydown. Desea que ocurra algo diferente si se mantiene una tecla en lugar de simplemente presionarla; y desea que esa diferencia se base en un tiempo que crea que debe constituir "retener" la clave. Por lo tanto, debe diferenciar entre una retención y una imprenta mediante el seguimiento del evento de activación. El siguiente pseudocódigo resolverá este problema:

En Keydown:

if !yourBool 
    start timer 

yourBool = true 

en keyUp:

if timer < yourTime 
    do something 

yourBool = false 

Esto funciona debido a que el temporizador no se reiniciará menos que haya ocurrido keyup evento.

Ahora ... si su navegador interpreta como custodia de llaves:
Keydown, keyUp, Keydown, keyUp .......
entonces usted tiene un problema con este enfoque.

0

Tal vez podría desencadenar un contador en keydown y luego espera que la próxima keyup. Tan pronto como el contador pase más de cinco segundos, o el tiempo que considere, podría comenzar la función. ¿Tener sentido?

0

Las teclas sucesivas no activan una tecla, por lo que es posible diferenciarlas.

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

El navegador ve presionar la tecla muchas veces, pero el evento keydown solo ocurre en la primera vez que se presiona.

Lo que desea es medir el tiempo del evento keydown y no keypressed.

2

Acabo de escribir este pequeño script que distingue entre una tecla presionada y un campo clave durante 200 milisegundos. Tal vez usted puede hacer uso de ella:

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

que tenía un problema similar. Quería capturar todos los eventos de "primer" golpe de teclado, pero ignorar sucesos sucesivos si eran el resultado de una tecla presionada. No estoy seguro si eso es lo que quiere, pero aquí hay un enfoque:

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