淘先锋技术网

首页 1 2 3 4 5 6 7

复选框的思路

复选框的主要问题就是多个框以及父子框之间的联系以及因果关系,然后编写时有两个思路。

先暂写一个思路一,剩下的下次再补

源码

   <ul id="tree">
    <li><input type="checkbox" value="1">1
        <ul>
            <li>
                <input type="checkbox" value="1">2
                <ul>
                    <li><input type="checkbox" value="1">3
                        <ul>
                            <li><input type="checkbox" value="1">4
                                <ul>
                                    <li><input type="checkbox" value="1">5</li>
                                    <li><input type="checkbox" value="1">5</li>
                                    <li><input type="checkbox" value="1">5</li>
                                </ul>
                            </li>
                            <li><input type="checkbox" value="1">4</li>
                            <li><input type="checkbox" value="1">4</li>
                            <li><input type="checkbox" value="1">4</li>
                        </ul>
                    </li>
                    <li><input type="checkbox" value="1">3
                        <ul>
                            <li><input type="checkbox" value="1">4</li>
                        </ul>
                    </li>
                    <li><input type="checkbox" value="1">3</li>
                    <li><input type="checkbox" value="1">3</li>
                    <li><input type="checkbox" value="1">3</li>
                </ul>
            </li>
            <li>
                <input type="checkbox" value="1">2
                <ul>
                    <li><input type="checkbox" value="1">3
                        <ul>
                            <li><input type="checkbox" value="1">4
                                <ul>
                                    <li><input type="checkbox" value="1">5</li>
                                    <li><input type="checkbox" value="1">5</li>
                                    <li><input type="checkbox" value="1">5</li>
                                </ul>
                            </li>
                            <li><input type="checkbox" value="1">4</li>
                            <li><input type="checkbox" value="1">4</li>
                            <li><input type="checkbox" value="1">4</li>
                        </ul>
                    </li>
                    <li><input type="checkbox" value="1">3
                        <ul>
                            <li><input type="checkbox" value="1">4</li>
                        </ul>
                    </li>
                    <li><input type="checkbox" value="1">3</li>
                    <li><input type="checkbox" value="1">3</li>
                    <li><input type="checkbox" value="1">3</li>
                </ul>
            </li>
        </ul>
    </li>
</ul>

js

 <script src="js/jquery.min.js"></script>
<script>
    //该代码接受无限下级复选框,但是需要计算第二级复选框的父级位置
    $("input:checkbox").click(function () {
        let alllength = $(this).parents().length - 6
        // console.log("当前所有父级",$(this).parents())
        if ($(this).prop("checked") == true) {
            $(this).parents().children("input:checkbox").prop("checked", true); //点击后所有父元素被选中
            $(this).parent("li").find("input:checkbox").prop("checked", true); //点击后所有子元素被选中
        } else {
            // console.log($(this).parent().siblings("li").children("input[type='checkbox']:checked").length)
            //当前点击框的兄弟元素有多少个被选中
            if ($(this).parent().siblings("li").children("input[type='checkbox']:checked").length == 0)
            //判断其他兄弟选框是否被选中
            {
                if ($(this).parents().eq(alllength).siblings("li").children(
                        "input[type='checkbox']:checked").length == 0 && $(this).parents("li").find(
                        "input[type='checkbox']:checked").length == 0)
                //判断父级的兄弟的选框中是否存在选中
                {
                    $(this).parents().children("input:checkbox").prop("checked", false)
                    $(this).parent("li").find("input:checkbox").prop("checked", false);
                } else {
                    $(this).parent("li").find("input:checkbox").prop("checked", false);
                    $(this).parent().parent().siblings("input:checkbox").prop("checked", false)
                }
            } else {
                $(this).parent("li").find("input:checkbox").prop("checked", false);
            }
            if ($(this).parents("li").find("input[type='checkbox']:checked").length == 1) {
                $(this).parents("li").find("input[type='checkbox']:checked").prop("checked", false)
            }

        }
    })
</script>

注:该代码功能,可实现点击子框,所有父框都被选中,点击单一且有子的框时也可以做到全选子元素和直系父框,目前缺点:可添加下级复选框,然需要计算第二级复选框的位置信息,同时,单选取消子元素时,只有第一级直系父框会一并取消,其他直系父元素无反应,此代码缺陷不少,但复选框的思路相对完善,可供参考购物车类项目思路。
拓展:复选框的选中时影响其他选框相对简单,但是取消时与其他选框的逻辑结构相对繁琐,需要深入考虑。

思路二

复选框的第二个思路,这个思路就不太需要去考虑那么多了,简单来说就是zTree – jQuery 树插件,这个插件还是相对完善的,用法就简单记录一下,首先,自然是下载资源包,然后引入

 <link href="css/zTreeStyle/zTreeStyle.css" rel="stylesheet" />
 <script src="js/jquery.ztree.all.js"></script>  

然后就是配置setting

 var zNodes = []; //这个是节点数组
     var setting = {
        view: {
            dblClickExpand: false,
            showLine: true,
            selectedMulti: false,
            showIcon: false
        },
        data: {
            simpleData: {
                enable: true,
                idKey: "id",
                pIdKey: "pId",
                rootPId: ""
            }
        },

        check: {
            enable: true,
            chkStyle: "checkbox",
            chkboxType: {
                "Y": "s",
                "N": "s"
            }  //这个是父子关系的影响,具体的话还是查文档
        },
    };
      $(function () {
        // show()
        zNodes = [{
                id: "200000",
                pId: "0",
                name: "4",
                checked: false
            },
            {
                id: "2000000",
                pId: "0",
                name: "1",
                checked: true
            }, {
                id: "400000",
                pId: "0",
                name: "2",
                checked: false
            }, {
                id: "3000000",
                pId: "0",
                name: "3",
                checked: false
            }, 
        ]

        $.fn.zTree.init($("#regionZTree"), setting, zNodes);
        zTree = $.fn.zTree.getZTreeObj("regionZTree");
    })  
        var lstMenu = []
    saveTreeBtn = function () {
        //保存选择菜单
        // zTree = $.fn.zTree.getZTreeObj("ztree");
        var nodes = zTree.getCheckedNodes(true);
        // $scope.editData.lstMenu=[{"id":"100000"}];
        lstMenu = [];
        for (var i = 0; i < nodes.length; i++) {

            console.log(nodes[i].id);
            lstMenu.push({
                "id": nodes[i].id
            })
        }
        console.log(lstMenu)
    }