Как включить отключенные переключатели?

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

Умм, это работает в IE10 и FF: рабочий пример

akinuri 08.10.2013 19:04
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
17
1
3 107
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

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

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

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

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

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

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

Ответ принят как подходящий

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

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

Другие вопросы по теме