Как я могу переключаться с радиоблока

Скажите, что это мой HTML:

<input type="radio" name="rad" id="Radio0" checked="checked" />
<input type="radio" name="rad" id="Radio1" />
<input type="radio" name="rad" id="Radio2" />
<input type="radio" name="rad" id="Radio4" />
<input type="radio" name="rad" id="Radio3" />

Как вы можете видеть, 1-й переключатель установлен. Мне нужен переключатель, чтобы он работал как переключатель. Напр. Если я снова нажму на radio0, все переключатели не будут отмечены.

Как я могу это достичь?

Обновление: Я не хочу никаких дополнительных кнопок. Напр. Я мог бы добавить кнопку и установить свойство checked для всех переключателей в качестве ложных. Однако я этого не хочу. Я хочу, чтобы моя форма состояла из этих 4 переключателей.

Обновление:. Поскольку большинство людей не понимают, что я хочу, позвольте мне попытаться перефразировать - я хочу, чтобы радиокнопка функционировала в режиме переключения. Я дал одно и то же имя всем переключателям, поэтому это группа. Теперь я хочу, чтобы радиопульты переключались сами. Например. если я нажму на radio0, он должен быть снят, если он установлен и проверен, если он не установлен.

Ответ 1

Проблема, которую вы обнаружите, заключается в том, что, как только щелкает переключатель, его состояние изменяется, прежде чем вы сможете его проверить. Я предлагаю добавить пользовательский атрибут, чтобы отслеживать каждое предыдущее состояние радиостанции следующим образом:

$(function(){
    $('input[name="rad"]').click(function(){
        var $radio = $(this);

        // if this was previously checked
        if ($radio.data('waschecked') == true)
        {
            $radio.prop('checked', false);
            $radio.data('waschecked', false);
        }
        else
            $radio.data('waschecked', true);

        // remove was checked from other radios
        $radio.siblings('input[name="rad"]').data('waschecked', false);
    });
});

Вам также потребуется добавить этот атрибут к первоначально проверенной радио разметке

<input type="radio" name="rad" id="Radio0" checked="checked" data-waschecked="true" />

Смотрите демонстрацию здесь: http://jsfiddle.net/GoranMottram/VGPhD/2/

Ответ 2

Как только вы укажете имя 2 или более переключателей как одно и то же, они автоматически станут группой. В этой группе можно проверить только одну радиокнопку. Вы уже достигли этого.

Ответ 3

Я использую onClick() следующим образом для своих собственных радиостанций:

$(function(){
  // if selected already, deselect
  if ($(this).hasClass('selected') {
    $(this).prop('checked', false);
    $(this).removeClass('selected');
  }
  // else select
  else {
    $(this).prop('checked', true);
    $(this).addClass('selected');
  }
  // deselect sibling inputs
  $(this).siblings('input').prop('checked', false);
  $(this).siblings('input').removeClass('selected');
}

Ответ 4

Используя @Goran Mottram answer, просто немного подправьте его, чтобы соответствовать случаю, когда переключатели не являются братьями и сестрами.

$(".accordian-radio-button").click(function(){
    var wasChecked = true;
    if($(this).data('waschecked') == true){
        $(this).prop('checked', false);
        wasChecked = false;
    }
    $('input[name="ac"]').data('waschecked', false);
    $(this).data('waschecked', wasChecked);
})

<input class="accordian-radio-button" data-waschecked="false" type="radio" name="ac" id="a1" />

Ответ 5

Этот код решил мою проблему

$("[type='radio']").on('click', function (e) {
    var previousValue = $(this).attr('previousValue');
    if (previousValue == 'true') {
        this.checked = false;
        $(this).attr('previousValue', this.checked);
    }
    else {
        this.checked = true;
        $(this).attr('previousValue', this.checked);
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<label >Toogle radio button example</label>
<br />
<input type="radio" name="toogle_me" value="mango"> Blue </input>
<input type="radio" name="toogle_me" value="kiwi"> Green </input>
<input type="radio" name="toogle_me" value="banana"> Yellow </input>
<input type="radio" name="toogle_me" value="orange"> Orange </input>

Ответ 6

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

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

// remove was checked from other radios
    $radio.siblings('input[name="rad"]').data('waschecked', false);

И так как я не использую jQuery, мне пришлось бы самим пройтись по петле и оценить братьев и сестер, что не так уж сложно, но мне показалось неэлегичным. Но с этим методом не обойтись, потому что вы используете набор данных как хранилище информации.

Поэкспериментировав, я понял, что проблема в том, что при нажатии на радио запускается событие clicked, и любая функция, прикрепленная к этому событию click, завершает себя до того, как будет оценена функция для события "onchange", не говоря уже о том, чтобы называется. Таким образом, если событие щелчка "снимает флажок" с переключателя, событие изменения не запускается.

Я оставил свою неудачную попытку здесь:

Но если бы вы могли ответить на вопрос "произойдет ли событие изменения после этого события клика?" тогда вы можете заставить тумблер работать.

Решение, которое я нашел, можно увидеть на этой ручке:

Но в основном так:

function onClick(e) {
  e.dataset.toDo = 'uncheck';
  setTimeout(uncheck, 1, {
    event:'click',
    id:e.id,
    dataset:e.dataset
  });
}

Итак, для события click установите маркер, по которому произошел щелчок, и используйте setTimeout(), чтобы создать паузу, позволяющую оценить событие onchange и запустить его.

function onChange(e) {
  e.dataset.toDo = 'leave';
}

Если происходит событие onchange, оно отменяет то, что было сделано событием onclick.

function uncheck(radio) {
  log('|');
  if (radio.event !== 'click') return;
  log('uncheck');
  if (radio.dataset.toDo === 'uncheck') {
    document.getElementById(radio.id).checked = false;
    radio.checked = false;
  } 
}

Затем, когда запускается функция снятия отметки, она получает информацию о том, следует ли событие изменения за событием щелчка или нет. Если нет, то радио не проверяется, и функционирует как переключатель.

И это в основном самовозврат, поэтому мне не нужно перебирать все радиомодули и сбрасывать их наборы данных к начальным значениям в конце функции.

Теперь я уверен, что есть более удобный асинхронный/ожидающий способ сделать это, который не использует setTimeout и был бы еще более элегантным, но я все еще учусь, и я не мог придумать это. Кто-нибудь еще?