2011-08-14 10 views
9

Tengo un texto de entrada que obtiene su valor de una función de javascript (un temporizador con cuenta regresiva).evento de cambio no se activa cuando el cambio proviene de otra función

Quiero levantar un evento cuando el texto de entrada es 0, entonces estoy usando el change eventListener.

lamentablemente no parece plantear el evento cuando el cambio proviene de la función de JavaScript.

¿Cómo puedo forzar el cambio de evento para que funcione, incluso si el cambio proviene de javascript y no del usuario?

Gracias por cualquier ayuda

Respuesta

13

Desde el fine manual:

cambio
El evento de cambio se produce cuando un control pierde el foco de entrada y su valor se ha modificado desde que obtuvo el foco. Este evento es válido para INPUT, SELECT y TEXTAREA. elemento.

Cuando modifica el valor de la entrada de texto a través del código, el evento de cambio no se disparará porque no hay cambio de foco. Puede activar el evento mismo, aunque con createEvent y dispatchEvent, por ejemplo:

el = document.getElementById('x'); 
ev = document.createEvent('Event'); 
ev.initEvent('change', true, false); 
el.dispatchEvent(ev); 

y una versión en vivo: http://jsfiddle.net/ambiguous/nH8CH/

+2

Esto no funcionará si usa cualquier método moderno de escucha de eventos; solo funcionará si usa la antigua propiedad 'onchange'. Debería usar la API de eventos DOM para disparar eventos. –

+0

@Delan: ¿Puedes decir que no he hecho JavaScript en bruto durante mucho tiempo? Lo arreglaré. –

+0

¡Muchas gracias! ¡Esto es tan simple y funciona excelente! :) – marverix

3

En la función que cambia el valor, el fuego manualmente un evento change.

var e = document.createEvent('HTMLEvents'); 
e.initEvent('change', false, false); 
some_input_element.dispatchEvent(e); 
+0

¿Tiene que ser 'HTMLEvents ¿? La versión de jQuery aparentemente usa 'Event' y la única diferencia que puedo ver es DOM nivel 2 versus nivel 3. –

+0

Hasta donde yo sé,' HTMLEvents', 'Event' y' Events' son sinónimos. –

+0

['Event'] (http://www.w3.org/TR/DOM-Level-3-Events/#events-Event) parece ser el oficial,' Events' es probable que coincida en algunos navegadores para que coincida la pluralización 'hasFeature'. –

1

Una opción más reutilizable:

function simulate_event(eventName, element) { 
    // You could set this into the prototype as a method. 
    var event; 

    if (document.createEvent) { 
     event = document.createEvent("HTMLEvents"); 
     event.initEvent(eventName, true, true); 
    } else { 
     event = document.createEventObject(); 
     event.eventType = eventName; 
    }; 

    event.eventName = eventName; 

    if (document.createEvent) { 
     element.dispatchEvent(event); 
    } else { 
     element.fireEvent("on" + event.eventName, event); 
    } 
}; 
Cuestiones relacionadas