基于layui的 三级类目多选的js实现

 JavaScript  2020-10-01  admin  1883  2542

1601087995272578.png

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>code.cent123.com</title>
    <link rel="stylesheet" href="./layui/css/layui.css">
    <script src="jquery.js"></script>
    <script src="./layui/layui.js"></script>
    <script src="./json.js"></script>
    <style>
        .layui-form-item .layui-input-inline {
            width: 300px;
        }

        form {
            width: 990px;
            margin: 0 auto;
        }

        .cat_col {
            height: 400px;
            width: 300px;
            display: inline-block;
            margin-right: 30px;
        }

        .cat_col dl {
            display: block;
            height: 400px;
        }

        .checkbox_span {
            line-height: 25px;
            cursor: pointer;
            box-sizing: border-box;
            display: inline-block;
            vertical-align: bottom;
        }

        .level_2, .level_1 {
            display: none;
        }
    </style>
</head>
<body>
<div style="padding: 20px; background-color: #F2F2F2;">
    <div class="layui-row layui-col-space15">
        <div>
            <div>
                <div>请选择</div>
                <div>
                    <form class="layui-form article-form ajaxForm" method="post">
                        <div>
                            <div class="layui-form-select cat_col" style="">
                                <dl class="layui-anim layui-anim-upbit" id="level_0">

                                </dl>
                            </div>

                            <div class="layui-form-select cat_col" style="">
                                <dl class="layui-anim layui-anim-upbit" id="level_1">

                                </dl>
                            </div>

                            <div class="layui-form-select cat_col" style="margin-right: 0px;">
                                <dl class="layui-anim layui-anim-upbit" id="level_2">

                                </dl>
                            </div>
                        </div>

                        <div>
                            <div>
                                <button type="submit" lay-submit="">立即提交</button>
                                <button type="button" class="layui-btn layui-btn-primary" id="reset">重置</button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
        </div>
    </div>
</div>

<script type="text/javascript">
    layui.use(['form'], function () {
        var form = layui.form,
            layer = layui.layer;

        // 点击一级分类
        $("body").on("click", ".level_0", function () {
            var id = $(this).find("[type='checkbox']").val();
            $(".level_1").css({
                "display": "none"
            });
            $(".level_2").css({
                "display": "none"
            });
            $(".parent_" + id).css({
                "display": "block"
            });
        });

        // 点击二级分类
        $("body").on("click", ".level_1", function () {
            var id = $(this).find("[type='checkbox']").val();
            $(".level_2").css({
                "display": "none"
            });
            $(".parent_" + id).css({
                "display": "block"
            });
        });

        $("body").on("click", ".layui-form-select i", function () {
            var isChecked = $(this).parent().siblings('input').attr("checked") == "checked"; // jquery判断checkbox的选中状态
            var id = $(this).parent().siblings('input').val();
            var parent_id = $(this).parent().parent().attr('data-parent_id');
            if (isChecked) {
                // 未选中
                $(this).parent().siblings("[type='checkbox']").attr("checked", false);
                notCheckedParents(parent_id);
                notCheckedChildren(id);
            } else {
                // 选中
                $(this).parent().siblings("[type='checkbox']").attr("checked", true);
                checkedParents(parent_id);
                checkedChildren(id);
            }

            form.render();
            // event.stopPropagation(); // 阻止事件冒泡
        });
        form.render();
    });

    /**
     * 有一个选中则父级递归选中
     * 一个子级只可能有一个父级
     */
    function checkedParents(parent_id) {
        var parent = $(".id_" + parent_id);
        $(parent).find("[type='checkbox']").attr("checked", true);
        $(parent).find("[type='checkbox']").prop("checked", true);
        var parent_id2 = $(parent).attr('data-parent_id');
        if (parent_id2 > 0) {
            checkedParents(parent_id2);
        }
    }

    /**
     * 有一个选中则子级递归 全选中
     */
    function checkedChildren(id) {
        var children = $(".parent_" + id);
        for (var i = 0; i < children.length; i++) {
            $(children[i]).find("[type='checkbox']").attr("checked", true);
            $(children[i]).find("[type='checkbox']").prop("checked", true);
            var id2 = $(children[i]).find("[type='checkbox']").val();
            if (id2 > 0) {
                checkedChildren(id2);
            }
        }
    }

    /**
     * 取消选中父类,判断父级是否全未选择,全未选中则取消父类
     */
    function notCheckedParents(parent_id) {
        var ids = [];
        var parent = $(".parent_" + parent_id);
        parent.each(function (index, element) {
            if ($(element).find("[type='checkbox']").attr("checked") == "checked") {
                var val = $(element).find("[type='checkbox']").val();
                ids.push(val);
            }
        });
        if (ids.length <= 0) {
            $(".id_" + parent_id).find("[type='checkbox']").attr("checked", false);
            $(".id_" + parent_id).find("[type='checkbox']").prop("checked", false);

            var parent_id2 = $(".id_" + parent_id).attr('data-parent_id');
            if (parent_id2 > 0) {
                notCheckedParents(parent_id2);
            }
        }
    }

    /**
     * 取消选中则子类全取消选中
     */
    function notCheckedChildren(id) {
        var children = $(".parent_" + id);
        for (var i = 0; i < children.length; i++) {
            $(children[i]).find("[type='checkbox']").attr("checked", false);
            $(children[i]).find("[type='checkbox']").prop("checked", false);
            var id2 = $(children[i]).find("[type='checkbox']").val();
            if (id2 > 0) {
                notCheckedChildren(id2);
            }
        }
    }


    createHtml();

    /**
     * 生成html
     */
    function createHtml() {
        var html = '';
        for (var i = 0, len = level_0.length; i < len; i++) {
            var checked = '';
            var data = level_0[i];
            if (data['checked'] == 1) {
                checked = 'checked';
            }
            html += "<dd data-parent_id='" + data['parent_id'] + "' class='level_0 id_" + data['id'] + "'>\n" +
                "         <input type='checkbox' name='level[0][]' value='" + data['id'] + "' lay-skin='primary' " + checked + " />\n" +
                "         <span>" + data['id'] + "-" + data['name'] + "</span>\n" +
                "    </dd>";
        }
        $("#level_0").html(html);


        var html = '';
        for (var i = 0, len = level_1.length; i < len; i++) {
            var checked = '';
            var data = level_1[i];
            if (data['checked'] == 1) {
                checked = 'checked';
            }
            html += " <dd data-parent_id='" + data['parent_id'] + "' class='level_1 parent_" + data['parent_id'] + " id_" + data['id'] + "'>\n" +
                "          <input type='checkbox' name='level[1][]' value='" + data['id'] + "' lay-skin='primary' " + checked + " />\n" +
                "          <span>" + data['id'] + "-" + data['name'] + "</span>\n" +
                "     </dd>";
        }
        $("#level_1").html(html);


        var html = '';
        for (var i = 0, len = level_2.length; i < len; i++) {
            var checked = '';
            var data = level_2[i];
            if (data['checked'] == 1) {
                checked = 'checked';
            }
            html += " <dd data-parent_id='" + data['parent_id'] + "' class='level_2 parent_" + data['parent_id'] + " id_" + data['id'] + "'>\n" +
                "         <input type='checkbox' name='level[2][]' value='" + data['id'] + "' lay-skin='primary' " + checked + " />\n" +
                "         <span>" + data['id'] + "-" + data['name'] + "</span>\n" +
                "     </dd>";
        }
        $("#level_2").html(html);
    }

    $("#reset").click(function () {
        createHtml();
        layui.form.render();
    })
</script>
</body>
</html>

完整示例代码见附件


如果文章对您有帮助,点击下方的广告,支持一下作者吧!