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é.


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.


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

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.


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

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

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

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

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


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/


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


5

Utilisez ceci

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

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;


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

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É


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


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]

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.