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ęconchange
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:
Javascript : onchange event does not fire when value is changed in onkeyup event
https://stackoverflow.com/questions/14410870/using-both-onchange-and-onkeyup-in-ie8
Javascript: "onchange" event does not work with "value" change in "text input" object
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)
ż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ść. –
@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 –