2010-02-24 17 views
9

Cada vez que tengo que escribir un fragmento de código JavaScript que controla un cuadro de entrada, por lo general terminan haciendo algo como:¿Hay un evento DOM "contenido de texbox cambiado"?

$("#field").keyup(myHandler).keydown(myHandler).change(myHandler); 

No es perfecto, pero por lo general funciona en la mayoría de los casos, y por lo que seguir adelante . Solo tengo un poco de tiempo para investigar esto correctamente. Probablemente el principal problema es que no detecta las ediciones hechas a través del mouse (clic con el botón derecho + pegar/cortar). Además, no es realmente lo que quiero. Esto captura todos los movimientos del cursor y otros eventos de teclado que no estoy realmente interesado en lo que la pregunta es:.

¿Hay un evento multi-navegador confiable que se dispara cada vez que después de el contenido de una entrada o ¿Cambios de textarea?

Durante una breve búsqueda, encontré los eventos onpropertychange y DOMAttrModified. Pero aparte del hecho de que no funcionan en todos los navegadores, no parecen ser disparados cuando se edita una entrada o un área de texto.

+0

Quizás una pregunta estúpida, pero ¿por qué 'onchange' no es una opción aquí? ¿Dispara demasiado temprano? –

+0

Se dispara demasiado tarde; se dispara solo cuando se deja el cuadro de texto. –

Respuesta

6

Parece que, al menos, las últimas versiones de Internet Explorer, Firefox, Chrome y Safari todo el apoyo y las cutpaste eventos, que se activan inmediatamente después de texto se corta o se pega en un elemento de entrada dada. Los eventos se desencadenan mediante las interacciones con el teclado y. Escuchar una combinación de estos y otros eventos debe proporcionar la funcionalidad que está buscando.

$("#foo").bind("keyup keydown change paste cut", handler); 

He probado esto en un Mac en Firefox 3.6, Chrome 5.0 (dev), y Safari 4, y en Windows en Firefox 3.5 e IE8.

+0

Buen consejo. ¿Por qué no presionar teclas en lugar de keyup, keydown? –

+0

Dependiendo del navegador, el evento 'keypress' no se activa en todos los casos. Por ejemplo, cuando se presiona la tecla Control, 'keydown' y' keyup' se activarán, pero 'keypress' will * not *. Supongo que no importa en este caso, pero dado que el ejemplo del OP utilizó 'keydown' y' keyup', también lo hice. Usar 'keypress' funcionaría igual de bien aquí. –

+0

Gracias, consejo muy útil. Además, no sabía que puedes concatenar nombres de eventos como este: $ ("# foo"). Bind ("keyup keydown change paste cut", handler). –

Cuestiones relacionadas