改进单选按钮的使用以启用/禁用表单字段

Posted

技术标签:

【中文标题】改进单选按钮的使用以启用/禁用表单字段【英文标题】:Improving use of radio buttons to enable/disable form fields 【发布时间】:2011-08-27 13:20:46 【问题描述】:

我有两个单选按钮和两个对应的表单域。根据选择的单选按钮,一个表单域被禁用,另一个被启用。

我的代码有效,但我认为它可以改进。现在我有两个独立的进程。当页面加载并禁用适当的字段时,检查以查看选择了哪个单选按钮。另一个在页面加载后响应用户的更改。我相信它可以简化,但我不知道如何。

$(document).ready(function() 
  if ($("#element_link_link_type_internal").is(':checked')) 
    $("#element_link_url").attr("disabled","disabled");
   else 
    $("#element_link_page_id").attr("disabled","disabled");
  
);

$(document).ready(function() 
  $("#element_link_link_type_internal").click(function()
  $("#element_link_page_id").attr("disabled","");
  $("#element_link_url").attr("disabled","disabled");
  ),
  $("#element_link_link_type_external").click(function()
  $("#element_link_page_id").attr("disabled","disabled");
  $("#element_link_url").attr("disabled","");
  );
);

谢谢!

【问题讨论】:

【参考方案1】:

这是未经测试的,基于您的 cmets/answer:

jQuery

$(document).ready(function() 

    var $type = $('input[name="element_link[link_type]"]'),
        $pageId = $("#element_link_page_id"),
        $url = $("#element_link_url");

    $type.change(function() 

        if ($type.filter(":checked").val() === "internal") 

            $pageId.removeAttr("disabled");
            $url.attr("disabled", "disabled");

         else 

            $url.removeAttr("disabled");
            $pageId.attr("disabled", "disabled");            

        

    ).change();

);

jQuery >= 1.6

$(document).ready(function() 

    var $type = $('input[name="element_link[link_type]"]'),
        $pageId = $("#element_link_page_id"),
        $url = $("#element_link_url");

    $type.change(function() 

        var isDisabled = ($type.filter(":checked").val() === "internal");

        $pageId.prop("disabled", !isDisabled);
        $url.prop("disabled", isDisabled);

    ).change();

);

【讨论】:

@Scott,你好,你能帮我解决我的问题吗,非常感谢~***.com/questions/7629817/…【参考方案2】:

@karim79,你的回答让我开始了,但是当第二个单选按钮被选中时它不起作用。它仅在选择第一个单选按钮时才有效。

我想出了这个,它似乎可以解决问题。不过,我欢迎任何人提供额外的改进。 javascript 让我大吃一惊。

$(document).ready(function() 
$("input[name='element_link[link_type]']").change(function() 
    var v = $("input[name='element_link[link_type]']:checked").val()
    $("#element_link_page_id").attr("disabled", v == 'internal' ? "" : "disabled");
    $("#element_link_url").attr("disabled", v == 'internal' ? "disabled" : "" );
).change(); // invoke once to set up initial state
);

【讨论】:

【参考方案3】:

您可以在 onchange 处理程序中测试检查状态,并在页面加载时简单地调用一次 onchange 处理程序(我相信您应该使用它而不是 onclick):

$(document).ready(function() 
    $("#element_link_link_type_internal").change(function() 
        $("#element_link_page_id").attr("disabled", !this.checked);
        $("#element_link_url").attr("disabled", this.checked);
    ).change(); // invoke once to set up initial state
);

【讨论】:

值得注意的是 jQuery Brett 使用的是什么版本,因为 1.6+ 应该使用 prop() 而不是 attr()。 @Scott - 好点,我认为你的评论成功了! :)

以上是关于改进单选按钮的使用以启用/禁用表单字段的主要内容,如果未能解决你的问题,请参考以下文章

如何根据垫单选按钮的值禁用垫输入字段?

使用单选按钮使用Foreach循环禁用下拉菜单

即使未单击单选按钮,仍会提交表单[重复]

jquery 基于单选按钮启用/禁用文本框

在选中的单选按钮上启用/禁用 RadDatePicker

启用/禁用单选按钮选择下拉菜单