简体   繁体   English

如何启用禁用的单选按钮?

[英]How can I enable disabled radio buttons?

The following code works great in IE, but not in FF or Safari.以下代码在 IE 中运行良好,但不适用于 FF 或 Safari。 I can't for the life of me work out why.我终其一生都无法弄清楚原因。 The code is supposed to disable radio buttons if you select the "Disable 2 radio buttons" option.如果您选择“禁用 2 个单选按钮”选项,代码应该禁用单选按钮。 It should enable the radio buttons if you select the "Enable both radio buttons" option.如果您选择“启用两个单选按钮”选项,它应该启用单选按钮。 These both work...这两个都有效...

However, if you don't use your mouse to move between the 2 options ("Enable..." and "Disable...") then the radio buttons do not appear to be disabled or enabled correctly, until you click anywhere else on the page (not on the radio buttons themselves).但是,如果您不使用鼠标在 2 个选项(“启用...”和“禁用...”)之间移动,则单选按钮似乎不会被禁用或正确启用,直到您单击其他任何位置在页面上(而不是在单选按钮本身上)。

If anyone has time/is curious/feeling helpful, please paste the code below into an html page and load it up in a browser.如果有人有时间/好奇/觉得有帮助,请将下面的代码粘贴到 html 页面中并在浏览器中加载。 It works great in IE, but the problem manifests itself in FF (3 in my case) and Safari, all on Windows XP.它在 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>

To get FF to mimic IE's behavior when using the keyboard, you can use the keyup event on the select box.要让 FF 在使用键盘时模仿 IE 的行为,您可以在选择框上使用 keyup 事件。 In your example (I am not a fan of attaching event handlers this way, but that's another topic), it would be like this:在您的示例中(我不喜欢以这种方式附加事件处理程序,但这是另一个主题),它会是这样的:

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

Well, IE has a somewhat non-standard object model;嗯,IE 有一个有点不标准的对象模型; what you're doing shouldn't work but you're getting away with it because IE is being nice to you.你在做什么不应该工作,但你逃脱它,因为IE对你很好。 In Firefox and Safari, document.frm in your code evaluates to undefined.在 Firefox 和 Safari 中,代码中的 document.frm 评估为 undefined。

You need to be using id values on your form elements and use document.getElementById('whatever') to return a reference to them instead of referring to non-existent properties of the document object.您需要在表单元素上使用 id 值,并使用document.getElementById('whatever')返回对它们的引用,而不是引用文档对象的不存在的属性。

So this works a bit better and may do what you're after:所以这会更好一些,并且可以做你想要的:

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

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

But you might want to check out this excellent book if you want to learn more about the right way of going about things: DOM Scripting by Jeremy Keith但是,如果您想了解更多有关正确处理方式的信息,您可能想看看这本优秀的书:Jeremy Keith 的DOM Scripting

Also while we're on the subject, Bulletproof Ajax by the same author is also deserving of a place on your bookshelf as is JavaScript: The Good Parts by Doug Crockford此外,当我们讨论这个主题时,同一作者的Bulletproof Ajax也值得在您的书架上占有一席之地,就像JavaScript: Doug Crockford 的好部分一样

为什么不使用 AJAX 脚本库之一,它们抽象出许多跨浏览器 DOM 脚本黑魔法,让生活变得轻松很多。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM