javascript - value - jquery which radio checked



jQuery $(“# radioButton”). change(…) não disparando durante a de-seleção (6)

Cerca de um mês atrás, a pergunta de Mitt ficou sem resposta. Infelizmente, estou correndo para a mesma situação agora.

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

Aqui está a situação: Estou usando o jQuery para capturar as alterações em um botão de opção. Quando o botão de opção é selecionado, habilito uma caixa de edição. Quando o botão de opção está desmarcado, gostaria que a caixa de edição fosse desativada.

A habilitação funciona. Quando escolho um botão de opção diferente no grupo, o evento de change não é disparado. Alguém sabe como consertar isso?

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

https://src-bin.com


Answer #1

Com o Ajax, para mim trabalhei:

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

Answer #2

Digamos que esses botões de rádio estejam dentro de uma div que tenha os id radioButtons e que os botões de rádio tenham o mesmo nome (por exemplo commonName ) e, em seguida:

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

Answer #3

Meu problema era semelhante e isso funcionou para mim:

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

Answer #4

O evento de change que não está disparando na desseleção é o comportamento desejado. Você deve executar um seletor em todo o grupo de rádio em vez de apenas o único botão de rádio. E o seu grupo de rádio deve ter o mesmo nome (com valores diferentes)

Considere o seguinte código:

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

Eu tenho mesmo caso de uso como o seu, ou seja, para mostrar uma caixa de entrada quando um determinado botão de opção é selecionado. Se o evento fosse disparado também, eu teria 2 eventos de cada vez.


Answer #5

Parece que a função change() só é chamada quando você marca um botão de opção, não quando desmarca. A solução que usei é ligar o evento de alteração a todos os botões de opções:

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

Ou você pode dar a todos os botões de rádio o mesmo nome:

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

Aqui está um exemplo de jsfiddle funcional (atualizado a partir do comentário de Chris Porter).

Com o comentário de Per @ Ray, você deve evitar usar nomes com . neles. Esses nomes funcionam no jQuery 1.7.2, mas não em outras versões ( exemplo jsfiddle ).


Answer #6

Você pode ligar a todos os botões de uma vez pelo nome:

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

Exemplo de trabalho aqui: http://jsfiddle.net/Ey4fa/





radio-button