2010-02-28 7 views
5

Prototypowy detektor zdarzeń, którego używam do zmiany w wybranych menu, nie jest wyzwalany w IE.Zdarzenie.observe Zdarzenia "zmiany" nie są wyzwalane w IE

Event.observe('use_billing', 'change', Checkout.getBillingData); 

To działa prawidłowo w Firefoksie (oczywiście), ale nic się nie dzieje w IE (oczywiście) - Byłem Googling to przez jakiś czas, ale nie znalazłem odpowiedniego rozwiązania tego problemu. Czytam, że są problemy, ale nie znalazłem nic przydatnego do obejścia problemu i zmuszenia go do działania.

jestem naprawdę starają się unikać inline wyzwalaczy zdarzeń, ponieważ są natarczywe i składają się na brudny dokumentu podatne na błędy:

<select id='use_billing' onchange="Checkout.getBillingData();">....</select> 

Wszelkie pomysły byłoby świetnie - to jest jedyna rzecz, zatrzymując się ten projekt od przejścia z wersji beta do produkcji.

Odpowiedz

2

Znalazłem powód - nie był to problem ostrości, okazało się, że mam nazwę elementu formularza i wartości id tak samo - zmieniłem wartość id i wszystko działało dobrze.

3

Jest to typowy problem z IE. Nie wywołuje zdarzeń change, dopóki element nie zostanie skupiony.

Aby sprawdzić, czy to rzeczywiście jest przyczyną problemu, spróbuj zmienić menu, a następnie naciskając kartę, aby przenieść fokus na inny element. Jeśli Twój oddzwonił prawidłowo, będziesz wiedział, że nie ma innego problemu.

Rozwiązałem już wcześniej ten problem, słuchając także innych wydarzeń, takich jak click lub keydown. Możesz dodać czek do swojego wywołania zwrotnego, aby upewnić się, że wartość jest rzeczywiście różna od wcześniej, aby upewnić się, że nie przetwarzasz wydarzenia więcej niż to konieczne (ponieważ inne przeglądarki będą uruchamiać jednocześnie click i change w tym samym czasie, jeśli klikną nowa wartość).

2

Wiem, że to stary temat, ale chciałem podzielić się alternatywną odpowiedzią na powyższą. W moim kodzie nazwa i id elementu były takie same, ale to nie miało znaczenia.

W funkcji, która zostanie wywołana, argument zdarzenia został przekazany z prototypu. Aby uzyskać wartość pola tekstowego (który wzbudził zdarzenie) Firefox użyć eventArg.currentTarget.value

ale w IE trzeba użyć eventArg.srcElement.value

Tak więc w celu użycia go do pracy w obu przeglądarkach trzeba użyć ...

var value = "";
var id = "";
if(eventArg.currentTarget){//FireFox
value = eventArg.currentTarget.value;
id = eventArg.currentTarget.id;
}
else{//IE
value = eventArg.srcElement.value;
id = eventArg.srcElement.id;
}