Jak odznaczyć przycisk opcji?


482

Mam grupę przycisków opcji, które chcę odznaczyć po przesłaniu formularza AJAX za pomocą jQuery. Mam następującą funkcję:

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

Za pomocą tej funkcji mogę wyczyścić wartości w polach tekstowych, ale nie mogę wyczyścić wartości przycisków opcji.

Nawiasem mówiąc, też próbowałem $(this).val(""); ale to nie działało.


3
Nie potrzebujesz każdej funkcji. Możesz po prostu wywołać żądaną funkcję na obiekcie jQuery. Zobacz moją odpowiedź poniżej
James Wiseman,

1
nie ma potrzeby korzystania z każdej funkcji (). jQuery („input: radio”). removeAttr („zaznaczone”);
Jitendra Damor

Odpowiedzi:


737

albo (zwykły js)

this.checked = false;

lub (jQuery)

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

Zobacz stronę pomocy jQuery prop (), aby uzyskać wyjaśnienie różnicy między attr () i prop () i dlaczego prop () jest teraz preferowany.
prop () został wprowadzony wraz z jQuery 1.6 w maju 2011 roku.


29
PPL, pamiętaj, że jego zachowanie zmienia się na 1.6 na korzyść prop(), podczas gdy .attr()będzie ograniczone do faktycznych atrybutów
Fabiano Soriani

Więc czy najlepiej tutaj używać zwykłego JS?
Doug Molineux,

14
@Pete: Powiedziałbym, że jeśli masz system zbudowany na jQuery, to dodatkową zaletą, która daje ci to, że jeśli kiedykolwiek będzie przeglądarka, która obsługuje to inaczej, będziesz mógł przekazać obsługę przeglądarki do biblioteki. Jeśli jednak twoje oprogramowanie nie korzysta obecnie z jQuery, nie byłoby warte narzucenia włączenia biblioteki właśnie do tego.
David Hedlund,

@David Hedlund: Przypuszczam, że sugerujesz, że wszystkie główne przeglądarki obsługują to w taki sam sposób, jak dzisiaj, prawda?
Shawn

2
@qris: Twój problem jest prawdopodobnie gdzieś indziej. Proste demo przy użyciu jQuery 1.9 . Pewnie działa w moim Chrome.
David Hedlund

88

Nie potrzebujesz tej eachfunkcji

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

Lub

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

To samo powinno dotyczyć również twojego pola tekstowego:

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

Ale możesz to poprawić

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

2
.removeAttr może powodować problemy.
Kzqai,

Chcesz rozwinąć jak? Lub podać link?
James Wiseman

Tak, Kzqai, jestem również ciekawy, że moja odpowiedź również została odrzucona. Dokumentacja nie wspomina o żadnym ryzyku.
cjstehno

1
Odpowiednia dokumentacja dotyczy w rzeczywistości metody .prop (): api.jquery.com/prop Cytat „Właściwości zasadniczo wpływają na stan dynamiczny elementu DOM bez zmiany serializowanego atrybutu HTML. Przykłady obejmują właściwość value elementów wejściowych, właściwość disabled wejść i przycisków lub właściwość sprawdzone pola wyboru. Należy ustawić metodę .prop (), aby ustawić wyłączone i sprawdzone zamiast metody .attr (). Do uzyskania i ustawienia wartości należy użyć metody .val () . ” Oznacza to, że ...
Kzqai

1
... Oznacza to, że .attr () zmieni inne źródło źródłowe niż .prop (), szeregowany atrybut HTML zamiast DOM, i chociaż może być teraz zgodny (np. JQuery 1.9 może modyfikować oba, gdy .attr () jest używany), nie ma gwarancji, że modyfikacja obu będzie poprawiona w przyszłości, gdy .prop () będzie kanoniczny. Na przykład, jeśli użyjesz .attr ('zaznaczone', false); a używana biblioteka zawiera .prop („zaznaczone”, prawda) ;, będzie nieodłączny konflikt, który może powodować irytujące błędy.
Kzqai

29

Próbować

$(this).removeAttr('checked')

Ponieważ wiele przeglądarek interpretuje „zaznaczone = cokolwiek” jako prawdziwe. Spowoduje to całkowite usunięcie zaznaczonego atrybutu.

Mam nadzieję że to pomoże.


Ponadto, jak wspomina jedna z pozostałych odpowiedzi, nie będziesz potrzebować każdej funkcji; możesz po prostu połączyć wywołanie removeAttr z selektorem.
cjstehno

6
UWAGA: odpowiedź pochodzi z 2010 r. W tym czasie było to prawidłowe i zaakceptowane podejście. Od tego czasu stał się przestarzały.
cjstehno

21

Niewielka modyfikacja wtyczki Laurynas na podstawie kodu Igora. Uwzględnia to możliwe etykiety związane z docelowymi przyciskami opcji:

(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
Zależy to od sposobu użycia etykiet, jeśli używają identyfikatorów, to ten kod działa, jeśli przycisk opcji jest zagnieżdżony w etykiecie, nie działa. Możesz użyć tej jeszcze bardziej ulepszonej wersji: gist.github.com/eikes/9484101
eikes

20

Dzięki Patrick, zrobiłeś mi dzień! To musiedown musisz użyć. Jednak poprawiłem kod, abyś mógł obsługiwać grupę przycisków opcji.

//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

Przepisz kod Igora jako wtyczkę.

Posługiwać się:

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

Podłącz:

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

Odznaczanie nie działa, jeśli kliknę etykietę. Tak więc, chociaż można wybrać radio, klikając etykietę, odznaczenie działa tylko poprzez kliknięcie samego przycisku opcji.
Simon Hürlimann

@ alkos333 ma rozwiązanie, które wydaje się również działać z etykietami.
Simon Hürlimann

Zależy to od sposobu użycia etykiet, jeśli używają identyfikatorów, to działa kod @ alkos333, jeśli przycisk opcji jest zagnieżdżony w etykiecie, użyj tej wersji: gist.github.com/eikes/9484101
eikes

16

W przypadku radia i grupy radiowej:

$(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

Spróbuj tego, to załatwi sprawę:

        $(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

Możesz także zasymulować zachowanie przycisku radiowego, używając tylko pól wyboru:

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

Następnie możesz użyć tego prostego kodu do pracy:

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

Działa dobrze i masz większą kontrolę nad zachowaniem każdego przycisku.

Możesz spróbować samemu: http://jsfiddle.net/almircampos/n1zvrs0c/

Ten widelec pozwala również odznaczyć wszystkie zgodnie z żądaniem komentarza: http://jsfiddle.net/5ry8n4f4/


To świetnie, z wyjątkiem tego, że nie można odznaczyć wszystkich pól.
Stefan

6

Wystarczy umieścić następujący kod dla jQuery:

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

I dla javascript:

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

Nie ma potrzeby umieszczania pętli foreach, funkcji .each () ani żadnych innych rzeczy



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

To prawie dobre, ale przegapiłeś [0]

Prawidłowo - >> $(this)[0].checked = false;


1
lub po prostu:this.checked = false;
Eikes

4

Możesz użyć tego JQuery do odznaczenia przycisku radiowego

$('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" >

:RE


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

Za każdym razem, gdy klikniesz dwukrotnie zaznaczone radio, zaznaczone zmieni się na false

Moje radia zaczynają się od, id=radxxxxxxxxponieważ używam tego selektora identyfikatorów.


3
Proszę napisać odpowiedź w (zrozumiałym) języku angielskim.
ericbn

@ericbn co jeśli ktoś nie zna angielskiego?
AlphaMale

@AlphaMale angielski jest językiem urzędowym na tej stronie.
Cristik

@Cristik Nie wszyscy programiści pochodzą z krajów anglojęzycznych. Czy to oznacza, że ​​nie mogą pisać na tym forum? Po drugie, to był kolega 2 lata. Dzięki za oświecenie mnie.
AlphaMale

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

Prawidłowy selektor to: #frm input[type="radio"]:checked nie#frm input[type="radio":checked]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.