Pourquoi jQuery ne détecte-t-il pas lorsqu’un bouton radio est décoché?

Dupliquer possible:
JQuery $ (# radioButton) .change (…) ne se déclenche pas pendant la désélection

J’ai le HTML / jQuery suivant:

  $("#rb2").change(function () { if ($(this).is(":checked")) { alert('checked'); } else { alert('unchecked'); } }); 

Lorsque mon bouton radio rb2 n’est pas sélectionné en sélectionnant rb1, l’événement de modification ne se déclenche pas. Pourquoi est-ce? Est-il possible de le faire fonctionner sans changer mon sélecteur pour qu’il corresponde aux deux entrées et ensuite regarder l’ID?

Fiddle: http://jsfiddle.net/4uRWR/

L’événement de modification n’est envoyé que lorsque vous modifiez réellement l’élément lui-même. Lorsque vous cliquez sur l’autre radio, vous ne la modifiez pas. Un correctif serait de regarder l’événement de changement sur chaque entrée: radio, puis vérifiez simplement l’état du bouton radio correspondant:

 $("input:radio").change(function () { if ($("#rb2").is(":checked")) { alert('checked'); } else { alert('unchecked'); } }); 

http://codepen.io/AlienHoboken/pen/akwjB

Écoutez les modifications apscopes à chaque entrée liée à votre groupe de radios, puis vérifiez si une entrée spécifique est sélectionnée.

 $("input[name=rb]").change(function () { if ($('#rb2').is(":checked")) { alert('checked'); } else { alert('unchecked'); } }); 

http://jsfiddle.net/4uRWR/2/

Vous pouvez déclencher artificiellement un “changement” sur les boutons radio du même groupe afin que le gestionnaire lié d’origine soit capturé et sorti “non coché”. L’astuce consiste à éviter de restr coincé dans une boucle infinie en re-déclenchant de manière récursive l’événement. Nous pouvons éviter cela en ignorant les événements artificiels dépourvus de la propriété originalEvent :

 $("input[type=radio]").on("change", function (e) { var $this = $(this); //all inputs with the same name var $targetInputSelector = $("input[name=" + $this.attr("name") + "]"); //check if the handler was fired "naturally" //if yes, sortinggger the change handler "artificially" for inputs with the same name if (e.hasOwnProperty('originalEvent')) { //exclude the element that was changed "naturally" //from the subset of all the elements with the same name $targetInputSelector.not($this).sortingggerHandler("change"); } }); 

Ce code fonctionne lorsqu’il est ajouté au-dessus de votre gestionnaire actuel et satisfait le sans changer mon sélecteur pour qu’il corresponde aux deux entrées, puis en regardant les critères d’ ID 😉

http://jsfiddle.net/a73tn/24/

J’ai en quelque sorte rencontré ce problème il y a quelques jours. Au lieu d’écouter un clic individuel sur un bouton radio, j’écoute un clic sur le

    je les ai reçus, puis appelle cette fonction pour vérifier si un bouton a été sélectionné.

     // Iterate over the radio group and determine if one of them is selected function loopRadBtns(btnGroup) { var isChecked = false; btnGroup.find('input[type="radio"]').each(function() { if($(this).attr('checked')) { isChecked = true; } }); return isChecked; }