Как включить отключенные радиокнопки? - PullRequest
10 голосов
/ 09 августа 2008

Следующий код прекрасно работает в 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>

Ответы [ 3 ]

3 голосов
/ 09 августа 2008

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

<select name="user" id="selUser" onchange="javascript:SetLocationOptions()" onkeyup="javascript:SetLocationOptions()">
3 голосов
/ 09 августа 2008

Ну, 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 от Джереми Кейта

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

1 голос
/ 09 августа 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...