jQuery实现checkbox列表的全选、反选功能


Posted in Javascript onNovember 24, 2016

我们在做列表的时候经常会遇到全选,反选进行批量处理问题,例如:

jQuery实现checkbox列表的全选、反选功能

我当时就是简单的实现了,然后想封装到公共的js中,封装的太烂,不好意思贴出来了(就是把实现代码之间放到公共js中,然后每个页面都用固定的id,class,现在想想我都不好意思叫他封装了),然后想到之前老大有写过这个功能去看下他怎么写的,真是没有对比就没有伤害啊,这才叫封装;

$(':checkbox[data-check-target]').click(function () {
  var target = $(this).attr('data-check-target');
  if ($(this).prop('checked')) {
    $(target).prop('checked', true);
  } else {
    $(target).prop('checked', false);
  }
});

首先这儿的高封装性就体现出来了,只有一个自定义的data-check-target属性用于js和html分离后的连接桥梁(而我当时用两个:一个全选复选框,一个子复选框,有关的点都用上了,这样就没起到封装的效果,js和html耦合性太大)(我看到上面的js就在想怎么通过一个连接点把三个相关联的东西联系起来的呢);

接下来我们继续看具体使用的地方:

jQuery实现checkbox列表的全选、反选功能

我发现全选复选框用于和js链接的桥梁的自定义属性data-check-target有点特别:

<input type="checkbox" data-check-target=".id-checkbox" />

它的值为“.id-checkbox”,看起来就感觉好奇怪,继续往下看子复选框实现:

<input type="checkbox" name="ids[]" value="@item.Id" class="id-checkbox" />

到这儿才豁然开朗原来子复选框的class名称就存放在自定义属性data-check-target中;

var target = $(this).attr('data-check-target');

然后再通过自定义属性data-check-target拿到子复选框的class,从而达到高封装性;

我总结的就是js和html通过了自定义属性data-check-target通信,子复选框依赖全选复选框自定义属性data-check-target的值;

这个例子看下来代码不难,也没有什么地方很难理解的,就是通过一个自定义属性巧妙的完成了低耦合的封装,这也是正是这段代码的难点和精髓;

我真心抑制不住内心的崇拜,这几行代码太漂亮了。

PS:上面js为什么用prop而不用attr,因为:如果当前input中初始化未定义checked属性,则该元素没有指定的checked属性,所以.attr()会返回undefined;

对于HTML元素本身就带有的固有属性,在处理时,使用prop方法。对于HTML元素我们自己自定义的DOM属性,在处理时,使用attr方法。

Javascript 相关文章推荐
预加载css或javascript的js代码
Apr 23 Javascript
jquery1.9 下检测浏览器类型和版本的方法
Dec 26 Javascript
javascript正则匹配汉字、数字、字母、下划线
Apr 10 Javascript
javascript学习笔记之10个原生技巧
May 21 Javascript
浅析Bootstrap缩略图组件与警示框组件
Apr 29 Javascript
JS+Canvas绘制时钟效果
Aug 20 Javascript
jQuery tagsinput在h5邮件客户端中应用详解
Sep 26 Javascript
Angular4实现动态添加删除表单输入框功能
Aug 11 Javascript
JS路由跳转的简单实现代码
Sep 21 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
Oct 11 Javascript
vue+vuex+json-seiver实现数据展示+分页功能
Apr 11 Javascript
js实现全选和全不选
Jul 28 Javascript
jQuery Dialog 打开时自动聚焦的解决方法(两种方法)
Nov 24 #Javascript
概述javascript在Google IE中的调试技巧
Nov 24 #Javascript
基于Bootstrap和jQuery构建前端分页工具实例代码
Nov 23 #Javascript
Bootstrap复选框和单选按钮美化插件(推荐)
Nov 23 #Javascript
值得分享的Bootstrap Table使用教程
Nov 23 #Javascript
JavaScript面试题(指针、帽子和女朋友)
Nov 23 #Javascript
jQuery 出现Cannot read property ‘msie’ of undefined错误的解决方法
Nov 23 #Javascript
You might like
PHP用mysql数据库存储session的代码
2010/03/05 PHP
PHPer 需要了解的 5 个 Composer 小技巧
2014/08/18 PHP
PHP常见漏洞攻击分析
2016/02/21 PHP
thinkphp,onethink和thinkox中验证码不显示的解决方法分析
2016/06/06 PHP
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
node.js中的http.response.addTrailers方法使用说明
2014/12/14 Javascript
JQ技术实现注册页面带有校验密码强度
2015/07/27 Javascript
js实现仿网易点击弹出提示同时背景变暗效果
2015/08/13 Javascript
js HTML5上传示例代码完整版
2016/10/10 Javascript
js实现键盘自动打字效果
2016/12/23 Javascript
使用Angular缓存父页面数据的方法
2017/01/03 Javascript
react.js 翻页插件实例代码
2017/01/19 Javascript
拖动时防止选中
2017/02/03 Javascript
利用 spin.js 生成等待效果(js 等待效果)
2017/06/25 Javascript
Vue如何从1.0迁移到2.0
2017/10/19 Javascript
解决vue中对象属性改变视图不更新的问题
2018/02/23 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
jQuery实现简单弹幕效果
2019/11/28 jQuery
[43:41]OG vs Newbee 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
python去重,一个由dict组成的list的去重示例
2019/01/21 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
python多进程(加入进程池)操作常见案例
2019/10/21 Python
jupyter notebook 的工作空间设置操作
2020/04/20 Python
【HTML5】3D模型--百行代码实现旋转立体魔方实例
2016/12/16 HTML / CSS
班主任评语大全
2014/04/26 职场文书
关于梦想的演讲稿
2014/05/05 职场文书
实习推荐信
2014/05/10 职场文书
国际贸易毕业生自荐书
2014/06/22 职场文书
财会专业大学生求职信
2014/09/26 职场文书
社区灵活就业证明
2014/11/03 职场文书
部队2014年终工作总结
2014/11/27 职场文书
员工手册编写范本
2015/05/14 职场文书