zoukankan      html  css  js  c++  java
  • 多级勾选框联动核心js

    最近写了两次多级联动勾选框,有了点小心得,总结一下:

    需求:

    情形:当勾选/取消勾选框

    1、其子集的框全部被勾选,当取消勾选框时,其子孙勾选框全部取消勾选;

    2、其所有祖父级,若果检查到子孙级有被勾选的,需要将自身状态变成勾选状态,若没有被勾选的,则所有祖父级取消勾选转态

    代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
    <script>
        let o = {
            status:false,
            child:[
                {
                    status:true,
                    child:[
                        {status:false,child:[]},
                        {status:false,child:[]},
                        {status:false,child:[]},
                    ] 
                },
                {
                    status:false,
                    child:[
                        {status:false,child:[]},
                        {status:false,child:[]},
                        {status:false,child:[]},
                    ] 
                },
                {
                    status:false,
                    child:[
                        {status:false,child:[]},
                        {status:false,child:[]},
                        {status:false,child:[]},
                    ] 
                },
            ]
        };
        let a={};
        a.changeChildStatus = function(curParent){
        // 根据当前对象的状态 改变所有子集的状态
        //参数接收当前对象
            if(curParent.child && curParent.child.length>0){
                curParent.child.forEach(item=>{
                    item.status = curParent.status;
                    a.changeChildStatus(item);
                    
                })
            }
        }
        a.allChildStatusArr = function(obj){
        // 获取当前对象下所有子集的状态 (递归)
        //参数接收当前对象
            let allChildArr = [];
            function getAllChildSatus(obj){
                if(obj.child && obj.child.length>0){
                    obj.child.forEach(item=>{
                        allChildArr.push(item.status);
                        getAllChildSatus(item);
                    })
                }
            }
            getAllChildSatus(obj)
            return allChildArr;
        }
        a.changeParentStatus = function(parentObj){
        // 根据子集状态改变父级状态 (递归)
        // 接收最大的对象
            parentObj.allChildStatusArr = a.allChildStatusArr(parentObj); 
            if(parentObj.allChildStatusArr.includes(true)){
                parentObj.status = true;
            }else if(parentObj.allChildStatusArr.every(item=>item == false) && parentObj.allChildStatusArr.length > 0){
                parentObj.status = false;
            }
            if(parentObj.child && parentObj.child.length>0){
                parentObj.child.forEach(item=>{
                    a.changeParentStatus(item);
                })
            }
        }
        a.linked = function(bigObj,curObj,plies = 0){
        //联动总方法
        // 参数接收 最大对象,当前对象,层数
            a.changeChildStatus.call(curObj,curObj);//改变当前对象下子集的状态
            for(let i = 0;i < plies; i++){
            // 因为需要一层一层的改变父级状态,所以有几层,调用几次
                a.changeParentStatus.call(bigObj,bigObj);
            }
        }
        a.linked(o,o.child[0],3);//调用联动方法
        console.log(JSON.parse(JSON.stringify(o)));
    </script>
    </body>
    </html>

  • 相关阅读:
    C++中的空类,编译器默认可以产生哪些成员函数
    野指针(Wild pointer)和悬垂指针(dangling pointer)
    WHY C++ ?(by Herb Sutter) & C++17 standard
    mapreduce 多路输出
    stdout 编码 vim 删除左边,右边
    积累碎片shell
    python logging模块
    shell 流程控制
    shell 变量
    时间管理法则
  • 原文地址:https://www.cnblogs.com/fqh123/p/13978604.html
Copyright © 2011-2022 走看看