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

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

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

Если у кого-то есть время / любопытно / чувствуешь себя полезным, пожалуйста, вставьте приведенный ниже код на html-страницу и загрузите его в браузере. Он отлично работает в IE, но проблема проявляется в FF (3 в моем случае) и Safari, все в Windows XP.

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;
    }
  }
}
<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>


person Matt Dawdy    schedule 08.08.2008    source источник
comment
Умм, это работает в IE10 и FF: скрипка   -  person akinuri    schedule 08.10.2013


Ответы (3)


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

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

Что ж, 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 Scripting Джереми Кейт

Кроме того, пока мы говорим об этом, Bulletproof Ajax того же автора также заслуживает места на вашей книжной полке, поскольку - это JavaScript: хорошие моменты Дуга Crockford

person Polsonby    schedule 08.08.2008

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

person Kev    schedule 08.08.2008