Mam pole tekstowe autouzupełniania interfejsu jQuery UI ze zdalnym źródłem danych. Autouzupełnianie w select
wydarzenie robi trzy rzeczy:Czy zdarzenie zmiany powinno zostać wywołane, gdy wartość pola tekstowego zostanie zmieniona zarówno ręcznie, jak i programowo?
- Aktualizacje wartość pola tekstowego za pomocą jednego wybranego z listy autouzupełniania
- robi wywołanie AJAX załadować trochę więcej danych na stronie
- Przenosi fokus do innego tekstu pole (utworzony w poprzednim etapie)
pole tekstowe ma również change
zdarzenie, który usuwa załadowanych danych w kroku 2, i wyzwala AutoComplete w search
zdarzenia.
Działa to doskonale w IE (testowane z wersjami 9 i 10), ale nie w Firefoksie. Kiedy dokonuję selekcji z listy autouzupełniania, dodatkowe dane nigdy nie są wyświetlane (chociaż analizowanie ruchu sieciowego pokazuje, że wykonywane jest wywołanie AJAX) i wywoływane jest zdarzenie autouzupełniania search
. Udało mi się śledzić problem aż do Firefoksa wyzwalającego zdarzenie z pola tekstowego change
po kroku 3 powyżej, prawdopodobnie dlatego, że wpisałem coś w polu tekstowym, aby wywołać listę autouzupełniania i pomimo faktu, że pole tekstowe zostało później zaktualizowane programowo.
Krótki przykład: http://jsfiddle.net/2umrJ/1
(Dla zwięzłości, że przykładem właśnie używa keyup
wydarzenie w polu tekstowym.)
Output w IE10:
input1.focus() wyzwalane
input1.blur() wywołane
input2.focus() wywołane
Wyjście Firefox 20:
input1.focus() wyzwalane
input1.change() wywołany
input1.blur() wyzwalane
input2.focus() wyzwalane
jak można być widzianym, Firefox uruchamia zdarzenie change
, podczas gdy IE tego nie robi. Teraz wiem, że domyślnie (tj. Bez żadnego dodatkowego kodu) zdarzenie change
jest wyzwalane tylko wtedy, gdy wartość została zmieniona ręcznie, ale jakie jest prawidłowe zachowanie, gdy wartość jest zmieniana zarówno ręcznie, jak i programowo bez pola tracącego ostrość pomiędzy ?
Co ważniejsze w moim przypadku, jeśli zachowanie przeglądarki Firefox jest poprawne (a przynajmniej nie jest niepoprawne), jaki jest najlepszy sposób, aby temu zapobiec? Nie chcę, aby zdarzenie change
zostało wyzwolone, gdy ostrość zostanie zmieniona programowo, po wybraniu czegoś z listy autouzupełniania.
Co ciekawe, Firefox uruchamia zdarzenie 'change' tylko raz. W powyższym JSFiddle kolejne naciśnięcia w pierwszym polu tekstowym wyzwalają tylko 'input1.blur()' i 'input2.focus()'. To nie może być prawda, prawda? – Indrek
Sprawdziłem też skrzypce w operze i chromie - ani nie strzelam ze zdarzenia zmiany. – Zach
http://jsfiddle.net/2umrJ/2/ Spójrz na moje zaktualizowane skrzypce, a zrozumiesz, dlaczego strzelał tylko raz. (Wskazówka - bar == bar) – Zach