2013-08-20 12 views
5

PRZEGLĄD:onchange zdarzenie nie ognia, gdy wartość jest zmieniana w onkeyup imprezy

Piszę jQuery plugin, który konwertuje tekstowe w polu wprowadzania czasu. Oznacza to, że użytkownik może wprowadzić czas w formacie HH: MM. Częścią tego procesu jest wstawienie dwukropka (:) w odpowiednim miejscu. Na klawiaturze sprawdzam, czy użytkownik wpisał 2 cyfry, a jeśli tak, dodaje dwukropek do wprowadzonej wartości.

PROBLEM:

Podejście to działa dobrze z wyjątkiem, gdy ktoś odnosi wtyczki w polu tekstowym, ale również chce mieć zwyczaj onchange handler.This onChange obsługi nie ogień, gdy kod aktualizuje wartość pola tekstowego programowo ani uruchamia się, gdy pole tekstowe traci ostrość.

mojego zrozumienia:

zgaduję tutaj, więc proszę mnie poprawić, jeśli się mylę.

  • Może tekstowe posiada wewnętrzny "_value"(podkreślając do odróżnienia od atrybutu wartości publicznej) dziedzinie, która przechowuje wartość w polu tekstowym przed rozpoczęciem edycji. Gdy fokus pozostawia w texboksie numer , silnik JS sprawdza, czy bieżąca wartość pola tekstowego jest zgodna z "_value" w polu tekstowym. Jeśli są różne, to zdarzenie jest wywoływane.
  • Być może wartość zmienia się za pomocą zwykłego natywnego naciśnięcia klawisza, nie modyfikuj po prostu wartości "_value", więc onchange zostaje wyrzucony. Ale może zmiany wartości wprowadzone przez JS modyfikują zarówno wartość i "_value" i , więc zdarzenie onchange nie uruchamia się?

OBEJŚCIA:

rozmycia Zdarzenie, ponieważ nie ma nic wspólnego z wartością. Mogę więc wyraźnie wywołać zdarzenie change z zdarzenia blur. Ale nie chcę tego robić, ponieważ jest to hack i łamie semantykę rozmycia i zmiany.

Zobacz także:

Znalazłem kilka linków na SO z tym samym pytaniem, ale nie ma odpowiedzi (IMHO) daje elegancki lub poprawne rozwiązanie. oto niektóre z tych, które widziałam:

uproszczony kod:

$(document).ready(function() { 
    $("input").keyup(function() { 
     this.value = '*' + this.value; 
     // this changes the value, but does not fire the onchange event 
     // and it also does not fire it when the textbox loses focus. 
     // blur fires though. 
    }); 
    $("input").change(function() { 
     alert('in change'); 
    }); 

    $("input").blur(function() { 
     alert('in blur'); 
    }); 
}); 

Fiddle:

http://jsfiddle.net/sajjansarkar/vHgst/4/

PRZEGLĄDARKI Testowany: IE8,10 i Chrome. Works w Firefox (!!) (+1 Felix Kling)

+0

że wydarzenie zmiana nie ognia, jeśli ustawisz 'ele.value 'jest zwyczajowym zachowaniem. FYI, oba, 'rozmycie' zdarzenia' change' są uruchamiane w Firefoksie po tym, jak wejście traci ostrość. –

+0

@FelixKling Jeśli jest to normalne zachowanie, w jaki sposób mogę zachować zachowanie typu onchange? I interesujące spostrzeżenie, że działa w FF, będzie edytować pytanie –

Odpowiedz

1

można wyzwalać zdarzenia programowo z jquery.trigger: http://jsfiddle.net/vHgst/5/

$(this).trigger('change'); 
+0

Tak, ale kiedy mam to nazwać naśladować poprawne wydarzenie zmiany? Twój przykład będzie wywoływał zmiany dla każdego kluczowania –

Powiązane problemy