2011-08-14 5 views
9

Mam tekst wejściowy, który pobiera jego wartość z funkcji javascript (licznik czasu z odliczaniem).Zdarzenie onchange nie jest uruchamiane, gdy zmiana pochodzi z innej funkcji

Chcę podnieść zdarzenia, gdy tekst wejściowy jest 0, więc używam change eventListener.

Niestety nie wydaje się, aby wydarzenie, gdy zmiana pochodzi z funkcji javascript.

Jak wymusić zmianę zdarzenia, nawet jeśli zmiana pochodzi z javascript, a nie od użytkownika?

Dzięki za wszelką pomoc

Odpowiedz

13

Z fine manual:

zmiana
Zdarzenie Zmiana występuje wtedy, gdy kontrola traci fokus i jego wartość została zmodyfikowana od czasu uzyskania ostrości. To zdarzenie jest ważne dla INPUT, SELECT i TEXTAREA. element.

Po zmodyfikowaniu wartości wpisu tekstowego za pomocą kodu, zdarzenie zmiany nie zostanie uruchomione, ponieważ nie ma zmiany ostrości. Można wywołać samemu wydarzeniu choć createEvent i dispatchEvent, na przykład:

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

oraz wersja na żywo: http://jsfiddle.net/ambiguous/nH8CH/

+2

To nie zadziała, jeśli użyjesz jakiejkolwiek nowoczesnej metody nasłuchiwania zdarzeń; będzie działać tylko wtedy, gdy użyjesz starej właściwości 'onchange'. Do uruchamiania zdarzeń używaj API zdarzeń DOM. –

+0

@Delan: Czy możesz powiedzieć, że nie robiłem surowego JavaScriptu przez długi czas? Załatwię to. –

+0

Wielkie dzięki! To jest takie proste i działa doskonale! :) – marverix

3

W funkcji, który zmienia wartość, ręcznie ogień zdarzenie change.

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

Czy trzeba być 'HTMLEvents '? Wersja jQuery najwyraźniej używa "zdarzenia", a jedyną różnicą, jaką widzę jest poziom DOM 2 w porównaniu z poziomem 3. –

+0

O ile mi wiadomo, 'HTMLEvents',' Event' i 'Events' są synonimami. –

+0

[Zdarzenie'] (http://www.w3.org/TR/DOM-Level-3-Events/#events-Event) wydaje się być oficjalnym, "Zdarzenia" prawdopodobnie w niektórych przeglądarkach pasują do siebie pluralizacja 'hasFeature'. –

1

Bardziej wielokrotnego użytku opcja:

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); 
    } 
}; 
Powiązane problemy