Как включить отключенные переключатели?
Следующий код отлично работает в 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
<input type="radio" name="transfer_to" value="fund_amount2" />Other
<input type="radio" name="transfer_to" value="both" CHECKED />Both
<br /><br />
<input type="button" class="buttonStyle" value="Submit Request" />
</form>
</body>
</html>
Ответы
Ответ 1
Хорошо, 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: хорошие части от Doug Crockford
Ответ 2
Чтобы заставить FF имитировать поведение IE при использовании клавиатуры, вы можете использовать событие keyup в поле выбора. В вашем примере (я не поклонник прикрепления обработчиков событий таким образом, но это другая тема), это будет так:
<select name="user" id="selUser" onchange="javascript:SetLocationOptions()" onkeyup="javascript:SetLocationOptions()">
Ответ 3
Почему бы не захватить одну из библиотек скриптов AJAX, они абстрагируют много перекрестного браузера DOM, создавая черную магию и делая жизнь намного проще.