¿Detecta el cambio de entrada en jQuery?

360

Cuando se usa jquery .changeen un inputevento, solo se disparará cuando la entrada pierda el foco

En mi caso, necesito hacer una llamada al servicio (verificar si el valor es válido) tan pronto como se cambie el valor de entrada. ¿Cómo podría lograr esto?

Banshee
fuente
3
¿Qué tipo de entrada? ¿caja de texto? ¿caja? ¿radio? textarea? veamos qué has encontrado hasta ahora
Patricia
Lo sentimos, es una entrada de texto de tipo. Y como dije, he intentado cambiar pero esto no se dispara como lo necesito (para cada cambio en el texto en la entrada). También he intentado keydown pero para que esto funcione tendré que mantener la pista apagada si la entrada está "sucia" o no.
Banshee
2
si están presionando una tecla, va a cambiar el 99% del tiempo, siempre puede hacer una verificación de las teclas que no lo harían en el controlador de eventos.
Patricia

Respuestas:

546

ACTUALIZADO para aclaraciones y ejemplos

ejemplos: http://jsfiddle.net/pxfunc/5kpeJ/

Método 1. inputevento

En los navegadores modernos, use el inputevento. Este evento se disparará cuando el usuario esté escribiendo en un campo de texto, pegando, deshaciendo, básicamente en cualquier momento que el valor cambie de un valor a otro.

En jQuery haz eso así

$('#someInput').bind('input', function() { 
    $(this).val() // get the current value of the input field.
});

comenzando con jQuery 1.7, reemplace bindcon on:

$('#someInput').on('input', function() { 
    $(this).val() // get the current value of the input field.
});

Método 2. keyupevento

Para navegadores más antiguos, use el keyupevento (esto se disparará una vez que se haya soltado una tecla del teclado, este evento puede dar una especie de falso positivo porque cuando se libera "w" el valor de entrada cambia y el keyupevento se dispara, pero también cuando Se suelta la tecla "shift" cuando se keyupdispara el evento pero no se ha realizado ningún cambio en la entrada). Además, este método no se activa si el usuario hace clic derecho y pega desde el menú contextual:

$('#someInput').keyup(function() {
    $(this).val() // get the current value of the input field.
});

Método 3. Temporizador ( setIntervalo setTimeout)

Para evitar las limitaciones keyup, puede configurar un temporizador para verificar periódicamente el valor de la entrada para determinar un cambio en el valor. Puede usar setIntervalo setTimeoutpara hacer esta verificación del temporizador. Vea la respuesta marcada en esta pregunta SO: evento de cambio de cuadro de texto jQuery o vea el violín para ver un ejemplo de trabajo usando focusy blureventos para iniciar y detener el temporizador para un campo de entrada específico

MikeM
fuente
¿Podría explicar más sobre esta solución? ¿Cómo obtengo el valor actual? ¿Y cómo hago para que esto solo se ejecute cuando se realizan cambios en el valor actual?
Banshee
evento de entrada? no hay evento de entrada en jQuery (todavía) ... stackoverflow.com/q/11189136/104380
vsync
Para el método 2, generalmente me uno a keyup y change. De esa manera, en situaciones donde la entrada ocurre sin presionar una tecla (como pegar), al menos disparará el evento cuando la entrada pierda el foco.
rspeed
1
@AdiDarachi MutationObserver rastreará los cambios en los elementos DOM. Sin embargo, un usuario que cambia datos en un campo de entrada no activa un cambio de MutationObserver ... Al configurar un caso de prueba, solo un cambio de código JS al atributo innerTexto value(simulando la entrada del usuario) activará un evento MutationObserver jsfiddle.net/pxfunc/ 04chgpws / 1 (consulte el archivo console.log para el registro de eventos de MutationObserver). ¿Tiene un caso de prueba diferente que pueda ver?
MikeM
1
esto no funciona cuando un script cambia el valor
FalcoGer
189

Si tienes HTML5:

  • oninput (se activa solo cuando se produce un cambio, pero lo hace de inmediato)

De lo contrario, debe verificar todos estos eventos que podrían indicar un cambio en el valor del elemento de entrada:

  • onchange
  • onkeyup( no keydown o keypressya que el valor de la entrada todavía no tendrá la nueva pulsación de tecla)
  • onpaste (cuando sea compatible)

y tal vez:

  • onmouseup (No estoy seguro de esto)
Alnitak
fuente
@naomik de mi prueba funciona para entradas de casilla de verificación; excepto IE / Edge. Pueden aparecer otras excepciones, pero es más inteligente usar onchange para esos tipos de entrada (en mi humilde opinión).
HellBaby
82

Con HTML5 y sin usar jQuery, puede usar el inputevento :

var input = document.querySelector('input');

input.addEventListener('input', function()
{
    console.log('input changed to: ', input.value);
});

Esto se disparará cada vez que cambie el texto de la entrada.

Compatible con IE9 + y otros navegadores.

Pruébalo en vivo en un jsFiddle aquí .

Drew Noakes
fuente
1
'cambiar' solo se dispara en el desenfoque, no cuando el texto cambia. Use el evento 'input' para detectar cambios de texto.
Dermot Doherty
14

Como otros ya sugirieron, la solución en su caso es detectar múltiples eventos .
Los complementos que realizan este trabajo a menudo escuchan los siguientes eventos:

$ input.on ('cambiar tecla presionada presionar tecla presionar mouseup hacer clic mouseup', controlador);. on ( 'cambiar tecla presionada tecla presionar tecla arriba mousedown clic mouseup' , manejador );

Si usted piensa que puede encajar, puede agregar focus, blury otros eventos también.
Sugiero no exceder en los eventos para escuchar, ya que carga en la memoria del navegador más procedimientos para ejecutar de acuerdo con el comportamiento del usuario.

Atención: tenga en cuenta que cambiar el valor de un elemento de entrada con JavaScript (por ejemplo, mediante el .val()método jQuery ) no activará ninguno de los eventos anteriores.
(Referencia: https://api.jquery.com/change/ ).

Emanuele Del Grande
fuente
También recomiendo agregar focusout para evitar problemas con el autocompletado
binar
Veo. Busqué, y parece que Focusout solo es compatible con IE y parcialmente con Chrome, ¿estoy en lo cierto?
Emanuele Del Grande
55
Así como una adición leve, Para disparar el caso de jQuery puede llamar a la acción correspondiente después de .val()ejemplo para un evento de cambio en un campo de entrada, que haría algo como esto ... $('#element').val(whatever).change()
techknowcrat
2

Si desea que se active el evento cada vez que se cambia algo dentro del elemento, puede usar el evento keyup .

Jivings
fuente
Está bien, pero ¿no es más o menos lo mismo que el keydown? ¿Tendré que verificar si la entrada está "sucia"?
Banshee
@SnowJim si solo quieres hacer cosas cuando la entrada realmente cambia, tienes que usar onchangeo rastrear el estado tú mismo. keydownno funciona porque se dispara antes de que cambie el estado de la entrada.
Alnitak
@Alnitak exactamente y es por eso que hago la pregunta aquí. El onchange no funciona, solo se lanza al salir de la entrada.
Banshee
El elefante en la habitación, por supuesto, es móvil. Estoy bastante seguro de que ningún evento de teclado o mouse será de mucha utilidad allí. : p
Askdesigners
Los eventos de activación / desactivación de @Askdesigners aún deberían funcionar de la misma manera en dispositivos móviles.
Jivings
2

// .blur se activa cuando el elemento pierde el foco

$('#target').blur(function() {
  alert($(this).val());
});

// Para disparar manualmente, use:

$('#target').blur();
Kszili
fuente
1
.change es, como dije, solo arrojado cuando el inout pierde el foco y se cambia el valor, necesito obtener un par tan pronto como se cambia la entrada (texto) (tan pronto como se cambia el texto en la entrada). El desenfoque solo se activará cuando la entrada pierda el foco.
Banshee
1

Hay eventos jQuery como keyup y keypress que puede usar con elementos HTML de entrada. También puede usar el evento blur () .

desarrollador de software
fuente
1
.change es, como dije, solo arrojado cuando el inout pierde el foco y se cambia el valor, necesito obtener un par tan pronto como se cambia la entrada (texto) (tan pronto como se cambia el texto en la entrada). El desenfoque solo se activará cuando la entrada pierda el foco.
Banshee
1
no puede verificar de manera confiable el valor de una entrada durante un keypressevento porque la tecla presionada aún no habrá cambiado ese valor.
Alnitak
0

Esto cubre cada cambio en una entrada usando jQuery 1.7 y superior:

$(".inputElement").on("input", null, null, callbackFunction);
rybo111
fuente