Hay muchas formas en que <input type="text">
puede cambiar el valor de una lata, incluyendo:
- pulsaciones de teclas
- copiar pegar
- modificado con JavaScript
- completado automáticamente por el navegador o una barra de herramientas
Quiero que se llame a mi función JavaScript (con el valor de entrada actual) cada vez que cambie. Y quiero que se llame de inmediato, no solo cuando la entrada pierde el foco.
Estoy buscando la forma más limpia y robusta de hacer esto en todos los navegadores (usando jQuery preferiblemente).
javascript
jquery
html
Dustin Boswell
fuente
fuente
Respuestas:
Este código jQuery detecta cambios inmediatos en cualquier elemento y debería funcionar en todos los navegadores:
fuente
input
es el evento HTML5 que creo que debería cubrir todos los navegadores modernos ( referencia MDN ).keyup
debería atrapar el resto, aunque con un ligero retraso (input
se activa al presionar la tecla).propertychange
es un evento propietario de MS, y no estoy seguro de sipaste
es realmente necesario.document.getElementById('txtInput').value = 'some text';
input
evento aquí indica que no se dispara cuando los contenidos se modifican a través de JavaScript. Sin embargo, elonpropertychange
evento se dispara en la modificación a través de JS (ver aquí ). Por lo tanto, este código funcionará cuando los contenidos se modifiquen a través de JS en IE, pero no funcionará en otros navegadores.Una solución elegante en tiempo real para jQuery> = 1.9
si también desea detectar el evento "clic", simplemente:
si está usando jQuery <= 1.4, simplemente use en
live
lugar deon
.fuente
Desafortunadamente, creo que
setInterval
gana el premio:Es la solución más limpia, con solo 1 línea de código. También es el más robusto, ya que no tiene que preocuparse por los diferentes eventos / formas en que
input
puede obtener un valor.Las desventajas de usar 'setInterval' no parecen aplicarse en este caso:
fuente
El enlace al
oninput
evento parece funcionar bien en la mayoría de los navegadores sanos. IE9 también lo admite, pero la implementación tiene errores (el evento no se activa al eliminar caracteres).Con jQuery versión 1.7+, el
on
método es útil para vincular el evento de esta manera:fuente
oninput
el evento no funcionainput[type=reset]
o la edición de JavaScript, como puede ver en esta prueba: codepen.io/yukulele/pen/xtEpbRespuesta de 2017 : el evento de entrada hace exactamente esto para algo más reciente que IE8.
fuente
input
evento no puede detectar los cambios de JS.Lamentablemente, no hay ningún evento o conjunto de eventos que coincida con sus criterios. Las pulsaciones de teclas y copiar / pegar se pueden manejar con el
keyup
evento. Los cambios a través de JS son más complicados. Si tiene control sobre el código que establece el cuadro de texto, lo mejor es modificarlo para llamar a su función directamente o activar un evento de usuario en el cuadro de texto:Si no tiene control sobre ese código, puede usarlo
setInterval()
para 'mirar' el cuadro de texto en busca de cambios:Este tipo de monitoreo activo no detectará actualizaciones 'inmediatamente', pero parece ser lo suficientemente rápido como para que no haya un retraso perceptible. Como DrLouie señaló en los comentarios, esta solución probablemente no escala bien si necesita ver muchas entradas. Siempre puede ajustar el segundo parámetro a
setInterval()
para verificar con mayor o menor frecuencia.fuente
myTextBox.value = 'foo';
ningún evento de JavaScript maneja esa situación.)input.onpropertychange
, y FF2 +, Opera 9.5, Safari 3 y Chrome 1 pueden manejarloinput.__defineSetter__('value', ...)
(que, aunque está documentado como no funcional en los nodos DOM, puedo verificar funciona). La única divergencia de la implementación de IE es que IE activa el controlador no solo en la configuración programática sino también durante los eventos clave.Aquí hay una solución ligeramente diferente si no le gustó ninguna de las otras respuestas:
Tenga en cuenta que no puede confiar en el clic y el teclado para capturar el menú contextual y pegar.
fuente
$("input[id^=Units_]").each(function() {
Agregue este código en alguna parte, esto hará el truco.
Encontré esta solución en val () no desencadena change () en jQuery
fuente
He creado una muestra. Que funcione para ti.
http://jsfiddle.net/utbh575s/
fuente
En realidad, no necesitamos configurar bucles para detectar cambios en javaScript. Ya estamos configurando muchos oyentes de eventos para el elemento que queremos detectar. simplemente desencadenar cualquier evento dañino hará el trabajo
y ofc esto solo está disponible si tiene el control total sobre los cambios de javascript en su proyecto.
fuente
Bueno, la mejor manera es cubrir esas tres bases que enumeró usted mismo. Un simple: onblur,: onkeyup, etc. no funcionará para lo que desea, así que simplemente combínelos.
KeyUp debería cubrir los dos primeros, y si Javascript está modificando el cuadro de entrada, bueno, espero que sea su propio JavaScript, así que solo agregue una devolución de llamada en la función que lo modifica.
fuente
Aquí hay un ejemplo de trabajo que estoy usando para implementar una variación de autocompletado que llena un selector jqueryui (lista), pero no quiero que funcione exactamente como el autocompletado jqueryui que hace un menú desplegable.
fuente
NO JQUERY! (De todos modos, es algo obsoleto en estos días)
Editar: eliminé los eventos HTML. NO use eventos HTML ... en lugar de eso use JavaScript Event Listeners.
fuente
¿No puedes usar
<span contenteditable="true" spellcheck="false">
element en lugar de<input type="text">
?<span>
(concontenteditable="true" spellcheck="false"
como atributos) se distingue<input>
principalmente por:<input>
.value
propiedad, pero el texto se representainnerText
y forma parte de su cuerpo interno.<input>
que no lo es aunque establezca el atributomultiline="true"
.Para lograr la apariencia, puede, por supuesto, diseñarlo en CSS, mientras escribe el valor como
innerText
puede obtener para un evento:Aquí hay un violín .
Desafortunadamente, hay algo que realmente no funciona en IE y Edge, que no puedo encontrar.
fuente
Aunque esta pregunta se publicó hace 10 años, creo que todavía necesita algunas mejoras. Entonces aquí está mi solución.
El único problema con esta solución es que no se activará si el valor cambia de javascript como
$('selector').val('some value')
. Puede activar cualquier evento a su selector cuando cambia el valor de javascript.fuente
puedes ver este ejemplo y elegir cuáles son los eventos que te interesan:
fuente
Puede que llegue tarde a la fiesta aquí, pero ¿no puedes usar el evento .change () que proporciona jQuery?
Deberías poder hacer algo como ...
Siempre puedes vincularlo a una lista de controles con algo como ...
La carpeta en vivo garantiza que se manejen todos los elementos que existen en la página ahora y en el futuro.
fuente
Esta es la forma más rápida y limpia de hacer eso:
Estoy usando Jquery ->
Funciona bastante bien para mí.
fuente