html <input type = "text" /> el evento onchange no funciona

88

Estoy intentando hacer un experimento. Lo que quiero que suceda es que cada vez que el usuario escriba algo en el cuadro de texto, se mostrará en un cuadro de diálogo. Usé la onchangepropiedad del evento para que sucediera, pero no funciona. Todavía necesito presionar el botón de enviar para que funcione. Leí sobre AJAX y estoy pensando en aprender sobre esto. ¿Todavía necesito AJAX para que funcione o es lo suficientemente simple JavaScript? Por favor ayuda.

index.php

<script type="text/javascript" src="javascript.js"> </script>

<form action="index.php" method="get">
 Integer 1: <input type="text" id="num1" name="num1" onchange="checkInput('num1');" /> <br />
 Integer 2: <input type="text" id="num2" name="num2" onchange="checkInput('num2');" /> <br />
 <input type="submit" value="Compute" />
</form>

javascript.js

function checkInput(textbox) {
 var textInput = document.getElementById(textbox).value;

 alert(textInput); 
}
Codificador novato
fuente
4
puede enviar "esto" en lugar de la identificación, por lo que no tiene que llamar a getElementById
remi bourgarel
Sí ... gracias, hice lo que Ash Burlaczenko me dijo ...
Coder novato
Con JQuery, buena solución propuesta aquí: stackoverflow.com/a/8167009/2065594
Cyril Jacquart

Respuestas:

127

onchangesolo se activa cuando el control está borroso. Intente en su onkeypresslugar.

Ignacio Vázquez-Abrams
fuente
19
No funciona para detectar cambios después de que el usuario pega desde el portapapeles
Juozas Kontvainis
19
Eso solo solucionó mi problema. Sin onkeyupembargo, prefiero , porque obtiene el nuevo valor en input('element.value')
stealthjong
4
También noto que la "pulsación de tecla" no se eleva después de presionar la tecla de retroceso, al menos cuando se usa jquery. "keyup" se eleva después de presionar y soltar la tecla de retroceso. "input" resuelve este problema y también funciona para copiar y pegar, y creo que esta es la solución adecuada aquí (como señala el usuario "99 Problemas - La sintaxis no es una" a continuación).
Patrick Finnigan
4
'onkeypres', 'onkeyup', etc. no es una solución cuando se quiere llamar a una función solo si el texto ha cambiado . Los eventos clave producen un tráfico innecesario en este caso. (¡Es muy extraño que esta respuesta haya sido elegida como una solución, especialmente con tantos votos! No la rechazo, porque no me gusta simplemente rechazar las respuestas. Prefiero dar las razones por las que es no está bien, ¡es más útil!)
Apostolos
Para HTML ≥5 o jQuery ≥1.7, hay otras soluciones a continuación, que también manejan pegar desde el portapapeles.
user202729
41

Úselo .on('input'...para monitorear cada cambio en una entrada (pegar, keyup, etc.) desde jQuery 1.7 y superior.

Para entradas estáticas y dinámicas:

$(document).on('input', '.my-class', function(){
    alert('Input changed');
});

Solo para entradas estáticas:

$('.my-class').on('input', function(){
    alert('Input changed');
});

JSFiddle con ejemplo estático / dinámico: https://jsfiddle.net/op0zqrgy/7/

rybo111
fuente
Esto funcionó perfectamente para mí, gracias. Nota para otros: no olvide ejecutar el código anterior en su onLoad o algo para que 'comience' a monitorear.
Robert Penridge
Demasiado tarde para un comentario, pero ... ¿Por qué sugiere usar jQuery si el usuario que responde muestra JavaScript simple?
Andrés Morales
@ AndrésMorales Es una biblioteca común a la que muchas aplicaciones tienen acceso inmediato y es fácil de agregar a las que no lo tienen. Obviamente, esta respuesta no se aplica a aquellas aplicaciones que no pueden (o eligen no hacerlo) usar jQuery.
rybo111
@ rybo111 ¡Exactamente! jQuery es una biblioteca común y ampliamente utilizada, pero enlaza directamente en mi cerebro a la pregunta del meme sobre "suma dos números usando JavaScript" y la respuesta más votada sobre el uso de jQuery para hacerlo. No es el caso, pero muchas personas no pueden separar JavaScript y jQuery.
Andrés Morales
@ AndrésMorales Note que mi respuesta cubre "pegar, keyup, etc". Recuerdo que la solución jQuery fue conveniente cuando respondí esta pregunta (¡hace 7 años!).
rybo111
30

La verificación de las pulsaciones de teclas es solo una solución parcial, porque es posible cambiar el contenido de un campo de entrada mediante clics del mouse. Si hace clic derecho en un campo de texto, tendrá opciones de cortar y pegar que puede usar para cambiar el valor sin presionar una tecla. Del mismo modo, si la función de autocompletar está habilitada, puede hacer clic con el botón izquierdo en un campo y obtener un menú desplegable del texto ingresado anteriormente, y puede seleccionar entre sus opciones con un clic del mouse. La captura de pulsaciones de teclas no detectará ninguno de estos tipos de cambios.

Lamentablemente, no hay ningún evento "onchange" que informe los cambios inmediatamente, al menos hasta donde yo sé. Pero hay una solución que funciona para todos los casos: configure un evento de tiempo usando setInterval ().

Digamos que su campo de entrada tiene una identificación y un nombre de "ciudad":

<input type="text" name="city" id="city" />

Tener una variable global llamada "ciudad":

var city = "";

Agregue esto a la inicialización de su página:

setInterval(lookForCityChange, 100);

Luego defina una función lookForCityChange ():

function lookForCityChange()
{
    var newCity = document.getElementById("city").value;
    if (newCity != city) {
        city = newCity;
        doSomething(city);     // do whatever you need to do
    }
}

En este ejemplo, el valor de "ciudad" se comprueba cada 100 milisegundos, que puede ajustar según sus necesidades. Si lo desea, use una función anónima en lugar de definir lookForCityChange (). Tenga en cuenta que su código o incluso el navegador pueden proporcionar un valor inicial para el campo de entrada, por lo que es posible que se le notifique de un "cambio" antes de que el usuario haga algo; ajuste su código según sea necesario.

Si la idea de que un evento de temporización se active cada décima de segundo parece desgarbada, puede iniciar el temporizador cuando el campo de entrada recibe el foco y terminarlo (con clearInterval ()) en un desenfoque. No creo que sea posible cambiar el valor de un campo de entrada sin que reciba el foco, por lo que encender y apagar el temporizador de esta manera debería ser seguro.

Libélula
fuente
1
Si no es posible cambiar el valor de un campo de entrada sin que se enfoque y se produce un desenfoque cuando un elemento pierde el enfoque, ¿por qué no buscar cambios en onblur?
Pakman
¿Desea tomar medidas cuando el campo de entrada cambia o cuando pierde el foco después de un cambio? Si desea actuar de inmediato, no puede esperar a que aparezca el desenfoque.
Dragonfly
@Pakman Esa es una solución decente en algunos casos. Pero si desea hacer una búsqueda a medida que escribe, una característica muy agradable en mi opinión (¿por qué debería el usuario buscar cosas cuando la computadora puede hacerlo mucho más rápido y sin aburrirse?) - o cualquier otra cosa realmente que debe suceder cuando el texto cambia, ¿por qué no debería poder hacerlo?
The Dag
Tan triste que se trata de esto.
Chuck Batson
1
@ChuckBatson Esta respuesta es de 2012. Me di cuenta de que publicó su comentario en 2016. Vea mi respuesta si está usando jQuery, ahora es increíblemente fácil.
rybo111
26

HTML5 define un oninputevento para capturar todos los cambios directos. esto funciona para mi.

Soufiane ELH
fuente
1
también funciona con el control giratorio type = "number" (con el que onkeypress no funciona).
Bob
13

onchange solo ocurre cuando el usuario confirma el cambio al elemento de entrada, la mayoría de las veces es cuando el elemento pierde el foco.

si desea que su función se active cada vez que cambia el valor del elemento, debe usar el oninputevento; esto es mejor que los eventos de tecla arriba / abajo, ya que el valor se puede cambiar con el mouse del usuario, es decir, pegarlo o autocompletar, etc.

Lea más sobre el evento de cambio aquí.

Lea más sobre el evento de entrada aquí

99 problemas: la sintaxis no es una
fuente
11

utilizar los siguientes eventos en lugar de "onchange"

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)
metaforce
fuente
6

En primer lugar, ¿qué 'no funciona'? ¿No ves la alerta?

Además, su código podría simplificarse a esto

<input type="text" id="num1" name="num1" onkeydown="checkInput(this);" /> <br />

function checkInput(obj) {
    alert(obj.value); 
}
Fresno Burlaczenko
fuente
2

Encontré problemas en los que Safari no activaba eventos "onchange" en un campo de entrada de texto. Usé un evento de "cambio" de jQuery 1.7.2 y tampoco funcionó. Terminé usando el evento de cambio de texto de ZURB. Funciona con eventos de ratón y puede disparar sin salir del campo:
http://www.zurb.com/playground/jquery-text-change-custom-event

$('.inputClassToBind').bind('textchange', function (event, previousText) {
    alert($(this).attr('id'));
});
James Moberg
fuente
2

Un par de comentarios que en mi opinión son importantes:

  • Los elementos de entrada no emiten el evento 'cambio' hasta que la acción del USUARIO ENTRAR o el desenfoque esperan ES el comportamiento correcto .

  • El evento que desea utilizar es "input"(" oninput "). Aquí está bien demostrado la diferencia entre los dos: https://javascript.info/events-change-input

  • Los dos eventos señalan dos gestos / momentos diferentes del usuario (el evento "entrada" significa que el usuario está escribiendo o navegando por una lista de opciones seleccionadas, pero aún no confirmó el cambio. "Cambio" significa que el usuario cambió el valor (con una entrada o un desenfoque nuestra)

  • Escuchar eventos clave como muchos de los recomendados aquí es una mala práctica en este caso. (como personas que modifican el comportamiento predeterminado de ENTER en las entradas) ...

  • jQuery no tiene nada que ver con esto. Todo esto está en estándar HTML.

  • Si tiene problemas para entender POR QUÉ este es el comportamiento correcto, tal vez sea útil, como experimento, use su editor de texto o navegador sin un mouse / pad, solo un teclado.

Mis dos centavos.

cancerbero
fuente
1

onkeyup funcionó para mí. onkeypress no se dispara al presionar el espacio atrás.

Bishnu Paudel
fuente
¿Qué pasa cuando se pega un valor? También uso "onpaste" para activar el evento
Louis
1

Es mejor usar onchange(event)con <select>. Con <input>puede utilizar el siguiente evento:

- onkeyup(event)
- onkeydown(event)
- onkeypress(event)
Bhavin Patel
fuente
-3

prueba onpropertychange. solo funciona para IE.

jack jiao
fuente
6
¿Por qué alguien querría considerar una propiedad que solo funciona en un NAVEGADOR OBSOLETO que ha sido abandonado por su desarrollador? Votar en contra.
Sod Almighty