【问题标题】:jQuery Failure to Uncheck Checkboxes ProgrammaticallyjQuery 无法以编程方式取消选中复选框
【发布时间】:2011-08-11 22:12:51
【问题描述】:

简单的功能,我想根据更改顶级复选框来切换选中/取消选中复选框。

问题在于切换/单击事件处理程序存在固有问题。如果您尝试将这些处理程序绑定到输入复选框,则该框的默认检查行为将失败。

所以,我尝试以两种不同的方式之一使用更改处理程序。

     $('input.all_neighborhoods').change(function(){
    if($(this).not(':checked')){
        $(this).closest('li').siblings('li').find('input[name=neighborhood_id]').attr('checked','checked');
    }
    else{
        $(this).closest('li').siblings('li').find('input[name=neighborhood_id]').removeAttr('checked');
    }

    });

在这里,第一个更改按您的预期工作。所有同级复选框都被选中并选中。但是,当我再次单击取消选中时,什么也没有发生。事件处理程序不起作用。

然后我尝试了这个:

   $('input.all_neighborhoods').change(function(){
    $(this).attr( 'checked', $(this).is( ':checked' ) ? $(this).closest('li').siblings('li').find('input[name=neighborhood_id]').attr('checked','checked'): $(this).removeAttr('checked').closest('li').siblings('li').find('input[name=neighborhood_id]').removeAttr('checked') );
}); 

在这里,兄弟复选框有效地切换。但是,主开/关开关复选框保持选中状态。

这里的问题是否与他们都是兄弟姐妹而主复选框不是父级这一事实有关?

【问题讨论】:

  • 嘿 Brendan,也许您也可以提供一些 HTML 标记 - 我很难在没有看到结构的情况下可视化正在发生的事情。如果您也有实时链接,那将非常容易解决。

标签: jquery checkbox click toggle


【解决方案1】:

(警告,前方无耻的自我推销)。我已经编写了一个 jQuery 插件来为你处理所有这些混乱。无需重新发明轮子。

查看:http://mjball.github.com/jQuery-CheckAll/


如果您想坚持当前的方法,以下是解决方法:

$('input.all_neighborhoods').change(function() {
    $(this).closest('li')
        .siblings('li')
        .find('input[name=neighborhood_id]').attr('checked', this.checked);
}

只需将布尔值传递给.attr()。另外,根据When to use Vanilla JavaScript vs. jQuery?,请勿使用

$(this).is(':checked')

改为使用

this.checked

编写的字符更少,不需要任何 jQuery,并且方式更高效。

【讨论】:

  • 第三次左右写主从逻辑就厌烦了,把它变成插件真的没什么工作。
  • 啊,我希望我可以在没有插件的情况下做到这一点。不过我会试试这个,谢谢马特
  • @Bredan:你可以在没有插件的情况下做到这一点。该插件只是使它很好地封装和可重用。实际代码少于 100 行 - 其中包含大量空格和 Allman-style indentation - 因此您应该能够浏览代码并理解它的作用。
  • 太棒了。另外,感谢您的链接,我是菜鸟,我正在努力找出效率
猜你喜欢
  • 2011-11-15
  • 1970-01-01
  • 2023-03-30
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多