2009-08-10 15 views
37

Po prostu zauważyłem dziwne zachowanie w IE7.IE - ukryty przycisk radiowy nie sprawdzany po kliknięciu odpowiedniej etykiety

mam przyciski radiowe z powiązanymi etykietami w następujący sposób:

<input type="radio" name="filter" id="filter_1" value="Activities" checked="checked" /> 
<label for="filter_1">Activities</label> 

<input type="radio" name="filter" id="filter_2" value="Services" /> 
<label for="filter_2">Services</label> 

Radio Przycisk jest ukryty za pośrednictwem css z display: none lub visibility: hidden (nie pytajcie)

Problem polega na tym - kiedy kliknę etykietę w IE7 (nie obejrzałem jeszcze innych wersji IE), skojarzony z nim przycisk radiowy nie jest faktycznie sprawdzany. Potwierdziłem to za pomocą jquery - zdarzenie click zdarzenia label jest uruchomione, ale zdarzenie click radio button nie jest. Formularz pocztowy potwierdza również, że zaznaczony przycisk radiowy się nie zmienia.

Działa to poprawnie w firefoxie, a także działa poprawnie, jeśli usunę CSS, który ukrywa przyciski radiowe.

Czy to jest błąd IE, czy też coś mi brakuje?

Odpowiedz

41

Prawdopodobnie ma to związek z display: none - możesz również zauważyć, że ukryte elementy nie mają wartości przesłanych z resztą formularza. Jeśli masz nad nim kontrolę, możesz spróbować positioning the elements off screen rather then hiding them.

+0

+1 Tak, to zadziała. Jestem bardziej ciekawy, czy jest to znany błąd w IE. – ScottE

+2

Nie sądzę, że jest to znany błąd, ale zachowanie, które nie jest jasno określone w specyfikacji. Patrząc na artykuł MSDN, który jest powiązany z postu, który łączyłem z powyższym, wydaje się, że takie zachowanie jest całkowicie celowe ze strony IE. Jeśli coś jest wyświetlane: żadne, to faktycznie nie jest częścią dokumentu. Państwa członkowskie postanowiły zignorować te elementy, a Mozilla postanowiła tego nie robić, nie jest tak, że jest to oczywiście słuszne lub błędne. – robertc

+9

To nie jest zbyt fajne, gdy CSS projektanta może złamać dane wchodzące w obsługę formularza dewelopera, nie przekazując dalej danych. To zachowanie źle pachnie. Dzięki za obejście problemu! – Koobz

4

Ten problem występuje w IE6, 7, 8, a nawet w bieżącej wersji 9 beta. W przypadku poprawki dobrym rozwiązaniem jest umieszczenie przycisku opcji poza ekranem.

Oto alternatywa, która nie musi angażować projektanta lub css: Ukrywanie przycisku w normalny sposób i ustawianie dowolnej funkcji dla zdarzenia kliknięcia przycisku powoduje również obsługę zdarzenia kliknięcia dla etykiety.

+3

$ ("label"). click (function (e) {e.preventDefault(); $ ("#" + $ (this) .attr ("for")). click(). change();}); – Lane

+0

Lane, to naprawdę fajne rozwiązanie. Dodaję to jako odpowiedź, więc ludzie nie przeoczą tego tak, jakbym prawie zrobił :) – bestattendance

1

Wymień

style="display:none;" 

z

style="-moz-opacity:0;filter:alpha(opacity:0);opacity:0;" 
3
$("label").click(function(e){ 
    e.preventDefault(); 
    $("#"+$(this).attr("for")).click().change(); 
}); 

Lane Dzięki za to. Dodaję to jako odpowiedź, więc ludzie nie przeoczą twojego komentarza.

+0

+1 działał świetnie dzięki @Lane – brenjt

1

Można spróbować to dla IE7,8:

input{ 
    position: absolute; 
    z-index: -1; 
} 

zamiast

input{ 
    display: none; 
} 
5

Działa to dla mnie

width: 0px; 

Testowany w IE7 i IE8. Czysty kod CSS bez javascript.

1

Istnieją pewne miłe kompilacją Twoich propozycji:

input { 
-moz-opacity:0; 
filter:alpha(opacity:0); 
opacity:0; 
position: absolute; 
} 

zamiast:

display: none; 
19

Jest to odpowiedź wiki zgromadzić wszystkie różne odpowiedzi i opcji.

Wariant 1: Przenieś element poza ekranem, a nie ukrywanie go całkowicie

position: absolute; 
top: -50px; 
left: -50px; 

Opcja 2: Użyj trochę JavaScript, aby ustawić opcję, aby sprawdził, gdy etykieta kliknięciu

$("label").click(function(e){ 
    e.preventDefault(); 
    $("#"+$(this).attr("for")).click().change(); 
}); 

Wariant 3: ustawiona szerokość i/lub mętności elementu zero

width: 0; 
/* and/or */ 
-moz-opacity:0; 
filter:alpha(opacity:0); 
opacity:0; 
outline:none; /* this prevents IE8 from having the line around it even though it's invisible */ 

Wariant 4: użyć innej przeglądarki :)

Zasadniczo, spec tych rzeczy nie wskazuje wyraźnie, jakie zachowanie w użyciu, ale IE generalnie stoi na stanowisku, że jeśli nie może być widać, to nie działa. "Widziane" i "praca" mogą oznaczać różne rzeczy, ale w tym przypadku oznacza to, że po ustawieniu display:none etykieta nie aktywuje przycisku radiowego, co prowadzi do zwykle obejść niezbędnych dla tak wielu rzeczy w IE.

+0

niesamowite! Dziękuję Ci! –

+0

Jeśli zrobisz Opcja 1 kliknięcie na etykiety spowoduje niechciane przewinięcie strony w FF, IE i Operze, ponieważ przeglądarka spróbuje ustawić ostrość na wejściu – Dan

+0

@ Nie wiem, ale "return false" onclick może naprawić to zachowanie. –

0

Używałem funkcji jQuery hide(), więc nie było łatwo zmienić sposób ukrywania elementu bez pisania bardziej złożonego kodu. Znalazłem ten pomysł: Używam klasy do przechowywania sprawdzanego atrybutu i ustaw ten atrybut ponownie przed wysłaniem.

if ($.browser.msie && $.browser.version == 7.0) { 
$('input[type=radio]').click(function() { 
    $('input[name="'+$(this).attr("name")+'"]').each(function(){ 
     if ($(this).attr("checked")){ 
      $(this).addClass("checked"); 
     }else{ 
      $(this).removeClass("checked"); 
     } 
    }); 
}); 
$('form').submit(function(){ 
    $('input.checked').each(function(){ 
     $(this).attr("checked","true"); 
    }); 
}); 
} 

Działa jak urok w moim przypadku.

Powiązane problemy