免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1692 | 回复: 0
打印 上一主题 下一主题

实现checkbox的全选/全不选/点选/行内点选(原生JS版和jQ版) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-10 16:33 |只看该作者 |倒序浏览
实现checkbox的全选/全不选/点选/行内点选(原生JS版和jQ版)



日常项目中, 对于列表类文章或数据, 大概都会用到checkbox的全选或全不选的功能, 以前的项目中也写过checkbox的选择js, 但都没有整理过. 正好前几天一个兄弟遇到了这个问题, 索性, 我花了点时间, 用原生JS与jQuery分别写了一个版本, 考虑到使用时灵活性问题, 未封装, 需要的童鞋使用时自行改下相关参数.


功能介绍点此查看DEMO
1. 全选/全不选 选框一体实现, 即列表中选框的状态与全选/全不选框前的选框状态一致;
2. 自动更改 全选/全不选 选框的状态, 即列表中选框都选中时, 全选/全不选 选框也选中, 反之亦然;
3. 列表行内点击也可选中行内的checkbox, 并与1,2中的功能联动.
另,本文重在写全选, 鼠标划入划出背景变色为简易实现, 更加完善的请参考: http://mrthink.net/javascript-tagnames-highlight/.
原生JS版本核心代码
  1. var js_chk = document.forms['js'].chk_can;
  2. var jsitems = document.forms['js'].jsitems;
  3. var jsrows = document.getElementById('js').getElementsByTagName('dd');

  4. //判断选中个数与实际选框个数实现全选/全不选框的状态
  5. var chk_canle = function(){
  6.     var checkedLen = 0;
  7.     //计算列表中选中状态的选框个数
  8.     for (var m = 0; m < jsitems.length; m++) {
  9.         if (jsitems[m].checked) {
  10.             checkedLen += 1;
  11.         }
  12.     }
  13.     //判断选中个数与实际个数是否相同,以确定全选/全不选状态
  14.     for (var m = 0; m < js_chk.length; m++) {
  15.         js_chk[m].checked = (jsitems.length == checkedLen);
  16.     }
  17. }

  18. //全选与全不选一体实现
  19. for (var i = 0; i < js_chk.length; i++) {
  20.     js_chk[i].onclick = function(){
  21.         //列表中选框与全选选框统一状态
  22.         for (var m = 0; m < jsitems.length; m++) {
  23.             jsitems[m].checked = this.checked;
  24.         }
  25.         //全选选框统一状态
  26.         for (var m = 0; m < js_chk.length; m++) {
  27.             js_chk[m].checked = this.checked;
  28.         }
  29.     }
  30. }

  31. //列表中选框点击
  32. for (var i = 0; i < jsitems.length; i++) {
  33.     jsitems[i].onclick = function(e){
  34.         //阻止冒泡,避免行点击事件中,直接选择选框无效
  35.         e && e.stopPropagation ? e.stopPropagation() : window.event.cancelBubble=true;
  36.         chk_canle();
  37.     }
  38. }

  39. //行内点击
  40. for (var i = 0; i < jsrows.length; i++) {
  41.     jsrows[i].onclick = function(){
  42.         //行内点击时,行内的选框状态为原状态取反
  43.         this.getElementsByTagName('input')[0].checked = !this.getElementsByTagName('input')[0].checked;
  44.         chk_canle();
  45.     }
  46. }
复制代码
jQ版本核心代码
  1. var _jq_chk = $('#jq>dl>dt>label>:checkbox');
  2. var _jqitems = $(':checkbox[name=jqitems]');
  3. var _rows = $('#jq>dl>dd');

  4. //全选与全不选一体实现
  5. _jq_chk.click(function(){
  6.     //列表中选框和全选选框统一状态
  7.     _jqitems.add(_jq_chk).attr('checked', this.checked);
  8. });

  9. //选框的点击事件
  10. _jqitems.click(function(e){
  11.     //阻止冒泡,避免行点击事件中,直接选择选框无效
  12.     e.stopPropagation();
  13.     //判断选中个数与实际个数是否相同,以确定全选/全不选状态
  14.     _jq_chk.attr('checked', _jqitems.size() == _jqitems.filter(':checked').size());
  15. });

  16. //点选行时选中行内的checkbox
  17. _rows.bind({
  18.     mouseenter: function(){
  19.         $(this).addClass('hover');
  20.     },
  21.     mouseleave: function(){
  22.         $(this).removeClass('hover');
  23.     },
  24.     //点选
  25.     click: function(){
  26.         //行内点击时,行内的选框状态为原状态取反
  27.         $(this).find(':checkbox').attr('checked', !$(this).find(':checkbox').get(0).checked)
  28.         //判断选中个数与实际个数是否相同,以确定全选/全不选状态
  29.         _jq_chk.attr('checked', _jqitems.size() == _jqitems.filter(':checked').size());
  30.     }
  31. });
复制代码
原文发布Mr.Think的博客:http://mrthink.net/js-jq-checkboxevent/
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP