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.

awaria systemu
źródł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.

David Hedlund
źródło
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("");
James Wiseman
źródło
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.

cjstehno
źródło
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);
alkos333
źródło
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;
    }
}})());
Igor
źródło
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 );
Laurynas
źródło
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');
        }
    });
});
Sylvain Kocet
źródło
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
                }
            });
        });
Patrick Rietveld
źródło
10

Próbować

$(this).attr("checked" , false );
Rahul
źródło
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/

Almir Campos
źródło
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

Jitendra Damor
źródło
5

Użyj tego

$("input[name='nameOfYourRadioButton']").attr("checked", false);
CrsCaballero
źródło
4
$('#frm input[type="radio":checked]').each(function(){
   $(this).checked = false;  
  });

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

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

alecellis1985
źródło
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);
Keivan Kashani
źródło
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

Menotti
źródło
-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.

Eduardo Andres Mesa Caceres
źródło
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]

Zapisać
źródło