Tengo un elemento de entrada y quiero seguir verificando la longitud de los contenidos y siempre que la longitud sea igual a un tamaño particular, quiero habilitar el botón de envío, pero estoy enfrentando un problema con el evento onchange de Javascript como evento se activa solo cuando el elemento de entrada sale del alcance y no cuando cambia el contenido.
<input type="text" id="name" onchange="checkLength(this.value)" />
---- onchange no se activa al cambiar el contenido del nombre, sino que solo se activa cuando el nombre se desenfoca.
¿Hay algo que pueda hacer para que este evento funcione en el cambio de contenido? o algún otro evento que pueda usar para esto? Encontré una solución al usar la función onkeyup, pero eso no se activa cuando seleccionamos algún contenido del autocompletado del navegador.
Quiero algo que pueda funcionar cuando el contenido del campo cambie, ya sea con el teclado o con el mouse ... ¿alguna idea?
fuente
onkeyup
yonchange
?Respuestas:
(function () { var oldVal; $('#name').on('change textInput input', function () { var val = this.value; if (val !== oldVal) { oldVal = val; checkLength(val); } }); }());
Esto cogerá
change
, pulsaciones de teclas,paste
,textInput
,input
(cuando esté disponible). Y no disparar más de lo necesario.http://jsfiddle.net/katspaugh/xqeDj/
Referencias:
textInput
- un tipo de evento W3C DOM Nivel 3. http://www.w3.org/TR/DOM-Level-3-Events/#events-texteventsinput
- un tipo de evento HTML5 .Firefox, Chrome, IE9 y otros navegadores modernos lo admiten.
fuente
textInput
Chrome 15 y funciona. Comprobé elinput
evento en IE9 y también funciona. Firefox debería ser compatibleDOMAttrModified
, pero no lo tengo instalado. Estos dos eventos son lo mejor que puede esperar, ya que se activan con cualquier tipo de entrada de texto.change
,keyup
yinput
era la mejor combinación para cubrir IE9 y Firefox (36.0.4). Elkeypress
evento no pareció funcionar en IE9 porque no capturó cosas como Eliminar y Retroceso, y elinput
evento cubre el pegado con el teclado y con el menú contextual.Como extensión a la respuesta de katspaugh, aquí hay una forma de hacerlo para múltiples elementos usando una clase css.
$('.myclass').each(function(){ $(this).attr('oldval',$(this).val()); }); $('.myclass').on('change keypress paste focus textInput input',function(){ var val = $(this).val(); if(val != $(this).attr('oldval') ){ $(this).attr('oldval',val); checkLength($(this).val()); } });
fuente
Me tomó 30 minutos encontrarlo, pero está funcionando en junio de 2019.
<input type="text" id="myInput" oninput="myFunction()">
y si desea agregar un detector de eventos mediante programación en js
inputElement.addEventListener("input", event => {})
fuente
Hazlo de la manera jQuery:
<input type="text" id="name" name="name"/> $('#name').keyup(function() { alert('Content length has changed to: '+$(this).val().length); });
fuente
Puedes usar onkeyup
<input id="name" onkeyup="checkLength(this.value)" />
fuente
Debería usar una combinación de
onkeyup
yonclick
(oonmouseup
) si desea aprovechar todas las posibilidades.<input id="name" onkeyup="checkLength(this.value)" onmouseup="checkLength(this.value)" />
fuente
setTimeout
verificar periódicamente el valor del campo ... ¿Qué es exactamente lo que quieres hacer?Aquí hay otra solución que desarrollo para el mismo problema. Sin embargo, utilizo muchos cuadros de entrada, por lo que mantengo el valor antiguo como un atributo definido por el usuario de los elementos en sí: "valor de datos". Usar jQuery es muy fácil de administrar.
$(document).delegate('.filterBox', 'keyup', { self: this }, function (e) { var self = e.data.self; if (e.keyCode == 13) { e.preventDefault(); $(this).attr('data-value', $(this).val()); self.filterBy(this, true) } else if (e.keyCode == 27) { $(this).val(''); $(this).attr('data-value', ''); self.filterBy(this, true) } else { if ($(this).attr('data-value') != $(this).val()) { $(this).attr('data-value', $(this).val()); self.filterBy(this); } } });
aquí está, utilicé 5-6 cajas de entrada con clase 'filterBox', hago que el método filterBy se ejecute solo si el valor de datos es diferente a su propio valor.
fuente