Es 2012, la era de la post-PC está aquí, y todavía tenemos que luchar con algo tan básico como este. Esto debería ser muy simple.
Hasta el momento en que el sueño se ha cumplido, aquí está la mejor manera de hacer esto, entre navegadores: utilizar una combinación de los input
y onpropertychange
eventos, así:
var area = container.querySelector('textarea');
if (area.addEventListener) {
area.addEventListener('input', function() {
// event handling code for sane browsers
}, false);
} else if (area.attachEvent) {
area.attachEvent('onpropertychange', function() {
// IE-specific event handling code
});
}
El input
evento se ocupa de IE9+, FF, Chrome, Opera and Safari, y onpropertychange
se ocupa de IE8 (también funciona con IE6 y 7, pero hay algunos errores).
La ventaja de usar input
y onpropertychange
es que no se activan innecesariamente (como al pulsar las teclas o Ctrl
Shift
); así que si desea ejecutar una operación relativamente costosa cuando el contenido de la zona de texto cambia, esta es la manera de ir.
Ahora IE, como siempre, hace un trabajo a medias de soportar esto: ni input
ni onpropertychange
incendios en IE cuando los personajes son eliminarán del área de texto. Por lo tanto, si necesita manejar la eliminación de caracteres en IE, use keypress
(en oposición a usar keyup
/keydown
, ya que solo se disparan una vez, incluso si el usuario presiona y mantiene presionada una tecla).
Fuente: http://www.alistapart.com/articles/expanding-text-areas-made-elegant/
EDIT: Parece incluso la solución anterior no es perfecto, como acertadamente señaló en los comentarios: la presencia de la propiedad addEventListener
en el área de texto hace no implica que estés trabajando con un navegador sensato; de manera similar, la presencia de la propiedad attachEvent
hace no implica IE. Si desea que su código sea realmente hermético, debería considerar cambiar eso. Consulte Tim Down's comment para ver los punteros.
Solo quería enfatizar lo que Josh ya dijo, que debería usar keyup, no keydown para esto: parece que se llama keydown antes de que el cambio se realice realmente en el área de texto, por lo que estará usando la longitud incorrecta (y no se usa No sé realmente qué tan apagado está: podría estar tipeando o borrando, y podría haber seleccionado texto, lo que significa que es más que solo +/- 1). – brianmearns
¡Estoy dando un -1 aquí, lo siento! 'onkeyup' es un evento terrible para la detección de entrada. Use 'oninput' y' onpropertychange' (para soporte de IE). Ver http://whattheheadsaid.com/2010/09/effectively-detecting-user-input-in-javascript. –
El "único" problema es 'onchange' ** NO ** disparado cuando se produce un corte/pegado en el menú de contexto. – Tom