【问题标题】:Uncheck radio buttons using jQuery general selectors使用 jQuery 通用选择器取消选中单选按钮
【发布时间】:2014-06-26 06:29:32
【问题描述】:

我有以下表单(它是动态生成的,我有几个名为 form-0 到 form-3 的副本)

<form id="form-0" name="0">
<b>what is bla?</b><br>
<div class="ansN" id="ans0"><input type="radio" name="answerN" value="0"> aaa </div>
<div class="ansN" id="ans1"><input type="radio" name="answerN" value="1"> bbb </div>
<div class="ansN" id="ans2"><input type="radio" name="answerN" value="2"> ccc </div>
<div class="ansN" id="ans3"><input type="radio" name="answerN" value="3"> ddd </div>
<input type="submit" value="Submit your answer">
</form>

(忽略 div,它们用于其他目的)

尝试创建一个取消选中功能,以便对页面上的所有单选按钮起作用, 所以我玩了控制台并尝试使用以下方法取消选择它们:

$('form[id^="form-"]').find("input:radio:checked").attr('checked', false);
$('form[id^="form-"]').find("input:radio:checked").removeAttr("checked");

所以选择器确实找到了所有选中的按钮,但没有取消选中它们,为什么? 当我使用直接 JS 调用时:document.forms[0].answerN[3].checked = false 它工作正常, 所以我可以在循环中使用它,但我尽量避免在这里循环。有没有更好的办法?

我的目标是有一个取消选中的功能,所以第二次点击单选按钮本身就会取消选中它

【问题讨论】:

    标签: jquery html radio-button


    【解决方案1】:

    如果您使用的是 jQuery 1.6,则可以使用 prop() 而不是 attr() :

    $('form[id^="form-"]').find("input:radio:checked").prop('checked',false);
    
    // OR (not recommended)
    
    $('form[id^="form-"]').find("input:radio:checked").removeProp('checked');
    

    不过,根据documentation,不建议使用removeProp变体:

    请勿使用此方法删除原生属性,例如 checked、disabled 或 selected。这将完全删除该属性,并且一旦删除,就不能再次将其添加到元素中。使用 .prop() 将这些属性设置为 false。

    (感谢@noah1989 指出这一点)

    attr() 检索已在源代码中设置的值,prop() 检索当前动态设置的属性值。

    你可以看到jsFiddle example here

    【讨论】:

    • 不是could,而是should:As of jQuery 1.6, the .prop() method provides a way to explicitly retrieve property values, while .attr() only retrieves attributes.
    • @Sylvain Thrd 我试图反转您的示例,以便在单击单选按钮本身以取消选中时它会起作用:$('form[id^="form-"]').find("input:radio:checked").click(function() {     $(this).prop('checked', false); }); 并且它似乎不起作用,你知道为什么吗?跨度>
    • @IlyaD 因为你在input:radio:checked 上绑定了click() 事件,当你这样做时,没有选中单选按钮。您可以使用live(),这样一旦选中单选按钮,它将绑定到此click 事件:$('form[id^="form-"]').find("input:radio:checked").live("click", function() { $(this).prop('checked', false); });
    • 顺便说一句,我不明白您为什么要在选中单选按钮后立即取消选中它?!
    • erm.. 您能否从您的答案中删除“removeProp”变体?我花了很长时间才找到这个:“注意:不要使用此方法删除本机属性,例如选中,禁用或选中。这将完全删除该属性,一旦删除,就无法再次添加到元素。使用.prop() 将这些属性设置为 false。"
    【解决方案2】:

    您应该可以使用

    取消选中
    $('input[name=foo]').attr('checked', false);
    

    我最初的猜测是您从find 中获得了一组单选按钮。您应该使用.each() 循环它们并将每个单独的checked 属性设置为false。

    类似这样的东西(不是 testet,所以可能是语法错误)

    $('form[id^="form-"]').find("input:radio:checked").each(
      function() {
        $(this).attr('checked', false);
      }
    );
    

    【讨论】:

    • +1 在这里。如果您将 .attr 替换为 .prop 我发现这对我有用。
    【解决方案3】:
    <input type="radio" id="ra1" onclick="change('ra1')" onmousedown="getvalue('ra1')"/>
    function getvalue(id){
        ischecked = document.getElementById(id).checked;
    }
    function change(id){
        if(ischecked == false)
            document.getElementById(id).checked=true;
        else
            document.getElementById(id).checked=false;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-26
      • 2011-07-17
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2018-04-21
      相关资源
      最近更新 更多