jQuery $ ("# radioButton"). change (...) non si attiva durante la deselezione


172

Circa un mese fa la domanda di Mitt è rimasta senza risposta. Purtroppo, ora mi trovo nella stessa situazione.

http://api.jquery.com/change/#comment-133939395

Ecco la situazione: sto usando jQuery per acquisire le modifiche in un pulsante di opzione. Quando il pulsante di opzione è selezionato, abilito una casella di modifica. Quando il pulsante di opzione è deselezionato, desidero disabilitare la casella di modifica.

L'abilitazione funziona. Quando scelgo un pulsante di opzione diverso nel gruppo, l' changeevento non viene generato. Qualcuno sa come risolvere questo problema?

<input type="radio" id="r1" name="someRadioGroup"/> 

<script type="text/javascript">
    $("#r1").change(function () {
        if ($("#r1").attr("checked")) {
            $('#r1edit:input').removeAttr('disabled');
        }
        else {
            $('#r1edit:input').attr('disabled', true);
        }
    });
</script>

il tuo codice attuale ascolterà la modifica del pulsante di id=r1
opzione solo

1
se id = r2 è selezionato, id = r1 dovrebbe essere deselezionato? la deselezione di un pulsante di opzione non viene catturata da questo?
antwarpes

2
chk questo potrebbe essere che aiuterà jsfiddle.net/aqZgs
Rafay

Non usare removeAttr ('disabled'), usa prop () per cambiare lo stato, vedi la mia risposta .
basic6,

Risposte:


311

Sembra che la change()funzione sia chiamata solo quando si seleziona un pulsante di opzione, non quando si deseleziona. La soluzione che ho usato è di associare l'evento change ad ogni pulsante di opzione:

$("#r1, #r2, #r3").change(function () {

Oppure potresti dare a tutti i pulsanti di opzione lo stesso nome:

$("input[name=someRadioGroup]:radio").change(function () {

Ecco un esempio di jsfiddle funzionante (aggiornato dal commento di Chris Porter.)

Per il commento di @ Ray, dovresti evitare di usare nomi con .dentro. Quei nomi funzionano in jQuery 1.7.2 ma non in altre versioni ( esempio jsfiddle. ).


La soluzione jsFiddle è impostata su Mootools anziché su jQuery e ne impedisce il funzionamento. Prova questa soluzione per vedere il comportamento: jsfiddle.net/N9tBx . Ho aggiunto un registro delle modifiche e puoi facilmente vedere che l'evento di modifica non viene generato quando il pulsante di opzione selezionato è deselezionato mentre un altro è selezionato.
Chris Porter,

3
La sintassi "[name = someRadioGroup]" di input è errata. La sintassi corretta è: "input [name = someRadioGroup]: radio". Vale anche la pena notare che questo metodo funziona solo nella versione 1.7.2 di JQuery. È stato inviato un bug per questo. Vedi: jsfiddle.net/zn7q2/2 per un esempio di questo bug se sei curioso.
Ray,

@Ray: il bug si verifica solo per i nomi che contengono un punto. Senza il punto funziona bene, vedi jsfiddle.net/zn7q2/4
Andomar,

1
L'esempio funziona con i punti se cambi in "input [name = 'DateSearchOptions.Test']" (nome racchiuso tra virgolette singole): jsfiddle.net/4hTxn
Nullpo

Il codice "if ($ (" # myCheckbox "). Attr (" checked "))" Non ha funzionato per me, ho dovuto usare "if ($ (" # myCheckbox "). Is (": checked ") )".
Bartho Bernsmann,

35
<input id='r1' type='radio' class='rg' name="asdf"/>
<input id='r2' type='radio' class='rg' name="asdf"/>
<input id='r3' type='radio' class='rg' name="asdf"/>
<input id='r4' type='radio' class='rg' name="asdf"/><br/>
<input type='text' id='r1edit'/>                  

parte jquery

$(".rg").change(function () {

if ($("#r1").attr("checked")) {
            $('#r1edit:input').removeAttr('disabled');
        }
        else {
            $('#r1edit:input').attr('disabled', 'disabled');
        }
                    });

ecco la DEMO


Questo funziona, a differenza degli altri che sono stati contrassegnati come corretti: S
William Contestabile,

+1. La soluzione di Andomar ha funzionato, ma per me ha più senso. L'uso del selettore di classe impedisce di modificare la funzione se il modulo cambia o ha un numero dinamico di campi. Yay per i voti necro! (anche se ora 2 anni dopo jQuery consiglia di utilizzare prop () invece di attr (). api.jquery.com/prop )
Travis

8
Dovrebbe cambiare .attr('checked')in .prop('checked').
Giustino,


22

Puoi associare tutti i pulsanti di opzione contemporaneamente per nome:

$('input[name=someRadioGroup]:radio').change(...);

Esempio di lavoro qui: http://jsfiddle.net/Ey4fa/


Una variazione su questo è $ ("input modulo: radio"). Change (...); e testare la specifica condizione del pulsante di opzione ("selezionata"). Ciò è molto utile quando si utilizza un RadioButtonList dinamico in ASP.NET.
Terence Golla,

5

Questo normalmente funziona per me:

if ($("#r1").is(":checked")) {}


3

Il mio problema era simile e questo ha funzionato per me:

$('body').on('change', '.radioClassNameHere', function() { ...

0

Diciamo che quei pulsanti di opzione sono all'interno di un divche ha l'id radioButtonse che i pulsanti di opzione hanno lo stesso nome (ad esempio commonName) quindi:

$('#radioButtons').on('change', 'input[name=commonName]:radio', function (e) {
    console.log('You have changed the selected radio button!');
});

0

L' changeevento che non si attiva sulla deselezione è il comportamento desiderato. È necessario eseguire un selettore sull'intero gruppo radio anziché sul solo pulsante di opzione. E il tuo gruppo radio dovrebbe avere lo stesso nome (con valori diversi)

Considera il seguente codice:

$('input[name="job[video_need]"]').on('change', function () {
    var value;
    if ($(this).val() == 'none') {
        value = 'hide';
    } else {
        value = 'show';
    }
    $('#video-script-collapse').collapse(value);
});

Ho lo stesso caso d'uso del tuo, cioè per mostrare una casella di input quando viene selezionato un particolare pulsante di opzione. Se l'evento fosse stato attivato anche con la deselezione, avrei ricevuto 2 eventi ogni volta.


0

Lo stesso problema qui, ha funzionato bene:

$('input[name="someRadioGroup"]').change(function() {
    $('#r1edit:input').prop('disabled', !$("#r1").is(':checked'));
});

-1

Con Ajax, per me ha funzionato:

html:

<div id='anID'>
 <form name="nameOfForm">
            <p><b>Your headline</b></p>
            <input type='radio' name='nameOfRadio' value='seed' 
             <?php if ($interviewStage == 'seed') {echo" checked ";}?> 
            onchange='funcInterviewStage()'><label>Your label</label><br>
 </form>
</div>

Javascript:

 function funcInterviewStage() {

                var dis = document.nameOfForm.nameOfRadio.value;

                //Auswahltafel anzeigen
                  if (dis == "") {
                      document.getElementById("anID").innerHTML = "";
                      return;
                  } else { 
                      if (window.XMLHttpRequest) {
                          // code for IE7+, Firefox, Chrome, Opera, Safari
                          xmlhttp = new XMLHttpRequest();
                      } else {
                          // code for IE6, IE5
                          xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
                      }
                      xmlhttp.onreadystatechange = function() {
                          if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                              document.getElementById("anID").innerHTML = xmlhttp.responseText;
                          }
                      }
                      xmlhttp.open("GET","/includes/[name].php?id="+dis,true);
                      xmlhttp.send();
                  }
              }  

E php:

//// Get Value
$id = mysqli_real_escape_string($db, $_GET['id']);

//// Insert to database
$insert = mysqli_query($db, "UPDATE [TABLE] SET [column] = '$id' WHERE [...]");

//// Show radio buttons again
$mysqliAbfrage = mysqli_query($db, "SELECT [column] FROM [Table] WHERE [...]");
                  while ($row = mysqli_fetch_object($mysqliAbfrage)) {
                    ...
                  }
                  echo" 
                  <form name='nameOfForm'>
                      <p><b>Your headline</b></p>
                      <input type='radio' name='nameOfRadio' value='seed'"; if ($interviewStage == 'seed') {echo" checked ";} echo" onchange='funcInterviewStage()'><label>Yourr Label</label><br>
                      <input type='radio' name='nameOfRadio' value='startup'"; if ($interviewStage == 'startup') {echo" checked ";} echo" onchange='funcInterviewStage()'><label>Your label</label><br>

                  </form> ";

Ciò non risponde alla domanda originale dei PO. Qui non stai usando jQuery e stai usando PHP per gestire la logica di controllo, non Javascript.
Alex Mulchinock,
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.