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

时间:2008-08-08 22:33:20

标签: javascript html radio-button

以下代码在IE中很有用,但在FF或Safari中却不行。我不能为我的生活找出原因。如果您选择“禁用2个单选按钮”选项,则代码假定以禁用单选按钮。如果选择“启用两个单选按钮”选项,则应启用单选按钮。这些都有效...

但是,如果您不使用鼠标在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 个答案:

答案 0 :(得分:3)

嗯,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

同样在我们谈论这个主题的同时,同一作者的Bulletproof Ajax也值得你的书架上一个地方,而道格·克罗克福德JavaScript: The Good Parts也是如此。

答案 1 :(得分:3)

要使FF在使用键盘时模仿IE的行为,您可以使用选择框上的键盘事件。在你的例子中(我不喜欢以这种方式附加事件处理程序,但这是另一个主题),它将是这样的:

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

答案 2 :(得分:1)

为什么不抓住其中一个AJAX脚本库,它们抽象出很多跨浏览器的DOM脚本黑魔法,让生活变得更加容易。