Quiero detectar cada vez que el contenido de un cuadro de texto ha cambiado. Puedo usar el método de teclado, pero eso también detectará las pulsaciones de teclas que no generan letras, como las teclas de flecha. Pensé en dos métodos para hacer esto usando el evento keyup:
- Compruebe explícitamente si el código ASCII de la tecla presionada es una letra \ retroceso \ eliminar
- Use los cierres para recordar cuál era el texto en el cuadro de texto antes del golpe de tecla y verifique si esto ha cambiado.
Ambos se ven un poco engorrosos.
javascript
jquery
textbox
keypress
olamundo
fuente
fuente
.keyup()
evento ... más información aquí: stackoverflow.com/questions/3003879/….change()
si ha cambiado.Respuestas:
Comience a observar el evento 'input' en lugar de 'change'.
... que es agradable y limpio, pero puede extenderse aún más a:
fuente
Use el evento onchange en HTML / JavaScript estándar.
En jQuery ese es el evento change () . Por ejemplo:
$('element').change(function() { // do something } );
EDITAR
Después de leer algunos comentarios, ¿qué pasa con:
fuente
El evento 'cambiar' no funciona correctamente, pero la 'entrada' es perfecta.
fuente
.on
se recomienda el uso de 1.7 en adelante (en lugar de.bind
).Qué tal esto:
<jQuery 1.7
> jQuery 1.7
Esto funciona en IE8 / IE9, FF, Chrome
fuente
console.log
valor del campo, registra dos veces cada vez que ingresa un carácter.Sí. No tiene que usar cierres necesariamente, pero deberá recordar el valor anterior y compararlo con el nuevo.
¡Sin embargo! Esto todavía no captará todos los cambios, porque hay formas de editar el contenido del cuadro de texto que no implica ninguna pulsación de tecla. Por ejemplo, seleccionando un rango de texto y luego haciendo clic con el botón derecho del mouse. O arrastrándolo. O colocar texto de otra aplicación en el cuadro de texto. O cambiar una palabra a través del corrector ortográfico del navegador. O...
Entonces, si debe detectar cada cambio, debe sondearlo. Podría
window.setInterval
verificar el campo contra su valor anterior cada (digamos) segundo. También se podría conectaronkeyup
a la misma función de manera que los cambios que están causadas por las pulsaciones de teclas se reflejan más rápido.¿Incómodo? Si. Pero es eso o simplemente hazlo de la manera normal de cambio de HTML y no intentes actualizar al instante.
fuente
input
evento HTML5 es viable y funciona en las versiones actuales de todos los principales navegadores.Puede usar el evento 'input' para detectar el cambio de contenido en el cuadro de texto. No use 'live' para vincular el evento ya que está en desuso en Jquery-1.7, así que use 'on'.
fuente
Supongo que está buscando hacer algo interactivo cuando cambia el cuadro de texto (es decir, recuperar algunos datos a través de ajax). Estaba buscando esta misma funcionalidad. Sé que usar una solución global no es la más robusta o elegante, pero eso es lo que elegí. Aquí hay un ejemplo:
Una cosa clave a tener en cuenta aquí es que estoy usando setTimeout y no setInterval ya que no quiero enviar múltiples solicitudes al mismo tiempo. Esto asegura que el temporizador se "detiene" cuando se envía el formulario y "comienza" cuando se completa la solicitud. Hago esto llamando a checkSearchChanged cuando finaliza mi llamada ajax. Obviamente, puede expandir esto para verificar la longitud mínima, etc.
En mi caso, estoy usando ASP.Net MVC para que pueda ver cómo vincular esto con MVC Ajax también en la siguiente publicación:
http://geekswithblogs.net/DougLampe/archive/2010/12/21/simple-interactive-search-with-jquery-and-asp.net-mvc.aspx
fuente
Recomendaría echar un vistazo al widget de autocompletar jQuery UI. Manejaron la mayoría de los casos allí, ya que su base de código es más madura que la mayoría de los existentes.
A continuación hay un enlace a una página de demostración para que pueda verificar que funciona. http://jqueryui.com/demos/autocomplete/#default
Obtendrá el mayor beneficio al leer la fuente y ver cómo la resolvieron. Puede encontrarlo aquí: https://github.com/jquery/jquery-ui/blob/master/ui/jquery.ui.autocomplete.js .
Básicamente lo hacen todo, se unen
input, keydown, keyup, keypress, focus and blur
. Luego tienen un manejo especial para todo tipo de claves comopage up, page down, up arrow key and down arrow key
. Se usa un temporizador antes de obtener el contenido del cuadro de texto. Cuando un usuario escribe una tecla que no corresponde a un comando (tecla arriba, tecla abajo, etc.) hay un temporizador que explora el contenido después de aproximadamente 300 milisegundos. Se ve así en el código:La razón para usar un temporizador es para que la IU tenga la oportunidad de actualizarse. Cuando se ejecuta Javascript, la IU no se puede actualizar, por lo tanto, la llamada a la función de retraso. Esto funciona bien para otras situaciones, como mantener el foco en el cuadro de texto (utilizado por ese código).
Por lo tanto, puede usar el widget o copiar el código en su propio widget si no está utilizando jQuery UI (o en mi caso, desarrollando un widget personalizado).
fuente
Me gustaría preguntarle por qué está tratando de detectar cuándo el contenido del cuadro de texto cambió en tiempo real .
Una alternativa sería establecer un temporizador (a través de setIntval?) Y comparar el último valor guardado con el actual y luego restablecer un temporizador. Esto garantizaría detectar CUALQUIER cambio, ya sea causado por teclas, mouse, algún otro dispositivo de entrada que no consideró, o incluso JavaScript cambiando el valor (otra posibilidad que nadie mencionó) desde una parte diferente de la aplicación.
fuente
¿Considera usar el evento de cambio ?
fuente
Use el
textchange
evento a través de jQuery shim personalizado para lainput
compatibilidad entre navegadores . http://benalpert.com/2013/06/18/a-near-perfect-oninput-shim-for-ie-8-and-9.html (github bifurcado más recientemente: https://github.com/pandell /jquery-splendid-textchange/blob/master/jquery.splendid.textchange.js )Esto maneja todas las etiquetas de entrada
<textarea>content</textarea>
, lo que no siempre funciona conchange
keyup
etc. (!) Solo jQueryon("input propertychange")
maneja las<textarea>
etiquetas de manera consistente, y lo anterior es una imitación para todos los navegadores que no entienden elinput
evento.Prueba JS Bin
Esto también maneja pegar, eliminar y no duplica el esfuerzo en el keyup.
Si no usa una cuña, use
on("input propertychange")
eventos jQuery .fuente
Hay un ejemplo de trabajo completo aquí .
fuente
Algo como esto debería funcionar, principalmente porque
focus
yfocusout
terminaría con dos valores separados. Estoy usandodata
aquí porque almacena valores en el elemento pero no toca el DOM. También es una manera fácil de almacenar el valor conectado a su elemento. También podría usar fácilmente una variable de mayor alcance.fuente
Este código detecta cada vez que el contenido de un cuadro de texto ha cambiado por el usuario y modificado por el código Javascript.
fuente