Comment décocher un bouton radio?

482

J'ai un groupe de boutons radio que je souhaite décocher après l'envoi d'un formulaire AJAX à l'aide de jQuery. J'ai la fonction suivante:

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

Avec l'aide de cette fonction, je peux effacer les valeurs dans les zones de texte, mais je ne peux pas effacer les valeurs des boutons radio.

Au fait, j'ai également essayé $(this).val("");mais cela n'a pas fonctionné.

défaillance du système
la source
3
Vous n'auriez pas besoin de chaque fonction. Vous pouvez simplement appeler la fonction souhaitée sur l'objet jQuery. Voir ma réponse ci
James Wiseman
1
pas besoin de chaque fonction () .. jQuery ("entrée: radio"). removeAttr ("vérifié");
Jitendra Damor

Réponses:

737

soit (plain js)

this.checked = false;

ou (jQuery)

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

Voir la page d'aide de jQuery prop () pour une explication sur la différence entre attr () et prop () et pourquoi prop () est maintenant préférable.
prop () a été introduit avec jQuery 1.6 en mai 2011.

David Hedlund
la source
29
PPL, sachez que son comportement change en 1.6 en faveur de prop(), alors .attr()qu'il sera limité aux attributs réels
Fabiano Soriani
Alors, est-il préférable d'utiliser ici du JS ordinaire?
Doug Molineux
14
@Pete: Je dirais que si vous avez un système construit sur jQuery, l'avantage supplémentaire qui vous donne est que s'il existe un navigateur qui gère cela différemment, vous pourrez déléguer la prise en charge du navigateur à la bibliothèque. Cependant, si votre logiciel n'utilise pas actuellement jQuery, cela ne vaudrait pas la peine d'inclure la bibliothèque juste pour cela.
David Hedlund
@ David Hedlund: Je suppose que vous sous-entendez que tous les principaux navigateurs gèrent cela de la même manière qu'aujourd'hui, n'est-ce pas?
Shawn
2
@qris: Votre problème est probablement ailleurs. Démo simple, utilisant jQuery 1.9 . Bien sûr, fonctionne dans mon Chrome.
David Hedlund
88

Vous n'auriez pas besoin de la eachfonction

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

Ou

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

La même chose devrait également s'appliquer à votre zone de texte:

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

Mais vous pourriez améliorer cela

$('#frm input:text').val("");
James Wiseman
la source
2
.removeAttr est susceptible de provoquer des problèmes.
Kzqai
Voulez-vous développer comment? Ou fournir un lien?
James Wiseman
Oui, Kzqai, je suis également curieux que ma réponse ait également été rejetée. La documentation ne mentionne aucun risque.
cjstehno
1
La documentation pertinente se trouve en fait sur la méthode .prop (): api.jquery.com/prop Quote "Les propriétés affectent généralement l'état dynamique d'un élément DOM sans modifier l'attribut HTML sérialisé. Les exemples incluent la propriété value des éléments d'entrée, la propriété disabled des entrées et des boutons, ou la propriété vérifiée d'une case à cocher. La méthode .prop () doit être utilisée pour définir désactivé et vérifié au lieu de la méthode .attr (). La méthode .val () doit être utilisée pour obtenir et définir la valeur . " Cela signifie que ...
Kzqai
1
... Cela signifie que .attr () modifiera une source sous-jacente différente de .prop (), l'attribut html sérialisé au lieu du DOM, et bien que cela puisse être compatible maintenant (par exemple, jQuery 1.9 peut modifier les deux quand quand .attr () est utilisé), cela ne garantit pas qu'il sera possible de modifier les deux à l'avenir lorsque .prop () est canonique. Par exemple, si vous utilisez .attr ('vérifié', false); et une bibliothèque que vous utilisez inclut .prop ('vérifié', true) ;, il va y avoir un conflit inhérent qui pourrait causer des bogues ennuyeux.
Kzqai
29

Essayer

$(this).removeAttr('checked')

Étant donné que de nombreux navigateurs interpréteront «vérifié = n'importe quoi» comme vrai. Cela supprimera complètement l'attribut vérifié.

J'espère que cela t'aides.

cjstehno
la source
De plus, comme le mentionne l'une des autres réponses, vous n'aurez pas besoin de chaque fonction; vous pouvez simplement chaîner l'appel removeAttr au sélecteur.
cjstehno
6
REMARQUE: cette réponse date de 2010. À cette époque, il s'agissait d'une approche valide et acceptée. Depuis lors, il est devenu obsolète.
cjstehno
21

Légère modification du plugin de Laurynas basé sur le code d'Igor. Cela prend en compte les étiquettes possibles associées aux boutons radio ciblés:

(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
la source
1
Cela dépend de la façon dont les étiquettes sont utilisées, si elles utilisent des ID, alors ce code fonctionne, si le bouton radio est imbriqué dans l'étiquette, il ne le fait pas. Vous pouvez utiliser cette version encore plus améliorée: gist.github.com/eikes/9484101
eikes
20

Merci Patrick, tu as fait ma journée! C'est la souris que vous devez utiliser. Cependant, j'ai amélioré le code afin que vous puissiez gérer un groupe de boutons 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;
    }
}})());
igor
la source
17

Réécriture du code d'Igor en plugin.

Utilisation:

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

Brancher:

(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
la source
La désélection ne fonctionne pas si je clique sur l'étiquette. Ainsi, bien qu'il soit possible de sélectionner une radio en cliquant sur l'étiquette, la désélection ne fonctionne qu'en cliquant sur le bouton radio lui-même.
Simon Hürlimann
@ alkos333 propose également une solution qui semble fonctionner avec les étiquettes.
Simon Hürlimann
Cela dépend de la façon dont les étiquettes sont utilisées, si elles utilisent des ID, le code @ alkos333 fonctionne, si le bouton radio est imbriqué dans l'étiquette, utilisez cette version: gist.github.com/eikes/9484101
eikes
16

Pour la radio et le groupe 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');
        }
    });
});
Sylvain Kocet
la source
14

Essayez ceci, cela fera l'affaire:

        $(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
la source
10

Essayer

$(this).attr("checked" , false );
rahul
la source
9

Vous pouvez également simuler le comportement du bouton radio en utilisant uniquement des cases à cocher:

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

Ensuite, vous pouvez utiliser ce code simple pour travailler pour vous:

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

Cela fonctionne bien et vous avez plus de contrôle sur le comportement de chaque bouton.

Vous pouvez l'essayer par vous-même sur: http://jsfiddle.net/almircampos/n1zvrs0c/

Cette fourchette vous permet également de tout désélectionner comme demandé dans un commentaire: http://jsfiddle.net/5ry8n4f4/

Almir Campos
la source
C'est super, sauf que vous ne pouvez pas décocher toutes les cases.
Stefan
6

Mettez simplement le code suivant pour jQuery:

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

Et pour javascript:

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

Il n'est pas nécessaire de mettre une boucle foreach, une fonction .each () ou autre chose

Jitendra Damor
la source
5

Utilisez ceci

$("input[name='nameOfYourRadioButton']").attr("checked", false);
CrsCaballero
la source
4
$('#frm input[type="radio":checked]').each(function(){
   $(this).checked = false;  
  });

C'est presque bien mais vous avez raté le [0]

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

alecellis1985
la source
1
ou simplement:this.checked = false;
eikes
4

Vous pouvez utiliser ce JQuery pour décocher le bouton radio

$('input:radio[name="IntroducerType"]').removeAttr('checked');
                $('input:radio[name="IntroducerType"]').prop('checked', false);
keivan kashani
la source
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" >

:RÉ

Menotti
la source
-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 );
    }
});

Chaque fois que vous double-cliquez sur une radio cochée, la case cochée devient fausse

Mes radios commencent par id=radxxxxxxxxparce que j'utilise ce sélecteur d'identifiant.

Eduardo Andres Mesa Caceres
la source
3
Veuillez écrire la réponse en anglais (compréhensible).
ericbn
@ericbn et si quelqu'un ne connaît pas l'anglais?
AlphaMale
@AlphaMale english est la langue officielle de ce site.
Cristik
@Cristik Tous les programmeurs ne viennent pas de pays anglophones. Est-ce à dire qu'ils ne peuvent pas poster sur ce forum? Deuxièmement, il a été compagnon de 2 ans. Merci de m'avoir éclairé.
AlphaMale
-2
function clearForm(){
  $('#frm input[type="text"]').each(function(){
      $(this).val("");  
  });
  $('#frm input[type="radio":checked]').each(function(){
      $(this).attr('checked', false);  
  });
 }

Le bon sélecteur est: #frm input[type="radio"]:checked non#frm input[type="radio":checked]

sauver
la source