JQuery radio onchange toggle класс родительского элемента?

Обратите внимание на следующее:

$('#myRadio').change(function() {           

    if($(this).is(':checked'))  {
        $(this).parent().addClass('green');
    } else {                              
        $(this).parent().removeClass('green');
    }
});

Разметка выглядит несколько иначе как

<table>
  <tr>
    <td>Some text 1 </td>
    <td><input type="radio" value="txt1" name="myRadio" id="text1" /></td>
    <td>Some text 2 </td>
    <td><input type="radio" value="txt2" name="myRadio" id="text2" /></td>
    <td>Some text 3 </td>
    <td><input type="radio" value="txt3" name="myRadio" id="text2" /></td>
  </tr>
</table>

Когда я переключаю радио, над кодом javascript применяется "зеленый" к тегу TD, что хорошо. Но если я изменю выбор на другой, он добавит зеленый в другой, но не удалит зеленый из ранее выбранного радио.

Как я могу заставить его работать, чтобы выбор опции радио изменил родительский класс TD на зеленый, и выбрав другой, будет reset, но добавьте зеленый только к вновь выбранному!

Можно ли также изменить класс его первого предыдущего TD, который содержит "некоторый текст 3" и т.д.

Спасибо.

Ответ 1

Попробуйте что-то вроде этого:

if($(this).is(':checked'))  {
    $(this).parent().parent().parent().find('.green').removeClass('green');
    $(this).parent().addClass('green');
}

Это найдет элемент таблицы вашей текущей группы переключателей, найдет любые элементы с зеленым классом и удалит класс.

В качестве альтернативы, если на странице имеется только одна группа переключателей, это будет проще:

$('.green').removeClass('green');

Ответ 2

Вы не должны использовать событие change() для переключателей и флажков. Он ведет себя немного неудобно и непоследовательно в браузерах (это вызывает проблемы во всех версиях IE)

Используйте событие click() (не беспокойтесь о доступности, потому что событие click также будет запущено, если вы активируете/выбираете радиокнопку с помощью клавиатуры)

И, как указывали другие, сброс зеленого также легко:

Итак, просто измените свой код на

$('#myRadio').click(function() {           
    $(this).parents("tr").find(".green").removeClass("green");

    if($(this).is(':checked'))  {
        $(this).parent().addClass('green');
    }
});

EDIT: как запрошено в комментарии, также измените предыдущий td:

$('#myRadio').click(function() {           
    $(this).parents("tr").find(".green").removeClass("green");

    if($(this).is(':checked'))  {
        $(this).parent().prev().andSelf().addClass('green');
    }
});

или даже лучше, повернув все элементы td родительской строки зеленым цветом:

$('#myRadio').click(function() {           
    $(this).parents("tr").find(".green").removeClass("green");

    if($(this).is(':checked'))  {
        $(this).parents("tr").find("td").addClass('green');
    }
});

Ответ 3

Попробуйте следующее:

if($(this).is(':checked')) {
    $(this).parent().siblings('td.green').removeClass('green');
    $(this).parent().addClass('green');
}

Ответ 4

Я просто написал решение, которое не заботится о том, насколько глубоко вложены радиокнопки, он просто использует атрибут name для переключателей. Это означает, что этот код будет работать без каких-либо изменений в любом месте, я думаю - мне пришлось писать его, так как у меня странная ситуация, когда одна радиокнопка вложена иначе, чем ее когорты с тем же именем.

$('input[type="radio"]').change( function() {
    // grab all the radio buttons with the same name as the one just changed
    var this_radio_set = $('input[name="'+$(this).attr("name")+'"]');

    // iterate through each  
    // if checked, set its parent label class to "selected"
    // if not checked, remove the "selected" class from the parent label
    // my HTML markup for each button is  <label><input type="radio" /> Label Text</label>
    // so that this works anywhere even without a unique ID applied to the button and label
    for (var i=0; i < this_radio_set.length;i++) {
        if ( $(this_radio_set[i]).is(':checked') ) $(this_radio_set[i]).parents('label').addClass('selected');
        else $(this_radio_set[i]).parents('label').removeClass('selected');
    }
});

Ответ 5

Мое предложение:

$('#myRadio').change(function() {           
    _parent = $(this).parent();
    if($(this).is(':checked'))  {
       _parent.addClass('green');
    } else {                              
       _parent.removeClass('green');
    }
});

Ответ 6

Вот решение, которое отлично поработало для меня:

var $boxes=$('input:radio');
var $parents = $boxes.parent();
$boxes.click(function(){
    $parents.filter('.selected').removeClass('selected');
    $(this).parent().addClass('selected');
});
$boxes.filter(':checked').parent().addClass('selected');

Особенности:

  • Быстрее. Только один раз выбирает список флажков.
  • Не полагается: проверено. Я не уверен, есть ли определенный порядок, в котором "кликнуть" и "изменить" будут выполняться в браузерах.
  • использует: радио вместо [type = "radio" ], который рекомендуется jQuery
  • устанавливает класс родителя для значения по умолчанию для переключателя.

Надеюсь, это поможет!

Ответ 7

Я думаю, что это лучший и более гибкий способ сделать это:

забудьте о таблицах (Google знает много причин для этого) и используйте обертки, как показано ниже

<div id="radio_wrapper">
    <span class="radio">
        <label for="myRadio1" class="myRadio">Some text 1 </label>
        <input type="radio" value="txt1" name="myRadio" id="myRadio1" class="myRadio" />
    </span>
    <span class="radio">
        <label for="myRadio2" class="myRadio">Some text 2 </label>
        <input type="radio" value="txt2" name="myRadio" id="myRadio2" class="myRadio" />
    </span>
    <span class="radio">
        <label for="myRadio3" class="myRadio">Some text 3 </label>
        <input type="radio" value="txt3" name="myRadio" id="myRadio3" class="myRadio" />
    </span>
</div

формат с CSS, как этот

span.radio {
    background-color: #cccccc;
}
span.currentGreen {
    background-color: #ccffcc;
}

и используя этот script, вы можете сделать то же самое, что хотите

$('.myRadio').change(function() {           
    $('.currentGreen').removeClass('currentGreen'); // remove from all
    if ($(this).is(':checked')) {
        $(this).parent().addClass('currentGreen'); // add to current
    }
});

Мне не нравится использовать filter() и find(), потому что в этом случае они используют ненужные ресурсы.