2008-08-08 19 views
10

Poniższy kod działa świetnie w IE, ale nie w FF lub Safari. Nie mogę do końca życia zrozumieć dlaczego. Kod to , który ma być oznaczony jako, aby wyłączyć przyciski opcji, jeśli wybierzesz opcję "Wyłącz 2 przyciski radiowe". Powinien włączyć przyciski opcji, jeśli zaznaczysz opcję "Włącz oba przyciski opcji". Oba działają ...Jak włączyć wyłączone przyciski opcji?

Jeśli jednak nie używasz myszy do przechodzenia między 2 opcjami ("Włącz ..." i "Wyłącz ..."), przyciski radiowe nie wydają się być wyłączone lub włączone poprawnie, dopóki nie klikniesz nigdzie indziej na stronie (nie na samych przyciskach).

Jeśli ktoś ma czas/jest ciekawy/czuje się pomocny, wklej poniższy kod na stronę html i załaduj go w przeglądarce. Działa świetnie w IE, ale problem przejawia się w FF (3 w moim przypadku) i Safari, wszystko w Windows XP.

<html> 
    <head> 
    <script language="javascript"> 
     function SetLocationOptions() { 
     var frmTemp = document.frm; 
     var selTemp = frmTemp.user; 

     if(selTemp.selectedIndex >= 0) { 
      var myOpt = selTemp.options[selTemp.selectedIndex]; 
      if(myOpt.attributes[0].nodeValue == '1') { 
      frmTemp.transfer_to[0].disabled = true; 
      frmTemp.transfer_to[1].disabled = true; 
      frmTemp.transfer_to[2].checked = true; 
      } else { 
      frmTemp.transfer_to[0].disabled = false; 
      frmTemp.transfer_to[1].disabled = false; 
      } 
     } 
     } 
    </script> 
    </head> 

    <body> 
    <form name="frm" action="coopfunds_transfer_request.asp" method="post"> 
     <select name="user" onchange="javascript: SetLocationOptions()"> 
     <option value="" />Choose One 
     <option value="58" user_is_tsm="0" />Enable both radio buttons 
     <option value="157" user_is_tsm="1" />Disable 2 radio buttons 
     </select> 

     <br /><br /> 

     <input type="radio" name="transfer_to" value="fund_amount1" />Premium&nbsp;&nbsp;&nbsp; 
     <input type="radio" name="transfer_to" value="fund_amount2" />Other&nbsp;&nbsp;&nbsp; 
     <input type="radio" name="transfer_to" value="both" CHECKED />Both 

     <br /><br /> 

     <input type="button" class="buttonStyle" value="Submit Request" /> 
    </form> 
    </body> 
</html> 
+0

Umm, to pracuje w IE10 i FF: [skrzypce] (http: //jsfiddle.net/K6cAu/1/) – akinuri

Odpowiedz

3

Aby zmusić FF do naśladowania zachowania IE podczas używania klawiatury, można użyć zdarzenia keyup w polu wyboru. W przykładzie (nie jestem fanem dołączenie obsługi zdarzeń w ten sposób, ale to inny temat), to byłoby tak:

<select name="user" id="selUser" onchange="javascript:SetLocationOptions()" onkeyup="javascript:SetLocationOptions()"> 
3

Cóż, IE ma nieco niestandardowy model obiektowy; to, co robisz, nie powinno działać, ale uciekasz, bo IE jest dla ciebie miłe. W przeglądarkach Firefox i Safari wartość document.frm w kodzie jest niezdefiniowana.

Musisz użyć wartości id w elementach formularza i użyć document.getElementById('whatever'), aby zwrócić odniesienie do nich zamiast odwoływania się do nieistniejących właściwości obiektu dokumentu.

Tak to działa nieco lepiej i może robić to, co jesteś po:

Line 27: <form name="frm" id="f" ... 

Line 6: var frmTemp = document.getElementById('f'); 

Ale może chcesz sprawdzić to doskonałą książkę, jeśli chcesz dowiedzieć się więcej o właściwej drodze idzie o rzeczy : DOM Scripting przez Jeremy Keith

także gdy jesteśmy w tej sprawie, Bulletproof Ajax przez samego autora jest również zasługuje na miejsce na półce jak JavaScript: The Good Parts Doug Crockforda

1

Dlaczego nie g rab jedna z bibliotek skryptów AJAX, odrzucają wiele skryptów DOM opartych na czarnej przeglądarce i sprawiają, że życie staje się o wiele łatwiejsze.

Powiązane problemy