功能介绍
 
整个复选框是包含多级,可能有父级,可能有子级,在勾选复选框时,要做两种判断:
1要判断它下面有没有子级,有子级将子级的选中状态checked变得和自己一样。
2要判断它是否有父级,有父级勾选时判断同级兄弟是否都是选中状态,如果选中将父级勾选上;取消勾选时将父级的勾选状态变为false
 
复选框交互要实现的效果如下:
 
 
实现思路说明
 
1.设计一种方式让我们知道谁是自己的父级谁是自己的子级。我是用的<input>的name和id值标识的。子级的name值等于父级的id值
2.checkone(),递归操作父级,当前checked=false,所有父级设置为false。当前checked=true,递归判断父级的所有自己是否都选中了,如果是就将父级的checked=true
3.check(),check one操纵父级,同时递归操作当前元素的子级全选或全取消
4.submittestsuit()提交功能,遍历所有<input>,将所有checked=true,且id为testcase的提交,id可以自己定义(因为我需求只要最末级的case的值)
 
复选框JS代码如下:
  1. <script type="text/javascript">
  2. function checkone(element){
  3. var checkstatus=element.checked
  4. var checkid=element.id
  5. var checkname=element.name
  6. if (checkstatus == false && document.getElementById(checkname)){
  7. document.getElementById(checkname).checked=checkstatus//document.getElementById(checkname)表示全选按钮
  8. }
  9. else if (document.getElementById(checkname)){
  10. var samelevelgroup=document.getElementsByName(checkname)
  11. var allchecked=true
  12. for (var i=0;i<samelevelgroup.length;i++){
  13. if (samelevelgroup[i].checked==false){
  14. allchecked=false
  15. }
  16.  
  17. }
  18. if ( allchecked==true ){
  19. document.getElementById(checkname).checked=true
  20. }
  21. }
  22. if (document.getElementById(checkname)){
  23. checkone(document.getElementById(checkname))
  24. }
  25. }
  26. function check(element)
  27. {
  28. {# 全选用id,全选下面的复选框用name对应#}
  29. var checkstatus=element.checked
  30. var checkid=element.id
  31.  
  32. checkone(element)
  33. var checkgroups_down=document.getElementsByName(checkid)
  34. for (var i = 0; i < checkgroups_down.length; i++)
  35. {
  36. checkgroups_down[i].checked=checkstatus
  37. var childid= checkgroups_down[i].id
  38. if (document.getElementsByName(childid).length>1){//如果下面有name和自己的id一致,就认为这是分组全选,下面还有子项
  39. check(document.getElementById(childid))
  40. }
  41. }
  42. }
  43. function submittestsuit() {
  44. var allcase=document.getElementsByTagName("input")
  45. var selectcase=[]
  46. for (var i=0;i<allcase.length;i++){
  47. if ((allcase[i].checked == true) && (allcase[i].id == "testcase")) {
  48.  
  49. var filename=allcase[i].parentNode.previousSibling.previousSibling.innerHTML
  50. var functionname=allcase[i].parentNode.previousSibling.previousSibling.previousSibling.previousSibling.innerHTML
  51. {# alert(functionname)#}
  52. var caseinfo = {
  53. functionname:functionname,
  54. filename:filename
  55. }
  56. selectcase.push(caseinfo)
  57. }
  58.  
  59. }
  60. if (selectcase.length < 1){
  61. alert("至少选择一个case!")
  62. }
  63. else{
  64. $.ajax({
  65. cache: true,
  66. type: "POST",
  67. url:"{% url "save_testsuit" %}",
  68. data:{caseinfos:JSON.stringify(selectcase)},// 你的formid
  69. async: false,
  70. error: function(request) {
  71. alert("保存失败");
  72. },
  73. success: function(data) {
  74. if(data.respcode==0){
  75. alert("测试套件已生成");
  76. var w = window.open();
  77. w.location=("{% url "runtestinfo" %}")
  78. }
  79. else{
  80. alert(JSON.stringify(selectcase))
  81. alert(data.msg);
  82. }
  83. }
  84. });
  85. }
  86.  
  87. }
  88. </script>
 
复选框HTML代码如下:
 
主要是把<input>子级和父级的name和id值对应一样即可
 
  1. <div style="margin-bottom: 10px">
  2. <span style="margin-left: 10px">全选所有case </span>
  3. <input type="checkbox" id="groupcheck" onclick="check(this)">
  4. </div>
  5. <div>
  6. <table class="table table-hover">
  7. <tr style="background-color: #5bc0de">
  8. <th>用例描述</th>
  9. <th>测试方法名</th>
  10. <th>所属文件</th>
  11. <th>勾选要执行的用例</th>
  12. </tr>
  13. {# 全选是根据name和id进行联动的,上级的id和下级的name要一致#}
  14. {% for group in testcaselist.testcaseslist %}
  15. <tr style="background-color: #9acfea">
  16. <th>
  17. <span>{{ group.groupname }}</span>
  18. <span><input id="{{ group.groupname }}" name="groupcheck" type="checkbox" onclick="check(this)"></span>
  19. </th>
  20. </tr>
  21.  
  22. {% for testcase in group.testcase %}
  23. <tr>
  24. <td width="35%">{{ testcase.desc }}</td>
  25. <td width="30%" id="functionname">{{ testcase.functionname }}</td>
  26. <td width="20%" id="filename">{{ testcase.filename }}</td>
  27. <td width="15%"><input id="testcase" name="{{ group.groupname }}" type="checkbox" onclick="check(this)"></td>
  28. </tr>
  29. {% endfor %}
  30.  
  31. {% endfor %}
  32.  
  33. </table>
  34. </div>
  35. <div style="margin-top: 20px">
  36. <button type="button" class="btn btn-default" onclick="submittestsuit()">生成测试套件</button>
  37.  
  38. </div>
 

js实现多级复选框的交互的更多相关文章

  1. 模拟多级复选框效果的jquery代码

    jquery做了个多级复选框的效果,代码总共就20+行就over了. 我又想用js来做一个看看,才写了几个方法就写不动了,兼容性要考虑很多,而且代码量直线上升. 主要分享下jquery的这个效果的实现 ...

  2. 模拟多级复选框效果--jquery

    今天又次体会到jquery的强大了,做了个多级复选框的效果,代码总共就20+行就over了. 我又想用js来做一个看看,才写了几个方法就写不动了,兼容性要考虑很多,而且代码量直线上升. 主要分享下jq ...

  3. js获取checkbox复选框获取选中的选项

    js获取checkbox复选框获取选中的选项 分享下javascript获取checkbox 复选框获取选中的选项的方法. 有关javascript 获取checkbox复选框的实例数不胜数.js实现 ...

  4. Js动态添加复选框Checkbox

    Js动态添加复选框Checkbox的实例方法!!! 首先,使用JS动态产生Checkbox可以采用如下类似的语句: var checkBox=document.createElement(" ...

  5. 用js判断一个复选框是否被选中

    <html> <head>        <title>            复选框全选.全不选.反选.必选一个        </title>    ...

  6. js自定义修改复选框单选框样式,清除复选框单选框默认样式

    之前做项目的时候,也遇到过需要按照设计稿把<input type="checkbox">和<input type="radio">的默认 ...

  7. 原生js实现三级复选框

    工作中要做一个三级的复选框,用js实现了一下,从项目中把相关代码抽取出来了,有相关需求的可以参考一下.亲测可用. <!DOCTYPE html> <html> <head ...

  8. js操作checkbox(复选框)的方法总结

    收集了一些用js代码操作checkbox复选框的代码,分享出来,供需要的朋友参考: <script> //复选框checkbox 处理方法 //搜集整理 www.jbxue.com fun ...

  9. JS获取页面复选框选中的值

    function jqchk(){ //jquery获取复选框值 var chk_value =[]; $('input[class="sel"]:checked').each(f ...

随机推荐

  1. 转载:老生常谈C++中实参形参的传递问题

    以下文章转载自:http://www.jb51.net/article/108390.htm 函数中参数的传递 这里说的传递当然是指 实参是如何传递给形参的啦 还挺复杂的~~~~~~~~⊙﹏⊙b汗,这 ...

  2. docker 报ls: cannot open directory software/: Permission denied

    问题原因及解决办法 原因是CentOS7中的安全模块selinux把权限禁掉了,至少有以下三种方式解决挂载的目录没有权限的问题: 1.在运行容器的时候,给容器加特权,及加上 --privileged= ...

  3. ThinkPHP输入验证和I方法使用

    在Web开发过程中,我们经常需要获取系统变量或者用户提交的数据,这些变量数据错综复杂,而且一不小心就容易引起安全隐患,但是如果利用好ThinkPHP提供的变量获取功能,就可以轻松的获取和驾驭变量了. ...

  4. 使用STM32CubeMX生成RTC工程[闹钟中断2]

    在上次使用STM32CubeMX生成RTC工程[闹钟中断]基础上实现周期间隔的闹钟 一些场合需要周期性的闹钟 现在为了方便设置每十秒来一次. 备注: 当然可以直接修改HAL库static HAL_St ...

  5. 关于npm 包的发布

    注册一个npm 账号,打开命令行输入 npm add user 然后登录 npm login 发布npm 包,在你要发布的包的目录下,在创建账号后需要认证邮箱,否则无法发布,发布同一个包,每次的版本需 ...

  6. react-native android 和ios 集成 jpush-react-native 激光推送

    安装 $ npm install jpush-react-native --save # jpush-react-native 版本以后需要同时安装 jcore-react-native $ npm ...

  7. 使用expect解决shell交互问题

    比如ssh的时候,如果没设置免密登陆,那么就需要输入密码.使用expect可以做成自动应答 1.expect检测和安装 sudo apt-get install tcl tk expect 2.脚本样 ...

  8. golang redis集群操作:redis-go-cluster

    背景 感觉redis-cli desktop及其难用,最近用golang做了个redis查询工具,支持单例和集群操作,终于不再卡顿!!! 用到的包 "github.com/garyburd/ ...

  9. 关于php MD5加密 与java MD5 加密结果不一致的问题

    针对PHP不是UTF-8编码导致的问题 public String md5(String txt) {              try{                   MessageDiges ...

  10. 关于vector变量的size,是一个无符号数引发的bug。LeetCode 3 sum

    class Solution { public: vector<vector<int>> threeSum(vector<int>& a) { vector ...