Подтвердить что ты не робот

Переключатель jQuery UI - как правильно переключить проверенное состояние

У меня есть набор переключателей, все в стиле с jQuery UI .button().

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

$("#myradio [value=1]").attr("checked", false);
$("#myradio [value=2]").attr("checked", true);

Значения изменены правильно, но стиль пользовательского интерфейса по-прежнему показывает непроверенную радиокнопку с проверенным стилем, а проверенный по-прежнему выглядит непроверенным.

Я просмотрел документацию jQuery UI по методу button() для переключателей, но нет ничего о том, как изменить состояние и обновить стиль пользовательского интерфейса.

Вкратце проблема состоит в том, что вызов кода $("selector").button("disable"); не меняет активного состояния кнопки - базовый переключатель правильно проверен, но активное состояние пользовательского интерфейса не изменяется. Итак, я получаю кнопку greyed out, которая выглядит так, как будто она все еще проверена, и настоящая выбранная кнопка не отображается.

Решение

$("selector").button("enable").button("refresh");
4b9b3361

Ответ 1

Вам нужно вызвать метод refresh после изменения основного состояния:

Обновляет визуальное состояние кнопки. Полезно для обновления состояния кнопки после того, как измененный или отключенный собственный элемент изменен программно.

Рабочий пример: http://jsbin.com/udowo3

function setRadio(id) {
    var radio = $('#' + id);
    radio[0].checked = true;
    radio.button("refresh");
}

Это использует идентификаторы для радиостанций, но это не имеет значения, если вы получаете экземпляр jQuery, содержащий соответствующий элемент input[type=radio].

Ответ 2

Несмотря на сообщения об обратном, вы можете указывать переключатель по идентификатору. Не уверен, почему пользовательский интерфейс JQuery не обновляет кнопки автоматически при проверке, но вы делаете это следующим образом:

$('selector').attr('checked','checked').button("refresh");

Рабочий пример:

<div id = "buttons">
 <label for="b1">button1</label>
 <label for="b2">button2</label>
 <label for="b3">button3</label>

 <input type="radio" name = "groupa" id = "b1" value="b1">
 <input type="radio" name = "groupa" id = "b2" value="b2">
 <input type="radio" name = "groupa" id = "b3" value="b3">
</div>

<script>
  $('#buttons input').button();     
  $('#b3').prop('checked', true).button("refresh");
</script>

Ответ 3

Глядя на код, вам нужно переключить класс ui-state-active, но самый простой способ - это просто $('someradiobutton').trigger('click') (или если вы не хотите, чтобы ваши пользовательские обработчики событий запускались, $('someradiobutton').trigger('click.button')).

Ответ 4

Будет ли reset все радиокнопки, но вы можете более точно определить селектор.

$( 'input:radio' )
     .removeAttr('checked')
     .removeAttr('selected')
     .button("refresh");

Ответ 5

Если кто-то все еще сталкивается с этой проблемой, используйте:

.prop('checked',true);

вместо:

.attr("checked", true);

Ответ 6

Я решил это, полностью сбросив Buttonset с помощью setTimeout.

Добавить клик на кнопку радио, которая нуждается в подтверждении.
Обратите внимание на нажатый "radioButton" и полный "radioSet" в приведенном ниже коде:

$('#radioButton').click(function(){
    if(confirm('Confirm Text') != true){
       resetButtonset('#radioSet', 200);
       return false;
    };
});

Создайте удобную функцию, которая сбрасывает ваш Buttonset:

function resetButtonset(name, time){
    setTimeout(function(){$(name).buttonset();}, time);
}

Ответ 7

$('input:radio[name="radioname"] + label[for="eglabel"]').click();

Вот и все.