Come deselezionare un pulsante di opzione?


482

Ho un gruppo di pulsanti di opzione che desidero deselezionare dopo l'invio di un modulo AJAX tramite jQuery. Ho la seguente funzione:

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

Con l'aiuto di questa funzione, posso cancellare i valori nelle caselle di testo, ma non riesco a cancellare i valori dei pulsanti di opzione.

A proposito, ho anche provato, $(this).val("");ma non ha funzionato.


3
Non avresti bisogno di ciascuna funzione. Potresti semplicemente chiamare la funzione che desideri sull'oggetto jQuery. Vedi la mia risposta qui sotto
James Wiseman il

1
non c'è bisogno di ogni funzione () .. jQuery ("input: radio"). removeAttr ("controllato");
Jitendra Damor,

Risposte:


737

o (js semplice)

this.checked = false;

o (jQuery)

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

Vedi la pagina di aiuto di jQuery prop () per una spiegazione sulla differenza tra attr () e prop () e perché prop () è ora preferibile.
prop () è stato introdotto con jQuery 1.6 nel maggio 2011.


29
PPL, sappi che il suo comportamento sta cambiando in 1.6 a favore di prop(), mentre .attr()sarà limitato agli attributi reali
Fabiano Soriani,

Quindi è meglio usare JS semplice qui?
Doug Molineux,

14
@Pete: direi che se hai un sistema costruito su jQuery, il vantaggio aggiuntivo che ti dà è che se c'è mai un browser che lo gestisce in modo diverso, sarai in grado di delegare il supporto del browser alla libreria. Tuttavia, se il tuo software non utilizza attualmente jQuery, non varrebbe la pena includere effettivamente la libreria proprio per questo.
David Hedlund l'

@ David Hedlund: suppongo tu stia insinuando che tutti i principali browser lo gestiscono allo stesso modo di oggi, giusto?
Shawn,

2
@qris: il tuo problema è probabilmente altrove. Demo semplice, usando jQuery 1.9 . Sicuramente funziona nel mio Chrome.
David Hedlund,

88

Non avresti bisogno della eachfunzione

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

O

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

Lo stesso dovrebbe valere anche per la tua casella di testo:

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

Ma potresti migliorare questo

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

2
.removeAttr potrebbe causare problemi.
Kzqai,

Ti interessa espandere come? O fornire un collegamento?
James Wiseman,

Sì, Kzqai, sono anche curioso che la mia risposta sia stata votata in negativo anche per questo. La documentazione non menziona alcun rischio.
cjstehno,

1
La documentazione pertinente si trova in realtà sul metodo .prop (): api.jquery.com/prop Quote "Le proprietà generalmente influenzano lo stato dinamico di un elemento DOM senza modificare l'attributo HTML serializzato. Gli esempi includono la proprietà value degli elementi di input, la proprietà disabilitata di input e pulsanti o la proprietà selezionata di una casella di controllo. Il metodo .prop () dovrebbe essere usato per impostare disabilitato e controllato invece del metodo .attr (). Il metodo .val () dovrebbe essere usato per ottenere e impostare il valore ". Ciò significa che ...
Kzqai,

1
... Ciò significa che .attr () modificherà una fonte sottostante diversa da .prop (), l'attributo html serializzato al posto del DOM, e mentre questo potrebbe essere compatibile ora (ad esempio jQuery 1.9 può modificare sia quando .attr () viene utilizzato), non è garantito che verrà modificato per modificarli entrambi in futuro quando .prop () è canonico. Ad esempio, se si utilizza .attr ('checked', false); e una libreria che usi include .prop ('checked', true) ;, ci sarà un conflitto intrinseco che potrebbe causare fastidiosi bug.
Kzqai,

29

Provare

$(this).removeAttr('checked')

Dal momento che molti browser interpretano "controllato = nulla" come vero. Ciò rimuoverà del tutto l'attributo controllato.

Spero che sia di aiuto.


Inoltre, come menziona una delle altre risposte, non avrai bisogno di ciascuna funzione; potresti semplicemente concatenare la chiamata removeAttr al selettore.
cjstehno,

6
NOTA: questa risposta è del 2010. A quel tempo, questo era un approccio valido e accettato. Da allora è diventato obsoleto.
cjstehno,

21

Leggera modifica del plugin di Laurynas basato sul codice di Igor. In questo modo sono possibili le etichette associate ai pulsanti di scelta come target:

(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
Dipende da come vengono usate le etichette, se usano ID allora questo codice funziona, se il pulsante di opzione è nidificato nell'etichetta, non lo fa. Puoi utilizzare questa versione ancora più avanzata: gist.github.com/eikes/9484101
eikes

20

Grazie Patrick, mi hai reso felice! È il mousedown che devi usare. Tuttavia ho migliorato il codice in modo da poter gestire un gruppo di pulsanti di opzione.

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

Riscrivi il codice di Igor come plugin.

Uso:

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

Collegare:

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

La deselezione non funziona se faccio clic sull'etichetta. Quindi, mentre è possibile selezionare una radio facendo clic sull'etichetta, deselezionando funziona solo facendo clic sul pulsante di opzione stesso.
Simon Hürlimann,

@ alkos333 ha una soluzione che sembra funzionare anche con le etichette.
Simon Hürlimann,

Dipende da come vengono usate le etichette, se usano ID allora funziona il codice @ alkos333, se il pulsante di opzione è nidificato nell'etichetta, usa questa versione: gist.github.com/eikes/9484101
eike

16

Per il gruppo radio e radio:

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

Prova questo, questo farà il trucco:

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

10

Provare

$(this).attr("checked" , false );

9

Puoi anche simulare il comportamento del pulsante di opzione utilizzando solo le caselle di controllo:

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

Quindi, puoi utilizzare questo semplice codice per lavorare per te:

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

Funziona bene e hai un maggiore controllo sul comportamento di ciascun pulsante.

Puoi provarlo da solo a: http://jsfiddle.net/almircampos/n1zvrs0c/

Questo fork ti consente anche di deselezionare tutto come richiesto in un commento: http://jsfiddle.net/5ry8n4f4/


Questo è fantastico, tranne che non puoi deselezionare tutte le caselle.
Stefan,

6

Basta inserire il seguente codice per jQuery:

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

E per JavaScript:

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

Non è necessario mettere alcun ciclo foreach, .each () fubction o altro


5

Usa questo

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

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

Questo è quasi buono ma hai perso lo [0]

Corretto - >> $(this)[0].checked = false;


1
o semplicemente:this.checked = false;
esempio l'

4

È possibile utilizzare questo JQuery per deselezionare il pulsante di opzione

$('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 );
    }
});

Ogni volta che si fa doppio clic in una radio selezionata, la selezione viene modificata in false

Le mie radio iniziano con id=radxxxxxxxxperché uso questo selettore ID.


3
Scrivi la risposta in inglese (comprensibile).
ericbn,

@ericbn cosa succede se qualcuno non conosce l'inglese?
AlphaMale

@AlphaMale L'inglese è la lingua ufficiale su questo sito.
Cristik,

@Cristik Non tutti i programmatori provengono da paesi di lingua "inglese". Ciò significa che non possono pubblicare su questo forum? In secondo luogo, è stato compagno di 2 anni. Grazie per avermi illuminato, comunque.
AlphaMale

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

Il selettore corretto è: #frm input[type="radio"]:checked no#frm input[type="radio":checked]

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.