Evento 'input' de jQuery

207

Nunca he oído hablar de un evento en jQuery llamado inputhasta que vi este jsfiddle .

¿Sabes por qué está funcionando? ¿Es un alias keyupo algo así?

$(document).on('input', 'input:text', function() {});
fuego de seda
fuente
12
Excepto changesolo dispara una vez que el campo ha perdido el foco. inputdispara de inmediato.
jcsanyi
3
¿Has intentado buscarlo?
indefinido
2
@undefined Sí, de lo contrario no habría creado una pregunta para ello. Lo único que aparece en Google son artículos sobre el input elemento y cómo adjuntarle eventos.
silkfire
3
Esta pregunta responde maravillosamente a todos los conceptos - stackoverflow.com/questions/15727324/…
GemK

Respuestas:

197

Se produce cuando el contenido de texto de un elemento se cambia a través de la interfaz de usuario.

No es exactamente un alias keyupporque keyupse disparará incluso si la tecla no hace nada (por ejemplo: presionar y luego soltar la tecla Control activará un keyupevento).

Una buena manera de pensarlo es así: es un evento que se activa cada vez que cambia la entrada. Esto incluye, pero no se limita a, presionar teclas que modifican la entrada (por lo tanto, por ejemplo, Ctrlpor sí solo no activará el evento, pero Ctrl-Vpara pegar algo de texto lo hará), seleccionando una opción de autocompletar, medio de estilo Linux -Haga clic en pegar, arrastrar y soltar, y muchas otras cosas.

Vea esta página y los comentarios sobre esta respuesta para más detalles.

J David Smith
fuente
11
¿Sabes si jQuery constituye el soporte de navegador que falta? (IE8, inconsistencias IE9, etc.)
jcsanyi
44
Acabo de buscar en Google 'js input event'. Existe una habilidad especial para saber qué términos usar para encontrar lo que desea en Google; Viene con experiencia. Y luego, por supuesto, google graba todo y lo usa para aprender lo que realmente quieres. La mayoría de mis búsquedas son para documentos de API y preguntas de programación, por lo que con el tiempo aprendí que cuando busco cosas, probablemente debería mostrarme documentos de API y respuestas de programación.
J David Smith
3
Bueno, estaba buscando "evento de entrada jQuery", no tenía idea de que era un evento JS original. Lo mismo aquí, los primeros resultados son generalmente de SO, que considero principalmente como respuestas de facto / fuentes oficiales de información.
silkfire
18
inputen realidad es más que un simple filtro keyup, por ejemplo, también se activará cuando se seleccione el valor de la lista de valores utilizados anteriormente ... Era algo que sería muy difícil de manejar si no hubiera ningún inputevento.
szeryf
2
oninputtambién se dispara cuando el texto se cambia con el mouse (ya sea arrastrando y soltando, o haciendo clic con el botón derecho en el menú o con el botón central para pegar)
Denilson Sá Maia
157

oninput El evento es muy útil para rastrear los cambios en los campos de entrada.

Sin embargo, no es compatible con IE versión <9. Pero las versiones anteriores de IE tienen su propio evento propietario onpropertychangeque hace lo mismo que oninput.

Entonces puedes usarlo de esta manera:

$(':input').on('input propertychange');

Para tener un soporte completo de crossbrowser.

Dado que el cambio de propiedad se puede activar para CUALQUIER cambio de propiedad, por ejemplo, la propiedad deshabilitada se cambia, entonces desea incluir esto:

$(':input').on('propertychange input', function (e) {
    var valueChanged = false;

    if (e.type=='propertychange') {
        valueChanged = e.originalEvent.propertyName=='value';
    } else {
        valueChanged = true;
    }
    if (valueChanged) {
        /* Code goes here */
    }
});
claustrofob
fuente
10
Exactamente lo que necesitaba. Gracias. (Odio tener que soportar <IE9.)
DaleyKD
Más información: "Opera no dispara un evento de entrada después de soltar texto en un campo de entrada. IE 9 no dispara un evento de entrada cuando el usuario elimina caracteres de la entrada llenada por el teclado, corta o arrastra operaciones". developer.mozilla.org/en-US/docs/Web/Events/…
tkane2000
Hay un problema con este código. Si la longitud máxima se establece en el elemento de entrada, el evento 'entrada' se activa incluso cuando se alcanza la longitud máxima y no se cambia el valor
nivcaner
Pero, ¿por qué no solo dos funciones separadas? De esa manera, no es necesario verificar el tipo de evento o el nombre de la propiedad. El código podría estar en una tercera función compartida.
ADTC
17

Usando jQuery, los siguientes son idénticos en efecto:

$('a').click(function(){ doSomething(); });
$('a').on('click', function(){ doSomething(); });

Con el inputevento, sin embargo, solo el segundo patrón parece funcionar en los navegadores que he probado.

Por lo tanto, esperaría que esto funcione, pero NO (al menos actualmente):

$(':text').input(function(){ doSomething(); });

Una vez más, si desea aprovechar la delegación de eventos (por ejemplo, para configurar el evento #containerantes de que input.textse agregue al DOM), debe tener esto en cuenta:

$('#container').on('input', ':text', function(){ doSomething(); });

Lamentablemente, de nuevo, ¡NO funciona actualmente!

Solo este patrón funciona:

$(':text').on('input', function(){ doSomething(); });

EDITADO CON MÁS INFORMACIÓN ACTUAL

Ciertamente puedo confirmar que este patrón:

$('#container').on('input', ':text', function(){ doSomething(); });

AHORA FUNCIONA también, en todos los navegadores 'estándar'.

Ifedi Okonkwo
fuente
2

Como dijo claustrofob, oninput es compatible con IE9 +.

Sin embargo , "El evento oninput tiene errores en Internet Explorer 9. No se activa cuando los caracteres se eliminan de un campo de texto a través de la interfaz de usuario solo cuando se insertan caracteres. Aunque el evento onpropertychange es compatible con Internet Explorer 9, pero de manera similar a evento de entrada, también tiene errores, no se dispara al borrar.

Dado que los caracteres se pueden eliminar de varias maneras (teclas Retroceso y Eliminar, CTRL + X, comando Cortar y Eliminar en el menú contextual), no hay una buena solución para detectar todos los cambios. Si el comando Eliminar del menú contextual elimina los caracteres, la modificación no se puede detectar en JavaScript en Internet Explorer 9. "

Tengo buenos resultados vinculados tanto a la entrada como al keyup (y keydown, si desea que se active en IE mientras mantiene presionada la tecla Retroceso).

Zook
fuente
1

Creo que 'input' simplemente funciona aquí de la misma manera que 'oninput' lo hace en el modelo de evento DOM Nivel O.

De paso:

Justo cuando silkfire lo comentó, yo también busqué en Google 'jQuery input event'. Por lo tanto, me condujo hasta aquí y me sorprendió saber que 'input' es un parámetro aceptable para el comando bind () de jquery . En jQuery in Action (p. 102, 2008 ed.) 'Entrada' no se menciona como un posible evento (contra otros 20, desde 'desenfoque' hasta 'descarga'). Es cierto que, en la pág. 92, se podría suponer lo contrario de la relectura (es decir, de una referencia a diferentes identificadores de cadena entre los modelos de Nivel 0 y Nivel 2). Eso es bastante engañoso.

Brice Coustillas
fuente
Gracias por el aporte (sin juego de palabras), ¡este parece ser un hilo oficial ahora! :)
silkfire
0

jQuery tiene la siguiente firma para el .on()método:.on( events [, selector ] [, data ], handler )

Los eventos pueden ser cualquiera de los enumerados en esta referencia:

https://developer.mozilla.org/en-US/docs/Web/Events

Sin embargo, no todos son compatibles con todos los navegadores.

Mozilla establece lo siguiente sobre el evento de entrada:

El evento de entrada DOM se dispara sincrónicamente cuando se cambia el valor de un elemento. Además, se dispara a editores contentos cuando se cambia su contenido.

Robert Rocha
fuente
-8
$("input#myId").bind('keyup', function (e) {    
    // Do Stuff
});

trabajando tanto en IE como en Chrome

Raj
fuente
bindestá en desuso, usoon
Tushar