2010-04-27 15 views
9

Tengo dificultades para capturar la tecla de retroceso como un evento de teclado en javascript/jQuery. En Firefox, Safari, Opera, Chrome y en el iPhone/iPad, capturo un evento keyup en un cuadro de entrada de texto como este:Capturar evento clave para retroceso

$(id_input).keyup(function(event) { 
    that.GetHints($(this).val().trim(), event, fieldName); 
}); 

Este evento captura las pulsaciones de teclado del usuario, y luego los envía a una función para emitir una llamada de búsqueda ajax.

Mi problema surge cuando un usuario desea retroceder sobre un personaje que ya ha escrito. En todos los navegadores a los que tengo acceso, excepto en mi teléfono Droid, cuando presiono la tecla de retroceso, este evento de captura captura el valor devuelto por $ (this) .val(). Trim() y lo envía a procesar en la función GetHints. En el Droid, sin embargo, ni este keyup ni un evento de keydown equivalente se activan hasta que el usuario retrocede sobre cada personaje en $ (this).

Así, por ejemplo, si escribo "cu", retroceda sobre la "u" dejando solo "c" en el campo de entrada, en todos los navegadores excepto en Droid, el evento de activación se disparará y llamará a la función GetHints("c", event, fieldName). En el Droid, el evento de teclado nunca se dispara.

¿Qué me estoy perdiendo? ¿Cómo/por qué esta tecla de retroceso, ya sea en el teclado virtual o en el teclado rígido, en mi Droid no funciona como se esperaba? ¿Cómo trabajo alrededor de esto?

+0

Solo un tiro en la oscuridad, porque suena como un problema de Android: ¿has probado los eventos de pulsación de teclas o teclas? Quizás tengas más suerte con esos. – Jon

+0

Sí, probaría la tecla presionada en lugar de la tecla – jnoreiga

Respuesta

2

Puede sondear en busca de cambios en el texto (usando setInterval). Esto probablemente sea más confiable. Por ejemplo, la tecla no se activará si el usuario hace clic derecho -> cortar. El sondeo solo sería menos receptivo, pero podría combinarlo con la tecla para mantenerlo ágil. El sondeo sería un poco más pesado en el procesador.

Pruebe algo como lo siguiente:

var oldText = ''; 
var timer = setInterval(function(){ 
    var text = $(id_input).val().trim(); 
    if(text != oldText){ 
     oldText = text; 
     that.GetHints(text, fieldName); 
    } 
}, 500); 

ajustar la duración del intervalo según sea necesario.

No estoy seguro de qué that.GetHints hace con event, pero obviamente, no sería capaz de pasar eso utilizando el método de votación (porque no hay un evento real que se dispare). ¿Es esto un problema?

Puede usar clearInterval(timer); para detener el sondeo si lo desea.

Puede mantener su función de teclado existente tal como está (para aumentar la capacidad de respuesta). Alternativamente, puede simplemente sondear para evitar llamar al that.GetHints demasiado (por ejemplo, si alguien escribe algo muy rápidamente).

Cuestiones relacionadas