2013-04-03 11 views
5

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?

  1. Aktualizacje wartość pola tekstowego za pomocą jednego wybranego z listy autouzupełniania
  2. robi wywołanie AJAX załadować trochę więcej danych na stronie
  3. 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.

+0

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

+0

Sprawdziłem też skrzypce w operze i chromie - ani nie strzelam ze zdarzenia zmiany. – Zach

+1

http://jsfiddle.net/2umrJ/2/ Spójrz na moje zaktualizowane skrzypce, a zrozumiesz, dlaczego strzelał tylko raz. (Wskazówka - bar == bar) – Zach

Odpowiedz

3

Aby zapobiec wywoływaniu zdarzenia zmiany w firefox, chciałbym mieć coś w logice, która ustawia zmienną stwierdzającą, że jest ona zmieniana programowo, a logika zmiany zdarzenia powinna być sprawdzana, nie należy wykonywać logiki zmian jeśli jest uruchamiany programowo i zresetuj zmienną przed wyjściem.

+0

To właśnie zrobiłem. Miałem nadzieję, że jest na to bardziej elegancki sposób, a może lepszy sposób na powiązanie wydarzeń, ale działa to wystarczająco dobrze. Dzięki! – Indrek

Powiązane problemy