jQuery Uniform Checkbox没有(un)检查

时间:2011-07-09 21:53:23

标签: jquery ajax checkbox append uniform

我使用jQuery Uniform来设置输入/选择等样式。但是,复选框已停止工作。我是从ajax调用发送的appending数据。加载后,我使用$.uniform.update("input:checkbox")更新新的html。尝试(取消)检查输入时,它只能工作一次。如果我想(再)检查它,它根本不会改变。

我尝试更改Uniform Javascript,以便所有操作(例如clickfocusblur等)都在.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

我用Google搜索了一下,发现了各种方法来检查是否选中了复选框但是以下方法失败了:

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 个答案:

答案 0 :(得分:57)

简单解决方案

这是因为如果您需要动态更改表单上的值,UniformJs要求您更新统一元素的修改:

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

修改

如果您只想更新#checkbox

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

答案 1 :(得分:18)

这样做:

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

答案 2 :(得分:7)

我知道这可能有点晚了,但希望它会对某人有所帮助。我不得不在统一代码中添加几行,以便查找预先选中的复选框。对于我,此代码从第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);
      }
    },

答案 3 :(得分:2)

jQuery 1.6.4改变了attr()函数的含义,jquery.uniform.js使用了该函数。 attr()现在返回页面加载时属性WAS的状态 - 而不是属性的状态现在是什么。有一个名为prop()的替换函数,它执行attr()以前的工作。

要修复插件,请将每个attr("checked")替换为prop("checked")。另外,将attr("disabled")更改为prop("disabled")

那应该修复你的项目。它对我有用; - )

另请参阅:https://github.com/pixelmatrix/uniform/pull/167,它尝试以更好的向后兼容性解决问题。

答案 4 :(得分:2)

已经有一段时间,但我遇到了同样的问题,但我通过一个简单的解决方案解决了这个问题。

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');

可能不是最干净的解决方案,但在每个浏览器上都能正常工作。

答案 5 :(得分:1)

我相信最新版本的Jquery使用不同的方法来评估:检查值。使用较旧的版本(虽然不理想)为我解决了这个问题。不久之前,PixelMatrix似乎还没有更新Uniform。

答案 6 :(得分:0)

你不能使用像

这样的东西
$("#checkbox").attr("checked", "true");

选中复选框,然后

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

取消选中它?

答案 7 :(得分:0)

您无需将.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
      }