jQuery Uniform Checkbox 不(取消)选中

Posted

技术标签:

【中文标题】jQuery Uniform Checkbox 不(取消)选中【英文标题】:jQuery Uniform Checkbox does not (un)check 【发布时间】:2011-10-02 00:53:15 【问题描述】:

我正在使用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

我在谷歌上搜索了一下,发现了各种检查复选框是否被选中的方法,但是以下方法失败了:

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

【问题讨论】:

【参考方案1】:

简单的解决方案

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

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

编辑

如果您只想更新#checkbox

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

【讨论】:

【参考方案2】:

这样做:

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

【讨论】:

【参考方案3】:

我知道这可能有点晚了,但希望它会对某人有所帮助。我必须在统一代码中添加几行,以便它会查找预先选中的复选框。这段代码对我来说从第 262 行开始。我正在使用统一版本 1.7.5。 “由 John 添加”注释之间的线条是我添加的。

        "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);
      
    ,

【讨论】:

这对 jQuery 1.6.4 不起作用,因为 if(!$(elem).attr("checked")) 仅在页面加载时检查复选框是否被选中。这是与以前版本的 jQuery 不同的行为。使用prop 而不是attr 来确定“已检查”的当前状态。 优秀的 John 在我的 jquery.uniform.min 文件上尝试了 Alex 将 .attr 更改为 .prop 的方法,但没有解决问题。实施了您的解决方案并添加了 Grants 更改,并且效果很好。多谢你们。顺便用jQuery1.6.4。【参考方案4】:

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

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

可能不是最干净的解决方案,但适用于所有浏览器。

【讨论】:

这段代码对我来说很好用。仅第二行代码就可以解决问题。谢谢 Hey Jean-Francois,这是因为Uniform元素在修改后需要更新,我已经发布了解释@​​987654321@。【参考方案5】:

jQuery 1.6.4 改变了 jquery.uniform.js 使用的attr() 函数的含义。 attr() 现在返回页面加载时属性所处的状态 - 而不是现在属性的状态。有一个名为prop() 的替换函数,它完成了attr() 过去所做的工作。

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

这应该可以修复您的项目。它对我有用;-)

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

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

你不能使用类似的东西

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

使复选框被选中,并且

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

取消选中它?

【讨论】:

如果元素已被检查,一旦发现语法,这些方法就会起作用。无论如何谢谢:D 啊,那是误会问题了:)【参考方案8】:

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

【讨论】:

以上是关于jQuery Uniform Checkbox 不(取消)选中的主要内容,如果未能解决你的问题,请参考以下文章

无法隐藏选择器,jQuery Uniform 插件

jquery判断checkbox是否选中及改变checkbox状态

jQuery控制checkbox选中状态但是不显示选中

如何用jQuery实现checkbox全选

jQuery点击tr实现checkbox

JQuery实现的 checkbox 全选反选。