【问题标题】:jQuery: checkbox that selects (or deselects) all other checkboxes within its groupjQuery:选择(或取消选择)其组内所有其他复选框的复选框
【发布时间】:2013-05-30 04:46:52
【问题描述】:

这可能不像标题所说的那么简单。

我通过类将 div 设置为自制复选框(1px 边框,16px 正方形,自定义图形作为应用作为背景图像的复选符号)。单击时,将应用“选中”类。很简单。示例(未选中):<div class="checkbox group1"> </div>

我还有另一个复选框 (div),它是“主”,用于选择同一组中的所有其他复选框(本例中为 group1)。这位大师有一个特殊的类叫做'check_all':<div class="checkbox check_all group1"> </div>

所以你说,“简单;当 'check_all' 被选中时,只需选中 group1 中的所有框。”没那么容易。 check_all 是整个网站的通用类,因此可以在其他页面上重复使用;我也可能将它应用于同一页面上的 group2、group3 等。我需要 jQuery 函数来检查同一组中的所有内容。更复杂的是,组名不是连续的或以任何方式相关的;它们可以是“发票”或“cart_items”或“地址”。

我想到的事情:

1) 清除所有出现的 'checked'、'checkbox' 和 'check_all' 的 master 的 class 属性,并将剩余的字符串用作组名。问题:可能有比仅应用于子复选框的类更多的类。

2) 将“check_all_”附加到组名:“check_all_group1”。问题:jQuery hasclass 似乎不支持通配符来执行“开头”以首先附加处理程序函数。即使是这样,您仍然必须处理类并执行字符串函数才能到达“group1”。看起来笨重且不理想。

3) 将主 div 和所有子 div 放在父容器中。这是我想出的最接近的解决方案,但我不能保证属于其他组的其他复选框也不会出现在容器中。

欢迎重新设计整个概念。我只需要一种简单的方法来放入一个附加到一个函数的可重用类,该函数将选择同一组的所有其他“复选框”元素。

编辑: 该解决方案必须支持跨浏览器(甚至支持 IE 6.5),因为该站点的访问者将来自世界各地并且可能没有最新的技术。事实上,最近对现有网站的分析表明,10% 的访问者正在使用 3 年以上的浏览器。放眼全球。

代码示例

<table>
  <tr>
    <td><div class="checkbox check_all delete">&nbsp;</div>Delete</td>
    <td><div class="checkbox check_all mark">Mark</div></td>
  </tr>
  <tr>
    <td><div class="checkbox delete">&nbsp;</div></td>
    <td><div class="checkbox mark">&nbsp;</div></td>
    <td>Line 1</td>
  </tr>
  <tr>
    <td><div class="checkbox delete">&nbsp;</div></td>
    <td><div class="checkbox mark">&nbsp;</div></td>
    <td>Line 2</td>
  </tr>
</table>

【问题讨论】:

  • 主复选框不是位于其他复选框附近吗? jQuery 有各种选择器来获取下一个兄弟等。您需要发布您的 html 的表示。另外,什么是“附加到函数的可重用类”?
  • @7stud:它是视觉上的,但它可能不是 DOM 明智的。考虑一个电子邮件查看器(例如),其中包含 2 或 3 列用于删除、移动、标记等的复选框。可能有相邻的分组复选框。通过“可重用”,我只是在说明一个类可以随意重用于其他元素的预期效果。
  • "你仍然需要处理类并执行字符串函数才能到达 "group1"。正则表达式使这个过程变得简单,但如果有其他 div 具有 group1 类,我不会看看这有什么帮助。
  • check_all 控制的组是什么?我每个 check_all 只看到一个 div?你能发布一个更好的html示例吗?
  • @7stud:在示例中,有两个组:删除和标记。为了更好地说明,我添加了另一组子 div。

标签: javascript jquery


【解决方案1】:

对于这种情况,我将 div 与 class 分组

<div class="check_all" id="group1">&nbsp;</div>
  <div class="group1">&nbsp;</div>
  <div class="group1">&nbsp;</div>
...
<div class="check_all" id="group2">&nbsp;</div>
  <div class="group2">&nbsp;</div>
  <div class="group2">&nbsp;</div>

和 jQuery 搭配

$('.check_all').on('click',function(){
  $(this).hasClass('checked')?$('.'+this.id).addClass('checked'):$('.'+this.id).removeClass('checked');
});

【讨论】:

  • 这与Jamie的第二种方案基本相同。看起来这可能是最好的解决方案;将 master 的 ID 设置为组名,并选中/取消选中类中该组的所有元素。
【解决方案2】:

不如做这样的事情:

<input type="checkbox" data-group-selector="my_group_name" class="check_all">

...

<input type="checkbox" class="my_group_name">

那么……

$('.check_all').on('click', function (e) {
  var group = $(this).data('group-selector');
  $('.' + group).prop('checked');
});

<input type="checkbox" id="select_all_my_group_name" class="check_all">

...

<input type="checkbox" class="my_group_name">

那么……

$('.check_all').on('click', function (e) {
  var group = $(this).attr('id').replace('select_all_', '');
  $('.' + group).prop('checked');
});

【讨论】:

  • 解决方案必须是跨浏览器并支持 IE6.5(是的,我知道,我知道...)。我不认为 data 属性得到广泛支持。
  • 顺便说一下,您不需要在 html 中使用 data 属性,jQuery 允许您将数据存储在 Element 对象本身上,请参阅 data()。 group1 类的复选框 div 是否不止一组?
  • 查看更新版本。这个想法是让你的组的名称是一个属性,它是全选复选框的一部分,这样你就可以将它用于选择器。
  • @Jamie:我曾想过走 ID 路线,但我真的,真的希望它不依赖于外部因素......就像忘记如何整个机制从现在开始工作 6 个月,并且没有正确识别主人。但是话又说回来,主人需要一些方法来识别分组的元素。这就是为什么我想到了“check_all_”+ 组名方案。不过,您的建议可能是一个可行的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-02
  • 2013-01-25
  • 2022-01-17
  • 2014-06-29
  • 2013-09-30
  • 1970-01-01
相关资源
最近更新 更多