¿Cómo desmarcar un botón de radio?

482

Tengo un grupo de botones de opción que quiero desmarcar después de enviar un formulario AJAX usando jQuery. Tengo la siguiente función:

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

Con la ayuda de esta función, puedo borrar los valores en los cuadros de texto, pero no puedo borrar los valores de los botones de opción.

Por cierto, también lo intenté $(this).val("");pero eso no funcionó.

defecto del sistema
fuente
3
No necesitarías cada una de las funciones. Simplemente puede llamar a la función que desee sobre el objeto jQuery. Vea mi respuesta a continuación
James Wiseman el
1
no es necesario para cada función (). jQuery ("input: radio"). removeAttr ("marcado");
Jitendra Damor

Respuestas:

737

bien (simple js)

this.checked = false;

o (jQuery)

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

Consulte la página de ayuda de jQuery prop () para obtener una explicación sobre la diferencia entre attr () y prop () y por qué ahora es preferible prop ().
prop () se introdujo con jQuery 1.6 en mayo de 2011.

David Hedlund
fuente
29
PPL, tenga en cuenta que su comportamiento está cambiando en 1.6 a favor de prop(), mientras .attr()que se limitará a los atributos reales
Fabiano Soriani
Entonces, ¿es mejor usar JS simple aquí?
Doug Molineux
14
@Pete: Diría que si tiene un sistema integrado en jQuery, la ventaja adicional que le brinda es que si alguna vez hay un navegador que maneje esto de manera diferente, podrá delegar el soporte del navegador a la biblioteca. Sin embargo, si su software no usa jQuery actualmente, no valdría la pena la sobrecarga de incluir la biblioteca solo por esto.
David Hedlund
@David Hedlund: Supongo que estás insinuando que todos los principales navegadores manejan esto de la misma manera que hoy, ¿verdad?
Shawn
2
@ qris: Su problema probablemente esté en otro lugar. Demostración simple, usando jQuery 1.9 . Seguro funciona en mi Chrome.
David Hedlund
88

No necesitarías la eachfunción

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

O

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

Lo mismo también debería aplicarse a su cuadro de texto:

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

Pero podrías mejorar esto

$('#frm input:text').val("");
James Wiseman
fuente
2
Es probable que .removeAttr cause problemas.
Kzqai
¿Te importa ampliar cómo? O proporcionar un enlace?
James Wiseman
Sí, Kzqai, también tengo curiosidad de que mi respuesta fuera rechazada por esto también. La documentación no menciona ningún riesgo.
cjstehno
1
La documentación relevante está en realidad en el método .prop (): api.jquery.com/prop Cita "Las propiedades generalmente afectan el estado dinámico de un elemento DOM sin cambiar el atributo HTML serializado. Los ejemplos incluyen la propiedad de valor de los elementos de entrada, la propiedad deshabilitada de entradas y botones, o la propiedad marcada de una casilla de verificación. El método .prop () debe usarse para establecer deshabilitado y marcado en lugar del método .attr (). El método .val () debe usarse para obtener y establecer el valor ". Esto significa que ...
Kzqai
1
... Esto significa que .attr () alterará una fuente subyacente diferente que .prop (), el atributo html serializado en lugar del DOM, y aunque esto puede ser compatible ahora (por ejemplo, jQuery 1.9 puede modificar ambos cuando .attr () se utiliza), eso no garantiza que se mantendrá para modificar ambos en el futuro cuando .prop () sea canónico. Por ejemplo, si usa .attr ('marcado', falso); y una biblioteca que usa incluye .prop ('marcado', verdadero) ;, habrá un conflicto inherente que podría causar errores molestos.
Kzqai
29

Tratar

$(this).removeAttr('checked')

Dado que muchos navegadores interpretarán 'marcado = cualquier cosa' como verdadero. Esto eliminará el atributo marcado por completo.

Espero que esto ayude.

cjstehno
fuente
Además, como menciona una de las otras respuestas, no necesitará cada una de las funciones; simplemente podría encadenar la llamada removeAttr al selector.
cjstehno
66
NOTA: esta respuesta es de 2010. En ese momento, este era un enfoque válido y aceptado. Desde entonces se ha vuelto obsoleto.
cjstehno
21

Ligera modificación del complemento de Laurynas basado en el código de Igor. Esto acomoda las posibles etiquetas asociadas con los botones de radio que se dirigen:

(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
fuente
1
Depende de cómo se usen las etiquetas, si usan ID, entonces este código funciona, si el botón de radio está anidado en la etiqueta, no lo hace. Puede usar esta versión aún más mejorada: gist.github.com/eikes/9484101
eikes
20

Gracias Patrick, me alegraste el día! Es el mousedown que tienes que usar. Sin embargo, he mejorado el código para que pueda manejar un grupo de botones de 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
fuente
17

Reescribe el código de Igor como complemento.

Utilizar:

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

Enchufar:

(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
fuente
Anular la selección no funciona si hago clic en la etiqueta. Entonces, si bien es posible seleccionar una radio haciendo clic en la etiqueta, la anulación de la selección solo funciona haciendo clic en el botón de radio.
Simon Hürlimann
@ alkos333 tiene una solución que también parece funcionar con etiquetas.
Simon Hürlimann
Depende de cómo se usen las etiquetas, si usan identificaciones, entonces el código @ alkos333 funciona, si el botón de opción está anidado en la etiqueta, use esta versión: gist.github.com/eikes/9484101
eikes
16

Para radio y grupo de 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
fuente
14

Prueba esto, esto hará el truco:

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

Tratar

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

También puede simular el comportamiento del botón de radio usando solo casillas de verificación:

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

Luego, puede usar este código simple para trabajar para usted:

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

Funciona bien y tienes más control sobre el comportamiento de cada botón.

Puede probarlo usted mismo en: http://jsfiddle.net/almircampos/n1zvrs0c/

Esta bifurcación también le permite anular la selección de todo lo solicitado en un comentario: http://jsfiddle.net/5ry8n4f4/

Almir Campos
fuente
Esto es genial, excepto que no puede desmarcar todas las casillas.
Stefan
6

Simplemente ponga el siguiente código para jQuery:

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

Y para javascript:

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

No es necesario poner ningún bucle foreach, .each () fubction o cualquier cosa

Jitendra Damor
fuente
5

Utilizar este

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

Esto es casi bueno, pero te perdiste el [0]

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

alecellis1985
fuente
1
o simplemente:this.checked = false;
Eikes
4

Puede usar este JQuery para desmarcar el botón de radio

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

Cada vez que hace doble clic en una radio marcada, la marca cambia a falso

Mis radios comienzan id=radxxxxxxxxporque uso este selector de id.

Eduardo Andres Mesa Caceres
fuente
3
Por favor escriba la respuesta en inglés (comprensible).
ericbn
@ericbn ¿y si alguien no sabe inglés?
AlphaMale
@AlphaMale inglés es el idioma oficial en este sitio.
Cristik
@Cristik No todos los programadores provienen de países de habla "inglesa". ¿Eso significa que no pueden publicar en este foro? En segundo lugar, han pasado 2 años amigo. Gracias por iluminarme aunque.
AlphaMale
-2
function clearForm(){
  $('#frm input[type="text"]').each(function(){
      $(this).val("");  
  });
  $('#frm input[type="radio":checked]').each(function(){
      $(this).attr('checked', false);  
  });
 }

El selector correcto es: #frm input[type="radio"]:checked no#frm input[type="radio":checked]

Salvar
fuente