jQuery $ («# radioButton»). изменение (…) не срабатывает во время отмены выбора

172

Около месяца назад вопрос Митта остался без ответа. К сожалению, сейчас я сталкиваюсь с такой же ситуацией.

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

Вот ситуация: я использую jQuery для захвата изменений в переключателе. Когда выбран переключатель, я включаю поле редактирования. Когда переключатель выключен, я бы хотел, чтобы поле редактирования было отключено.

Включение работает. Когда я выбираю другой переключатель в группе, changeсобытие не запускается. Кто-нибудь знает, как это исправить?

<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>
antwarpes
источник
Ваш текущий код будет прослушивать только изменения в переключателеid=r1
Rafay
1
если выбрано id = r2, отменить выбор id = r1? Отмена выбора радиокнопки не фиксируется этим?
antwarpes
2
chk это может быть, это поможет jsfiddle.net/aqZgs
Рафай
Не используйте removeAttr ('disabled'), используйте prop () для изменения состояния, смотрите мой ответ .
basic6

Ответы:

311

Похоже, что change()функция вызывается только когда вы проверяете переключатель, а не когда вы его снимаете. Решение, которое я использовал, заключается в том, чтобы привязать событие изменения к каждой радиокнопке:

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

Или вы можете дать всем переключателям одно и то же имя:

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

Вот рабочий пример jsfiddle (обновленный из комментария Криса Портера.)

Согласно комментарию @ Ray, вам следует избегать использования имен с .ними. Эти имена работают в jQuery 1.7.2, но не в других версиях ( пример jsfiddle. ).

Andomar
источник
Решение jsFiddle установлено на Mootools вместо jQuery и препятствует его функционированию. Попробуйте это решение, чтобы увидеть поведение: jsfiddle.net/N9tBx . Я добавил журнал изменений, и вы можете легко увидеть, что событие изменения не сработало, если установлен переключатель не отмечен, как другой флажок.
Крис Портер
3
Синтаксис ввода «[name = someRadioGroup]» неверен. Правильный синтаксис: «input [name = someRadioGroup]: radio». Также стоит отметить, что этот метод работает только в версии 1.7.2 JQuery. Для этого была отправлена ​​ошибка. См. Jsfiddle.net/zn7q2/2 для примера этой ошибки, если вам интересно.
Рэй
@Ray: ошибка возникает только для имен с точкой в ​​них. Без точки это работает нормально, см. Jsfiddle.net/zn7q2/4
Andomar
1
Пример работает с точками, если вы измените на «input [name = 'DateSearchOptions.Test']» (имя, заключенное в одинарные кавычки): jsfiddle.net/4hTxn
Nullpo
Код "if ($ (" # myCheckbox "). Attr (" флажок "))" не работал для меня, мне пришлось использовать "if ($ (" # myCheckbox "). Is (": флажок ") )».
Барто Бернсманн
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'/>                  

JQuery часть

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

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

вот ДЕМО

Rafay
источник
Этот работает, в отличие от других, которые были помечены как правильные: S
Уильям Контестабиле
+1. Решение Andomar сработало, но для меня это имеет больше смысла. Использование селектора классов предотвращает необходимость изменения функции, если форма изменяется или имеет динамическое количество полей. Уй за некро голосов! (хотя теперь, спустя 2 года, jQuery рекомендует использовать prop () вместо attr (). api.jquery.com/prop )
Travis
8
Должен измениться .attr('checked')на .prop('checked').
Джастин
1
Плохой пример, это не так, как это делается. Смотрите мой другой ответ для отключения элементов (удаление атрибутов неправильно) .
basic6
22

Вы можете привязать все переключатели одновременно по имени:

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

Рабочий пример здесь: http://jsfiddle.net/Ey4fa/

jterrace
источник
Вариант этого - $ («ввод формы: радио»). Change (...); и проверьте состояние переключателя опоры («флажок»). Это очень полезно при использовании динамического RadioButtonList в ASP.NET.
Теренс Голла
5

Это нормально работает для меня:

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

user3052657
источник
3

Моя проблема была похожа, и это сработало для меня:

$('body').on('change', '.radioClassNameHere', function() { ...
Алекс Сим
источник
0

Допустим, эти переключатели находятся внутри элемента, divкоторый имеет идентификатор, radioButtonsи что переключатели имеют одно и то же имя (например commonName):

$('#radioButtons').on('change', 'input[name=commonName]:radio', function (e) {
    console.log('You have changed the selected radio button!');
});
Марко Летич
источник
0

changeСобытие не стрелять по отмене выбора является желаемым поведением. Вы должны запустить селектор по всей группе радиостанций, а не только по одной радиокнопке. И ваша радиогруппа должна иметь одинаковое имя (с разными значениями)

Рассмотрим следующий код:

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

У меня такой же вариант использования, как и у вас, т. Е. Для отображения поля ввода, когда выбран определенный переключатель. Если бы событие происходило и при отмене выбора, я бы получал 2 события каждый раз.

Vedant
источник
0

Та же проблема здесь, это работало просто отлично:

$('input[name="someRadioGroup"]').change(function() {
    $('#r1edit:input').prop('disabled', !$("#r1").is(':checked'));
});
негодник
источник
-1

С Ajax у меня работали:

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

И 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> ";
Sven
источник
Это не отвечает на оригинальный вопрос ОП. Вы не используете jQuery здесь, и вы используете PHP для обработки логики проверки, а не Javascript.
Алекс Мульчинок