Detectar cuadro de texto de entrada modificado

289

He examinado muchas otras preguntas y he encontrado respuestas muy simples, incluido el código a continuación. Simplemente quiero detectar cuándo alguien cambia el contenido de un cuadro de texto, pero por alguna razón no funciona ... No obtengo errores de consola. Cuando establezco un punto de interrupción en el navegador en la change()función, nunca lo alcanza.

$('#inputDatabaseName').change(function () { 
    alert('test'); 
});
<input id="inputDatabaseName">
Abogado del diablo
fuente
1
solo un par de cosas para probar: déle a la entrada un tipo = "texto" y conviértalo en un elemento singleton. <input id = "inputDatabaseName" type = "text" />
szeliga
Limpié algunos códigos innecesarios, solo 7 años demasiado tarde.
Abogado del Diablo

Respuestas:

523

Puede usar el inputevento Javascript en jQuery así:

$('#inputDatabaseName').on('input',function(e){
    alert('Changed!')
});

En JavaScript puro:

document.querySelector("input").addEventListener("change",function () {
  alert("Input Changed");
})

O así:

<input id="inputDatabaseName" onchange="youFunction();"
onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();"/>
Ouadie
fuente
1
Parece que no puedo encontrar documentación para este evento, pero funciona exactamente de la manera que lo espero. ¿Alguna idea de dónde puedo encontrar la página de documentación?
Jorge Pedret
3
Puede encontrarlo en la lista de eventos HTML5: w3schools.com/tags/ref_eventattributes.asp o aquí help.dottoro.com/ljhxklln.php
Ouadie
77
Esta solución es en realidad mucho mejor que usar keyup. Por ejemplo, IE permite al usuario borrar el campo de entrada haciendo clic en una X que no activa la activación de teclas.
Georg
77
La solución más cercana hasta ahora, pero aún no funciona cuando el navegador realiza el llenado automático en los cuadros de texto.
Saumil
3
Esto es mucho mejor que la primera respuesta. Ctrl, las teclas Shift cuentan todas como keyup. Y la peor parte es que, si escribe rápido, varias entradas se registrarían como un solo evento de keyup.
octubre
173

pruebe keyup en lugar de cambiar.

<script type="text/javascript">
   $(document).ready(function () {
       $('#inputDatabaseName').keyup(function () { alert('test'); });
   });
</script>

Aquí está la documentación oficial de jQuery para .keyup () .

Scott Harwell
fuente
1
suspiro Juro que lo intenté (después de mirar esta pregunta: stackoverflow.com/questions/1443292/… ) ... ¡pero aparentemente no porque funciona ahora!
Abogado del Diablo
27
el cambio solo se activa cuando el elemento pierde el foco y se activa el teclado cuando se suelta una tecla del teclado.
Declan Cook,
99
¿Qué pasa si el usuario pega el código usando ctrl + v o arrastrando un texto seleccionado con el mouse al #inputDatabaseName? ¿Cómo lo detectas?
Radu Simionescu
55
El principal problema con esto es que todavía no tiene en cuenta si el contenido realmente cambia. Solo que se presionó un botón
Metropolis
@Metrópolis, ¿has visto mi respuesta? stackoverflow.com/a/23266812/3160597
azerafati
103

A cada respuesta le faltan algunos puntos, así que aquí está mi solución:

$("#input").on("input", function(e) {
  var input = $(this);
  var val = input.val();

  if (input.data("lastval") != val) {
    input.data("lastval", val);

    //your change action goes here 
    console.log(val);
  }

});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">
<p>Try to drag the letters and copy paste</p>

Los Input Eventincendios en la entrada del teclado , el arrastre del mouse , el autocompletado y el copiar y pegar se probaron en Chrome y Firefox. Verificar el valor anterior hace que detecte cambios reales, lo que significa no disparar al pegar lo mismo o al escribir el mismo carácter, etc.

Ejemplo de trabajo: http://jsfiddle.net/g6pcp/473/


actualizar:

Y si desea ejecutar su change function solo cuando el usuario termina de escribir y evita disparar la acción de cambio varias veces, puede intentar esto:

var timerid;
$("#input").on("input", function(e) {
  var value = $(this).val();
  if ($(this).data("lastval") != value) {

    $(this).data("lastval", value);
    clearTimeout(timerid);

    timerid = setTimeout(function() {
      //your change action goes here 
      console.log(value);
    }, 500);
  };
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input type="text" id="input">

Si el usuario comienza a escribir (por ejemplo, "foobar"), este código evita change actionque se ejecute para cada letra que escribe el usuario y solo se ejecuta cuando el usuario deja de escribir, esto es especialmente útil cuando envía la entrada al servidor (por ejemplo, buscar entradas), que servidor de manera que lo hace sólo una búsqueda de foobary no seis búsquedas para fy luego foy luego fooy foobetcétera.

azerafati
fuente
1
Este fue el primero en trabajar desde aproximadamente 6 que intenté. Increíble. Gracias.
Enkode
Casi funciona en IE9: si elimina un personaje, no activa el evento. Sin embargo, muy buena solución
Soma
@Soma, como otros dicen "romper IE no es un defecto, es una característica";) aunque IE ya no se continúa, pero si tiene una solución para eso, avísenos
azerafati
Lo sé, pero tuve que hacerlo por trabajo :( De hecho, lo hago: usar $("#input").focusout(function () {}). Cuando haces clic fuera de tu entrada, el evento se dispara. Funciona en la versión actual de Chrome y Firefox, y IE9
Soma
2
@Soma, si esa es la única forma en que funciona IE, podría usarlo a mi manera solo cambiando esta línea$("#input").on("input focusout",function(e){
azerafati
18

Las entradas de texto no activan el changeevento hasta que pierden el foco. Haga clic fuera de la entrada y se mostrará la alerta.

Si la devolución de llamada se dispara antes de que la entrada de texto pierda el foco, use el .keyup()evento.

Matt Ball
fuente
changeestá trabajando aquí: jsfiddle.net/g6pcp ; keyupalerta después de cada tecla que no es una buena manera
diEcho
1
@diEcho Creo que la alerta es solo un ejemplo para que su código funcione ... no es lo que pretende hacer al final.
Scott Harwell
@diEcho Lo que dijo Scott, fue solo para fines de prueba. Así es como depuro: D
Devil's Advocate
@ Scott, por favor, utilice un depurador adecuado en lugar de alert(). Hará la depuración mucho más fácil.
Matt Ball
13

onkeyup, onpaste, onchange, oninputparece estar fallando cuando el navegador realiza el autocompletado en los cuadros de texto. Para manejar este caso, incluya " autocomplete='off'" en su campo de texto para evitar que el navegador complete automáticamente el cuadro de texto,

P.ej,

<input id="inputDatabaseName" autocomplete='off' onchange="check();"
 onkeyup="this.onchange();" onpaste="this.onchange();" oninput="this.onchange();" />

<script>
     function check(){
          alert("Input box changed");
          // Things to do when the textbox changes
     }
</script>
Saumil
fuente
3

En mi caso, tenía un cuadro de texto adjunto a un selector de fechas. La única solución que funcionó para mí fue manejarlo dentro del evento onSelect del selector de fechas.

<input type="text"  id="bookdate">

$("#bookdate").datepicker({            
     onSelect: function (selected) {
         //handle change event here
     }
});
kmxr
fuente
0

Creo que también puedes usar keydown:

$('#fieldID').on('keydown', function (e) {
  //console.log(e.which);
  if (e.which === 8) {
    //do something when pressing delete
    return true;
  } else {
    //do something else
    return false;
  }
});
Yoosaf Abdulla
fuente
-5

TRABAJANDO:

$("#ContentPlaceHolder1_txtNombre").keyup(function () {
    var txt = $(this).val();
        $('.column').each(function () {
            $(this).show();
            if ($(this).text().toUpperCase().indexOf(txt.toUpperCase()) == -1) {
                $(this).hide();
            }
        });
    //}
});
guaroa mendez
fuente
Parece un código para una pregunta diferente ... ¿de qué se tratan los valores en mayúscula y mostrar / ocultar contenido?
Nico Haase el