Làm thế nào để bỏ chọn một nút radio?


482

Tôi có một nhóm các nút radio mà tôi muốn bỏ chọn sau khi biểu mẫu AJAX được gửi bằng jQuery. Tôi có chức năng sau:

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

Với sự trợ giúp của chức năng này, tôi có thể xóa các giá trị trong hộp văn bản, nhưng tôi không thể xóa các giá trị của các nút radio.

Nhân tiện, tôi cũng đã thử $(this).val("");nhưng điều đó không hiệu quả.


3
Bạn sẽ không cần mỗi chức năng. Bạn chỉ có thể gọi hàm bạn muốn trên đối tượng jQuery. Xem câu trả lời của tôi dưới đây
James Wiseman

1
không cần cho mỗi hàm () .. jQuery ("input: radio"). removeAttr ("đã kiểm tra");
Damite Jitendra ngày

Câu trả lời:


737

hoặc (js đồng bằng)

this.checked = false;

hoặc (jQuery)

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

Xem trang trợ giúp jQuery prop () để biết giải thích về sự khác biệt giữa attr ()prop () và tại sao prop () hiện được ưa thích hơn.
prop () đã được giới thiệu với jQuery 1.6 vào tháng 5 năm 2011.


29
PPL, lưu ý rằng hành vi của anh ta đang thay đổi theo hướng 1.6 prop(), trong khi .attr()sẽ bị hạn chế ở các thuộc tính thực tế
Fabiano Soriani

Vì vậy, tốt nhất là sử dụng JS đơn giản ở đây?
Doug Molineux

14
@Pete: Tôi sẽ nói rằng nếu bạn có một hệ thống được xây dựng trên jQuery, thì lợi thế bổ sung mang lại cho bạn là nếu có một trình duyệt xử lý khác nhau, bạn sẽ có thể ủy quyền hỗ trợ trình duyệt cho thư viện. Tuy nhiên, nếu phần mềm của bạn hiện không sử dụng jQuery, thì nó sẽ không đáng để sử dụng thư viện cho việc này.
David Hedlund

@David Hedlund: Tôi cho rằng bạn đang ám chỉ rằng tất cả các trình duyệt chính xử lý việc này giống như ngày nay, phải không?
Shawn

2
@qris: Vấn đề của bạn có lẽ là ở một nơi khác. Bản demo đơn giản, sử dụng jQuery 1.9 . Chắc chắn hoạt động trong Chrome của tôi.
David Hedlund

88

Bạn sẽ không cần eachchức năng

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

Hoặc là

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

Điều tương tự cũng nên áp dụng cho hộp văn bản của bạn:

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

Nhưng bạn có thể cải thiện điều này

$('#frm input:text').val("");

2
.removeAttr có khả năng gây ra sự cố.
Kzqai

Quan tâm mở rộng như thế nào? Hoặc cung cấp một liên kết?
James Wiseman

Vâng, Kzqai, tôi cũng tò mò câu trả lời của tôi đã bị bỏ phiếu cho điều này là tốt. Các tài liệu đề cập không có rủi ro.
cjstehno

1
Tài liệu liên quan thực sự có trên phương thức .prop (): api.jquery.com/prop Trích dẫn "Các thuộc tính thường ảnh hưởng đến trạng thái động của phần tử DOM mà không thay đổi thuộc tính HTML được tuần tự hóa. Ví dụ bao gồm thuộc tính giá trị của các phần tử đầu vào, thuộc tính bị vô hiệu hóa. của đầu vào và nút hoặc thuộc tính được kiểm tra của hộp kiểm. Phương thức .prop () nên được sử dụng để đặt bị vô hiệu hóa và được chọn thay vì phương thức .attr (). Phương thức .val () nên được sử dụng để nhận và cài đặt giá trị . " Điều này có nghĩa là ...
Kzqai

1
... Điều này có nghĩa là .attr () sẽ thay đổi nguồn bên dưới khác với .prop (), thuộc tính html được tuần tự hóa thay vì DOM và trong khi điều này có thể tương thích ngay bây giờ (ví dụ jQuery 1.9 có thể sửa đổi cả khi .attr () được sử dụng), điều đó không đảm bảo rằng nó sẽ được nâng cấp để sửa đổi cả trong tương lai khi .prop () là chuẩn. Ví dụ: nếu bạn sử dụng .attr ('đã kiểm tra', sai); và một thư viện bạn sử dụng bao gồm .prop ('đã kiểm tra', đúng);, sẽ có một xung đột cố hữu có thể gây ra các lỗi khó chịu.
Kzqai

29

Thử

$(this).removeAttr('checked')

Vì rất nhiều trình duyệt sẽ hiểu 'kiểm tra = bất cứ điều gì' là đúng. Điều này sẽ loại bỏ hoàn toàn thuộc tính được kiểm tra.

Hi vọng điêu nay co ich.


Ngoài ra, như một trong những câu trả lời khác đề cập, bạn sẽ không cần mỗi chức năng; bạn chỉ có thể xâu chuỗi cuộc gọi removeAttr tới bộ chọn.
cjstehno

6
LƯU Ý: phản hồi này là từ năm 2010. Vào thời điểm đó, đây là một cách tiếp cận hợp lệ và được chấp nhận. Kể từ đó nó đã trở nên phản đối.
cjstehno

21

Sửa đổi nhẹ plugin của Laurynas dựa trên mã của Igor. Điều này chứa các nhãn có thể liên quan đến các nút radio đang được nhắm mục tiêu:

(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);

1
Nó phụ thuộc vào cách các nhãn được sử dụng, nếu chúng sử dụng ID thì mã này hoạt động, nếu nút radio được lồng trong nhãn thì không. Bạn có thể sử dụng phiên bản nâng cao hơn nữa này: gist.github.com/eike/9484101
eike

20

Cảm ơn Patrick, bạn đã làm cho ngày của tôi! Đó là mousedown bạn phải sử dụng. Tuy nhiên, tôi đã cải thiện mã để bạn có thể xử lý một nhóm các nút radio.

//We need to bind click handler as well
//as FF sets button checked after mousedown, but before click
$('input:radio').bind('click mousedown', (function() {
    //Capture radio button status within its handler scope,
    //so we do not use any global vars and every radio button keeps its own status.
    //This required to uncheck them later.
    //We need to store status separately as browser updates checked status before click handler called,
    //so radio button will always be checked.
    var isChecked;

    return function(event) {
        //console.log(event.type + ": " + this.checked);

        if(event.type == 'click') {
            //console.log(isChecked);

            if(isChecked) {
                //Uncheck and update status
                isChecked = this.checked = false;
            } else {
                //Update status
                //Browser will check the button by itself
                isChecked = true;

                //Do something else if radio button selected
                /*
                if(this.value == 'somevalue') {
                    doSomething();
                } else {
                    doSomethingElse();
                }
                */
            }
    } else {
        //Get the right status before browser sets it
        //We need to use onmousedown event here, as it is the only cross-browser compatible event for radio buttons
        isChecked = this.checked;
    }
}})());

17

Viết lại mã của Igor làm plugin.

Sử dụng:

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

Cắm vào:

(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 );

Bỏ chọn không hoạt động nếu tôi nhấp vào nhãn. Vì vậy, trong khi có thể chọn radio bằng cách nhấp vào nhãn, bỏ chọn chỉ hoạt động bằng cách nhấp vào nút radio.
Simon Hürlimann

@ alkos333 có một giải pháp dường như cũng hoạt động với nhãn.
Simon Hürlimann

Nó phụ thuộc vào cách các nhãn được sử dụng, nếu chúng sử dụng ID thì mã @ alkos333 hoạt động, nếu nút radio được lồng trong nhãn, hãy sử dụng phiên bản này: gist.github.com/eike/9484101
eike

16

Đối với nhóm phát thanh và đài phát thanh:

$(document).ready(function() {
    $(document).find("input:checked[type='radio']").addClass('bounce');   
    $("input[type='radio']").click(function() {
        $(this).prop('checked', false);
        $(this).toggleClass('bounce');

        if( $(this).hasClass('bounce') ) {
            $(this).prop('checked', true);
            $(document).find("input:not(:checked)[type='radio']").removeClass('bounce');
        }
    });
});

14

Hãy thử điều này, điều này sẽ thực hiện các mẹo:

        $(document).ready(function() {
           $("input[type='radio']").mousedown(function(e) {
                if ($(this).attr("checked") == true) {
                   setTimeout("$('input[id=" + $(this).attr('id') + "]').removeAttr('checked');", 200);}
                else {
                    return true
                }
            });
        });


9

Bạn cũng có thể mô phỏng hành vi radiobutton chỉ bằng các hộp kiểm:

<input type="checkbox" class="fakeRadio" checked />
<input type="checkbox" class="fakeRadio" />
<input type="checkbox" class="fakeRadio" />

Sau đó, bạn có thể sử dụng mã đơn giản này để làm việc cho bạn:

$(".fakeRadio").click(function(){
    $(".fakeRadio").prop( "checked", false );
    $(this).prop( "checked", true );
});

Nó hoạt động tốt và bạn có nhiều quyền kiểm soát hành vi của từng nút.

Bạn có thể tự mình thử tại: http://jsfiddle.net/almircampos/n1zvrs0c/

Cái nĩa này cũng cho phép bạn bỏ chọn tất cả theo yêu cầu trong một bình luận: http://jsfiddle.net/5ry8n4f4/


Điều này là tuyệt vời, ngoại trừ bạn không thể bỏ chọn tất cả các hộp.
Stefan

6

Chỉ cần đặt đoạn mã sau cho jQuery:

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

Và đối với javascript:

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

Không cần đặt bất kỳ vòng lặp foreach, feachction .each () hay bất cứ thứ gì


5

Dùng cái này

$("input[name='nameOfYourRadioButton']").attr("checked", false);

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

Điều này gần như tốt nhưng bạn đã bỏ lỡ [0]

Đúng - >> $(this)[0].checked = false;


1
hoặc đơn giản là:this.checked = false;
eike

4

Bạn có thể sử dụng JQuery này để bỏ chọn radiobutton

$('input:radio[name="IntroducerType"]').removeAttr('checked');
                $('input:radio[name="IntroducerType"]').prop('checked', false);

1
function setRadio(obj) 
{
    if($("input[name='r_"+obj.value+"']").val() == 0 ){
      obj.checked = true
     $("input[name='r_"+obj.value+"']").val(1);
    }else{
      obj.checked = false;
      $("input[name='r_"+obj.value+"']").val(0);
    }

}

<input type="radio" id="planoT" name="planoT[{ID_PLANO}]" value="{ID_PLANO}" onclick="setRadio(this)" > <input type="hidden" id="r_{ID_PLANO}" name="r_{ID_PLANO}" value="0" >

: D


-2
$('input[id^="rad"]').dblclick(function(){
    var nombre = $(this).attr('id');
    var checked =  $(this).is(":checked") ;
    if(checked){
        $("input[id="+nombre+"]:radio").prop( "checked", false );
    }
});

Mỗi lần bạn nhấp đúp vào radio đã kiểm tra, các thay đổi được kiểm tra thành false

Bộ đàm của tôi bắt đầu bằng id=radxxxxxxxxvì tôi sử dụng bộ chọn id này.


3
Hãy viết câu trả lời bằng tiếng Anh (có thể hiểu được).
ericbn

@ericbn nếu ai đó không biết tiếng Anh thì sao?
AlphaMale

@AlphaMale tiếng Anh là ngôn ngữ chính thức trên trang web này.
Cristik

@Cristik Không phải tất cả các lập trình viên đến từ các quốc gia nói tiếng Anh. Điều đó có nghĩa là họ không thể đăng bài trên diễn đàn này? Thứ hai, đó là bạn đời 2 năm. Cảm ơn đã soi sáng cho tôi tho.
AlphaMale

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

Bộ chọn chính xác là: #frm input[type="radio"]:checked không#frm input[type="radio":checked]

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.