2008-08-08 2 views
10

Следующий код отлично работает в IE, но не в FF или Safari. Почему я не могу для жизни меня понять. Код предположил, чтобы отключить переключатели, если вы выберете опцию «Отключить 2 переключателя». Он должен включать радиокнопки, если вы выберете опцию «Включить оба переключателя». Эти обе работают ...Как включить отключенные переключатели?

Однако, если вы не используете мышь для перемещения между двумя параметрами («Включить ...» и «Отключить ...»), то переключатели не отображаются отключен или включен правильно, пока вы не нажмете нигде на странице (не на самих переключателях).

Если у кого есть время/интересно или полезно, пожалуйста, вставьте код ниже в html-страницу и загрузите его в браузере. Он отлично работает в IE, но проблема проявляется в FF (3 в моем случае) и Safari, все в 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

Гм, это работает в IE10 и FF: [скрипка] (HTTP: //jsfiddle.net/K6cAu/1/) – akinuri 2013-10-08 15:04:38

ответ

3

Чтобы заставить FF имитировать поведение IE при использовании клавиатуры, вы можете использовать событие keyup в поле выбора. В вашем примере (я не фанат прикрепления обработчиков событий таким образом, но это другая тема), это было бы так:

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

Хорошо, IE имеет несколько нестандартную объектную модель; то, что вы делаете, не должно работать, но вы уходите от него, потому что IE вам нравится. В Firefox и Safari document.frm в вашем коде оценивается как неопределенное.

Необходимо использовать значения id в своих элементах формы и использовать document.getElementById('whatever'), чтобы возвращать ссылку на них, а не ссылаться на несуществующие свойства объекта документа.

Так это работает немного лучше, и может делать то, что вы после:

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

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

Но вы можете проверить эту прекрасную книгу, если вы хотите узнать больше о правильном пути идти о том, : DOM Scripting Джереми Кит

Кроме того, пока мы на эту тему, Bulletproof Ajax того же автора также заслуживает место на книжной полке как JavaScript: The Good Parts Дуг Crockford

1

Почему не г rab - одна из библиотек скриптов AJAX, они абстрагируют много кросс-браузера DOM, создавая черную магию и делая жизнь намного проще.