如何取消选中单选按钮?

IT技术 javascript jquery radio-button dynamic-forms
2021-01-28 11:29:25

我有一组单选按钮,我想在使用 jQuery 提交 AJAX 表单后取消选中它们。我有以下功能:

function clearForm(){
  $('#frm input[type="text"]').each(function(){
      $(this).val("");  
  });
  $('#frm input[type="radio":checked]').each(function(){
      $(this).checked = false;  
  });
 }

借助此功能,我可以清除文本框中的值,但无法清除单选按钮的值。

顺便说一句,我也尝试过,$(this).val("");但没有奏效。

6个回答

要么(纯js)

this.checked = false;

或 (jQuery)

$(this).prop('checked', false);
// Note that the pre-jQuery 1.6 idiom was
// $(this).attr('checked', false);

有关attr()prop()之间的区别以及为什么现在更可取的原因,请参阅jQuery prop() 帮助页面 prop() 于 2011 年 5 月在 jQuery 1.6 中引入。

@Pete:我会说,如果您有一个基于 jQuery 构建的系统,那么给您带来的额外优势是,如果有浏览器以不同方式处理此问题,您将能够将浏览器支持委托给库。但是,如果您的软件当前不使用 jQuery,那么为此实际包含该库的开销是不值得的。
2021-03-23 11:29:25
@qris:您的问题可能出在其他地方。简单的演示,使用 jQuery 1.9当然适用于我的 Chrome。
2021-04-02 11:29:25
PPL,请注意他的行为在 1.6 上正在改变以支持prop(),而.attr()将仅限于实际属性
2021-04-04 11:29:25
@David Hedlund:我想您是在暗示所有主要浏览器的处理方式与今天相同,对吗?
2021-04-05 11:29:25
那么这里最好使用纯JS吗?
2021-04-11 11:29:25

你不需要这个each功能

$("input:radio").attr("checked", false);

或者

$("input:radio").removeAttr("checked");

这同样适用于您的文本框:

$('#frm input[type="text"]').val("");

但你可以改进这一点

$('#frm input:text').val("");
是的,Kzqai,我也很好奇我的回答也被否决了。文档没有提到风险。
2021-03-21 11:29:25
...这意味着 .attr() 将改变与 .prop() 不同的底层源,序列化的 html 属性而不是 DOM,虽然这现在可能兼容(例如 jQuery 1.9 可能在 .attr 时修改两者() 被使用),这并不能保证当 .prop() 是规范的时,它会在将来被修改。例如,如果您使用 .attr('checked', false); 并且您使用的库包括 .prop('checked', true);,将会存在可能导致烦人的错误的固有冲突。
2021-03-22 11:29:25
.removeAttr 可能会导致问题。
2021-03-25 11:29:25
相关文档其实是关于 .prop() 方法的:api.jquery.com/prop 引用“属性通常会影响 DOM 元素的动态状态,而不改变序列化的 HTML 属性。示例包括 input 元素的 value 属性,disabled 属性输入和按钮,或复选框的checked属性。应该使用.prop()方法来设置禁用和选中,而不是使用.attr()方法。应该使用.val()方法来获取和设置值.” 这意味着...
2021-04-05 11:29:25
关心如何扩展?或者给个链接?
2021-04-07 11:29:25

尝试

$(this).removeAttr('checked')

由于许多浏览器会将“checked=anything”解释为true。这将完全删除选中的属性。

希望这可以帮助。

此外,正如其他答案之一所提到的,您不需要 each 函数;您可以将 removeAttr 调用链接到选择器。
2021-03-15 11:29:25
注意:此回复来自 2010 年。当时,这是一种有效且可接受的方法。从那时起,它已被弃用。
2021-04-06 11:29:25

基于 Igor 的代码对 Laurynas 的插件进行了轻微修改。这容纳了与目标单选按钮相关联的可能标签:

(function ($) {
    $.fn.uncheckableRadio = function () {

        return this.each(function () {
            var radio = this;
                $('label[for="' + radio.id + '"]').add(radio).mousedown(function () {
                    $(radio).data('wasChecked', radio.checked);
                });

                $('label[for="' + radio.id + '"]').add(radio).click(function () {
                    if ($(radio).data('wasChecked'))
                        radio.checked = false;
                });
           });
    };
})(jQuery);
这取决于标签的使用方式,如果它们使用 ID,则此代码有效,如果单选按钮嵌套在标签中,则它不会。您可以使用这个更加增强的版本:gist.github.com/eikes/9484101
2021-03-30 11:29:25

将 Igor 的代码重写为插件。

利用:

$('input[type=radio]').uncheckableRadio();

插入:

(function( $ ){

    $.fn.uncheckableRadio = function() {

        return this.each(function() {
            $(this).mousedown(function() {
                $(this).data('wasChecked', this.checked);
            });

            $(this).click(function() {
                if ($(this).data('wasChecked'))
                    this.checked = false;
            });
        });

    };

})( jQuery );
@alkos333 有一个似乎也适用于标签的解决方案。
2021-03-13 11:29:25
如果我单击标签,则取消选择不起作用。因此,虽然可以通过单击标签来选择单选按钮,但只有单击单选按钮本身才能取消选择。
2021-03-14 11:29:25
这取决于标签的使用方式,如果它们使用 ID,则@alkos333 代码有效,如果单选按钮嵌套在标签中,请使用此版本:gist.github.com/eikes/9484101
2021-04-05 11:29:25