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>

Ваш текущий код будет прослушивать только изменения в переключателе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. ).


Решение 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');
        }
                    });

вот ДЕМО


Этот работает, в отличие от других, которые были помечены как правильные: 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/


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


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 события каждый раз.


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

Это не отвечает на оригинальный вопрос ОП. Вы не используете jQuery здесь, и вы используете PHP для обработки логики проверки, а не Javascript.
Алекс Мульчинок
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.