jQuery Uniform Checkbox не (снимает) флажок

Я использую 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


person nderjung    schedule 09.07.2011    source источник


Ответы (8)


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

Это связано с тем, что UniformJs требует обновления модификации юниформ-элементов, если вам нужно динамически изменять значения в форме:

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

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

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

$('#checkbox').prop('checked',true);
$.uniform.update('#checkbox');
person Mick    schedule 13.05.2013

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

$('#checkbox').prop('checked',true).uniform('refresh');
person moledet    schedule 25.01.2015

Я знаю, что это может быть немного поздно, но, надеюсь, это поможет кому-то. Мне пришлось добавить пару строк в код униформы, чтобы он искал предварительно отмеченные флажки. Этот код у меня начинается со строки 262. Я использую униформу версии 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);
      }
    },
person John Goodman    schedule 08.09.2011
comment
Это не работает для jQuery 1.6.4, так как if(!$(elem).attr("checked")){ только проверяет, был ли установлен флажок при загрузке страницы. Это отличается от предыдущих версий jQuery. Используйте prop вместо attr, чтобы определить текущий статус проверки. - person Grant; 19.10.2011
comment
Отлично Джон попробовал метод Алекса по замене .attr на .prop в моем файле jquery.uniform.min, но не решил проблему. Реализовал ваше решение, а также добавил изменения в Grants, и это сработало. Спасибо, парни. Кстати, используя jQuery1.6.4. - person Cragly; 19.10.2011

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

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

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

or

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

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

person Jeff B.    schedule 30.01.2013
comment
Этот код отлично работает для меня. Только вторая строка кода сделала свое дело. Спасибо - person Sree; 13.02.2013
comment
Привет, Жан-Франсуа, это потому, что элементы Uniform необходимо обновлять после модификации, я опубликовал объяснение в этом ответе. - person Mick; 13.05.2013

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

person Grant    schedule 19.10.2011

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

person Danny    schedule 26.09.2011

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

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

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

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

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

person Mads Ohm Larsen    schedule 09.07.2011
comment
Эти методы будут работать после обнаружения синтаксиса, если элемент уже проверен. Все равно спасибо :D - person nderjung; 10.07.2011
comment
Ааа, тогда неправильно понял проблему :) - person Mads Ohm Larsen; 10.07.2011

Вам не нужно менять .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
      }
person PingOn    schedule 10.08.2012