2012-05-14 11 views
23

jestem zmuszony do pracy z IE8 (8.0.7601.17514) i mam to proste strony:onchange na radiobutton nie działa poprawnie w IE8

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" > 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
</head> 
<body> 
<form action="."> 
    <input type="radio" name="rad" value="1" onchange="alert(1);"/> 
    <input type="radio" name="rad" value="0" onchange="alert(0);" checked="checked"/> 
</form> 
<a href="http://google.com">some dummy link</a> 
</body> 
</html> 

Czego oczekuję jest to, że jest wybrany drugi przycisk radiowy kliknięcie pierwszego spowoduje natychmiastowe zgłoszenie alarmu. Działa to dobrze w FF.

To, co się dzieje, to fakt, że po kliknięciu pierwszego radia nic się nie dzieje. Następnie, gdy element jest rozmazany (np. Klikam gdzieś indziej, inne radio, jakiś link na stronie itp.), WTEDY alarm jest podnoszony.

Czy istnieje obejście tego problemu?

EDIT:

widocznie to zachowanie jest dokładnie według W3C spec

zmiany

Zdarzenie Zmiana występuje wtedy, gdy kontrola traci fokus i jego wartość została zmodyfikowana od czasu uzyskania ostrości. To zdarzenie jest ważne dla INPUT, SELECT i TEXTAREA. element.

(dzięki @ mu-is-too-too-short).

Rozwiązaniem tego problemu jest dodanie rozmycie onclick + ostrości:

function radioClick() 
{ 
this.blur(); 
this.focus(); 
} 


<input type="radio" name="rad" value="1" onclick="radioClick" onchange="alert(1);"/> 
+0

działa dobrze dla mnie w IE8 - http://jsfiddle.net/uMD9h/ – Pranav

+0

@Pranav nope, próbował link u wysłana w IE8 i nie będzie działać –

+0

dziwne ... to działa całkowicie w porządku dla mnie w IE8 z oknem XP. – Pranav

Odpowiedz

29

W Internet Explorerze (przynajmniej do IE8) kliknięcie przycisku radiowego lub pola wyboru w celu zmiany jego wartości w rzeczywistości nie wyzwala zdarzenia onChange, dopóki sygnał wejściowy nie zostanie skupiony.

Tak więc trzeba jakoś wyzwolić zdarzenie rozmycie siebie .. jeden suggestiong byłoby mieć funkcję: w następujący sposób:

function radioClick() 
{ 
this.blur(); 
this.focus(); 
} 


<input type="radio" name="rad" value="1" onclick="radioClick" onchange="alert(1);"/> 

Teraz to wydarzenie onchange powinna zostać uruchomiona, ale jak widać jest zbędny Kod więc lepiej jest po prostu za pomocą obsługi zdarzeń onclick.

Lepszym rozwiązaniem jest użycie nowoczesnej biblioteki javascript jak jQuery, który obsługuje wszystkie te dziwactwa dla ciebie ..

+0

Myślę, że onchange jest przeznaczony do tego ... dopóki kontrola nie straci fokusa oznacza to, że modyfikacja nadal trwa ... – Pranav

+1

ustalono .. Musiałem odpowiedzieć na pytanie. – Baz1nga

+0

http://stackoverflow.com/questions/1498987/ie-html-radio-change-event –

2

użycie onclick, ale znaczy to nazwać obsługi zdarzeń przed wartością (lub sprawdzenia atrybut) została zmieniona msdn

+0

dlaczego onclick ?? onchange jest odpowiedni do tego. – Pranav

+1

ponieważ zmiana powoduje tylko ogień, gdy element stracił ostrość w ie – sarkiroka

8

Technicznie IE rzeczywiście dostał to prawo. Od fine specification:

zmiana

Zdarzenie Zmiana występuje wtedy, gdy kontrola traci fokus i jego wartość została zmodyfikowana od czasu uzyskania ostrości. To zdarzenie jest ważne dla INPUT, SELECT i TEXTAREA. element.

Po to, aby zdarzenie zmiany mogło zostać wywołane, specyfikacja mówi, że element musi stracić ostrość (to znaczy, że wymagane jest rozmycie).Zwykłym kludge jest użycie obsługi kliknięcia lub wymuszenie rozmycia, jak sugerowali inni.

+0

+1. całkowicie się z tobą zgadzam. – Pranav