jQuery Uniform Checkbox не (не) проверяет - PullRequest
32 голосов
/ 10 июля 2011

Я использую jQuery Uniform для стиля ввода / выбора и т. Д. Однако флажок перестал работать. Я appending данные, отправленные с вызова AJAX. После загрузки я использую $.uniform.update("input:checkbox") для обновления нового HTML. При попытке (не) проверить ввод, он работает только один раз. Если я хочу (не) проверить это снова, это вообще не изменится.

Я попытался изменить Uniform Javascript , чтобы все действия (т.е. click, focus, blur и т. Д.) Выполнялись под функцией .live. (т. е. .live("click",). Это просто мешает работать.

Обновление:

Я полностью прочитал Uniform JS и обнаружил проблему:

if(!$(elem).attr("checked")){
    //box was just unchecked, uncheck span
    spanTag.removeClass(options.checkedClass);
}else{
    //box was just checked, check span.
    spanTag.addClass(options.checkedClass);
}

Синтаксис .attr("checked") не работает. Он всегда вернет false. Зачем? Я не знаю. Кроме того, он не обновляет исходный input для удаления атрибута checked или установки атрибута checked.

Я пробежался по официальному сайту и обнаружил, что он не обновляет ввод флажка. Так что это не только я xP

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

if ($(elem).attr("checked")) // The original.
if ($(elem).attr("checked") == true)
if ($(elem).is(":checked"))
if ($(elem).checked)
// and:
var check = $(elem).match(/checked=/);
if (check == null)

Слова руководства очень ценятся ~: 3

Ответы [ 8 ]

57 голосов
/ 13 мая 2013

ПРОСТОЕ РЕШЕНИЕ

Это потому, что UniformJs требует обновления вашей модификации для единообразных элементов, если вам необходимо изменить значения в форме динамически:

$('#checkbox').prop('checked',true);
$.uniform.update();

Редактировать

Если вы хотите обновить только #checkbox:

$('#checkbox').prop('checked',true);
$.uniform.update('#checkbox');
18 голосов
/ 25 января 2015

Просто сделайте это:

$('#checkbox').prop('checked',true).uniform('refresh');
7 голосов
/ 08 сентября 2011

Я знаю, что это может быть немного поздно, но, надеюсь, это кому-нибудь поможет.Мне пришлось добавить пару строк в единый код, чтобы он смотрел предварительно проверенные флажки.Этот код начинается со строки 262 для меня.Я использую Uniform версию 1.7.5.Строки между примечаниями «добавлено Джоном» - вот что я добавил.

        "click.uniform touchend.uniform": function(){
      if(!$(elem).attr("checked")){
        //box was just unchecked, uncheck span
        spanTag.removeClass(options.checkedClass);
      // Added by John to look for checkboxes with the attr "checked" that have been click to uncheck
      }else if(!$(elem).is(':checked')){
        spanTag.removeClass(options.checkedClass);
      // end addition by john
      }else{
        //box was just checked, check span.
        spanTag.addClass(options.checkedClass);
      }
    },
2 голосов
/ 30 января 2013

Это было некоторое время, но у меня была та же проблема, но я решил ее простым решением.

Uniform добавляет span над флажком и присваивает ему класс checked, если он отмеченили нет, но только при загрузке страницы.Если вы установите или снимите флажок, когда страница уже загружена, она не будет проверяться (или проверять), но, поскольку span находится над ней, вы увидите, что она не обновлена, вам придется делать это вручную.

$('#myDiv input[type=checkbox]').attr('checked',true);
$('#myDiv input[type=checkbox]').parent().addClass('checked');

или

$('#myDiv input[type=checkbox]').attr('checked',false);
$('#myDiv input[type=checkbox]').parent().removeClass('checked');

Может быть не самым чистым решением, но отлично работает в любом браузере.

2 голосов
/ 19 октября 2011

jQuery 1.6.4 изменил значение функции attr(), которая используется jquery.uniform.js.attr() теперь возвращает состояние, в котором находился атрибут при загрузке страницы, а не состояние атрибута СЕЙЧАС.Существует функция замены prop(), которая выполняет работу, которую attr() выполняла.

Чтобы исправить плагин, заменяйте каждое вхождение attr("checked") на prop("checked").Также, измените attr("disabled") на prop("disabled").

Это должно исправить ваш проект.Это сработало для меня; -)

См. Также: https://github.com/pixelmatrix/uniform/pull/167,, который пытается решить проблему с лучшей обратной совместимостью.

1 голос
/ 26 сентября 2011

Я полагаю, что последняя версия Jquery использует другой метод для оценки значения: selected.Использование немного более старой версии (хотя и не идеальной) решило эту проблему для меня.Это было некоторое время назад, и PixelMatrix, похоже, до сих пор не обновил Uniform.

0 голосов
/ 10 августа 2012

Вам не нужно менять .attr() на .prop():

    "click.uniform touchend.uniform": function(){
        if(!$(elem).attr('checked')){
            //box was just unchecked, uncheck span
            spanTag.removeClass(options.checkedClass);

            //Added by PingOn
            $(elem).removeAttr('checked');
            //end addition by PingOn

            // Added by John
        }else if(!$(elem).is(':checked')){
            spanTag.removeClass(options.checkedClass);
            // end addition by john

            //Added by PingOn
            $(elem).removeAttr('checked');
            //end addition by PingOn
        }else{
            //box was just checked, check span.
            spanTag.addClass(options.checkedClass);

            //Added by PingOn
            $(elem).attr('checked','true');
            //end addition by PingOn
      }
0 голосов
/ 10 июля 2011

Не могли бы вы использовать что-то вроде

$("#checkbox").attr("checked", "true");

, чтобы установить флажок, и

$("#checkbox").removeAttr("checked");

чтобы снять галочку?

...