2012-06-12 14 views
5

Tenemos una entrada type = "number" y hemos establecido un método onChange.El valor que cambia manualmente no desencadena el eventoCambiar si el valor se cambió antes de programáticamente

El valor por defecto de la entrada es 0.

Luego cambiar el valor mediante programación decir, 10.

Ahora cambiamos el valor manualmente a 0 de nuevo.

El método onChange no se invoca en el cambio hecho manualmente. Creo que es porque no se llamó al evento cuando cambiamos su valor programáticamente a 10. Entonces, de alguna manera, el control piensa que el valor sigue siendo 0.

Esto ocurre solo cuando configuro manualmente el valor al valor que estaba teniendo ANTES del cambio programático. Si uso cualquier otro valor para hacer que el manual cambie, el evento onChange se desencadena correctamente.

+0

¿Puede proporcionar un ejemplo, como [jsFiddle] (http://jsfiddle.net), que demuestre esto? Además, ¿qué navegador está usando y está seguro de que [admite este tipo de entrada] (http://caniuse.com/#feat=input-number)? –

+0

esto es js en iOS safari. Lo interesante es que el problema ocurre SÓLO cuando cambio manualmente el valor al valor que tenía antes de que el programa cambiara de forma automática. En cualquier otro caso, el número de entrada desencadena perfectamente su método onchange ... –

+0

lo único que me da un buen resultado es utilizar el evento onInput en lugar de onChange ... pero no sé si traerá yo mas problemas –

Respuesta

4

Programativamente cambiar el valor de un control de formulario no desencadena su manejador de cambios, probablemente porque el evento change se especificó como que ocurre después de que el usuario haya cambiado el valor y el control perdió el foco. Los cambios programáticos no siguieron esa secuencia (programar programáticamente el enfoque y el desenfoque para imitar las acciones del usuario no ayudaron, aunque un evento de cambio programático podría enviarse en el elemento).

HTML5 introdujo un nuevo input evento que se activa siempre una entrada que recibe la entrada del usuario:

<input id="i0" oninput="alert(this.value);" value=""> 

usted podría utilizar que en lugar de onchange, pero se dispara en cada pulsación de tecla y también si el texto se pegan o arrastran a la entrada.

Tenga en cuenta que ningún navegador es totalmente compatible con HTML5 (y probablemente nunca, ya que es un destino móvil), por lo que deberá proporcionar pruebas de funciones y un mecanismo de retroceso si el evento de entrada no es compatible.

+0

Creo que el evento 'input' todavía no se activará en un cambio de entrada programática, creo que es una solución a la necesidad de rastrear la detección de entrada de campo de texto en curso sin recurrir a los eventos' keyup' 'keydown'. http://www.w3schools.com/html5/html5_ref_eventattributes.asp –

+0

Sí, tienes razón. Sin embargo, W3Schools es un sitio muy normal, afirman que "onreset no es compatible con HTML5". Por el contrario, es uno de los requisitos que deben cumplir los usuarios: [HTML5 onreset] (http://dev.w3.org/html5/spec-author-view/webappapis.html#event-handlers-on-elements- document-objects-and-window-objects) – RobG

+0

Wow, en realidad estaba buscando algo como esta lista. ¡¡Gracias!! No sé pero parece bastante difícil de navegar y buscar algo en los documentos de especificaciones W3 ... –

0

La entrada necesita enfoque para que se active el cambio. Eso es realmente una buena cosa si establecer programáticamente el valor de entrada no desencadena el evento onchange. Habría creado una configuración circular entre la entrada y el código.

Cuestiones relacionadas