ZTree基本使用及本人详解 使用案例2

简介: ZTree基本使用及本人详解 使用案例2

image.png

需求6:左侧菜单栏

注意点1: 初始化组件加载方法 $(document).ready(function(){})不知道内部干了啥,我添加了注释,方便对照理解
注意点2:方法beforeClick()里面执行流程很绕,所以我梳理了下在方法上加入了执行流程说明,方便对照理解

碰到的问题:因为我所有案例写在同一个页面,加入菜单案例后把别的案例的样式都给改变了
解决方案:设置css样式时先进行id过滤 ,详情看下面的
image.png

image.png

案例原型对应官网下面的demo

image.png

前端代码

<!--需求6:左侧菜单栏   注意:按id进行筛选,否则会干扰其他树结构样式-->
<style type="text/css">
     #leftMenuTree li a.level0 {
   width:200px;height: 20px; text-align: center; display:block; background-color: #0B61A4; border:1px silver solid;}
     #leftMenuTree li a.level0.cur {
   background-color: #66A3D2; }
     #leftMenuTree li a.level0 span {
   display: block; color: white; padding-top:3px; font-size:12px; font-weight: bold;word-spacing: 2px;}
     #leftMenuTree li a.level0 span.button {
       float:right; margin-left: 10px; visibility: visible;display:none;}
     #leftMenuTree li span.button.switch.level0 {
   display:none;}
 </style>
<!--需求6:左侧菜单栏-->
<!--左侧菜单栏 注意:ul的class必须为ztree否则样式没效果,同时div的class指定为zTreeDemoBackground left-->
<div class="col-md-7">
    <hr><p>需求6:左侧菜单栏</p>
    <ul id="leftMenuTree" class="ztree"></ul>
</div>
//需求6配置:左侧菜单栏
    var setting6 = {
   
        data: {
   
            simpleData: {
   
                enable: true,  //true 、 false 分别表示 使用 、 不使用 简单数据模式
            }
        },
        callback: {
   
            onNodeCreated: this.onNodeCreated,  //用于捕获节点生成 DOM 后的事件回调函数
            beforeClick: this.beforeClick,      //用于捕获单击节点之前的事件回调函数,并且根据返回值确定是否允许单击操作
            onClick: this.onClick               //用于捕获节点被点击的事件回调函数
        },
        view : {
   
            selectedMulti: false,                //设置是否允许同时选中多个节点
            showLine : true,                    //设置 zTree 是否显示节点之间的连线
            dblClickExpand: false               //双击节点时,是否自动展开父节点的标识
        }
    };
    var curMenu = null, zTree_Menu = null;
    var zNodes6 =[
        {
    id:1, pId:0, name:"主菜单 1", open:true},        //open:true,记录 treeNode 节点的 展开 / 折叠 状态
        {
    id:11, pId:1, name:"子菜单 1-1"},
        {
    id:111, pId:11, name:"叶子节点 1-1-1"},
        {
    id:112, pId:11, name:"叶子节点 1-1-2"},
        {
    id:113, pId:11, name:"叶子节点 1-1-3"},
        {
    id:114, pId:11, name:"叶子节点 1-1-4"},
        {
    id:12, pId:1, name:"子菜单 1-2"},
        {
    id:121, pId:12, name:"叶子节点 1-2-1"},
        {
    id:122, pId:12, name:"叶子节点 1-2-2"},
        {
    id:123, pId:12, name:"叶子节点 1-2-3"},
        {
    id:124, pId:12, name:"叶子节点 1-2-4"},
        {
    id:2, pId:0, name:"主菜单 2"},
        {
    id:21, pId:2, name:"子菜单 2-1"},
        {
    id:211, pId:21, name:"叶子节点 2-1-1"},
        {
    id:212, pId:21, name:"叶子节点 2-1-2"},
        {
    id:213, pId:21, name:"叶子节点 2-1-3"},
        {
    id:214, pId:21, name:"叶子节点 2-1-4"},
        {
    id:22, pId:2, name:"子菜单 2-2"},
        {
    id:221, pId:22, name:"叶子节点 2-2-1"},
        {
    id:222, pId:22, name:"叶子节点 2-2-2"},
        {
    id:223, pId:22, name:"叶子节点 2-2-3"},
        {
    id:224, pId:22, name:"叶子节点 2-2-4"}
    ];
    $(document).ready(function(){
   
         $.fn.zTree.init($("#leftMenuTree"), setting6, zNodes6); //初始化树
        zTree_Menu = $.fn.zTree.getZTreeObj("leftMenuTree");
        curMenu = zTree_Menu.getNodes()[0].children[0].children[0]; //curMenu {id: 111, pId: 11, name: '叶子节点 1-1-1', level: 2, tId: 'leftMenuTree_3,....
        zTree_Menu.selectNode(curMenu);     //选中指定节点
        var a = $("#" + zTree_Menu.getNodes()[0].tId + "_a");       //获取id=“treeDemo_1_a” title="主菜单 1"的标签对象
        a.addClass("cur");  //添加css
    });
    function onClick(event, treeId, node) {
   
        alert("Do what you want to do!");
    }
    /**
     * 判断是否为父节点
     *      true:判断节点level === 0
     *          true:将第一个子节点“叶子结点1-1-1”赋值给pNode -》 按条件(pNode && pNode.level !==0)循环获取它的根节点“主菜单1”赋值给pNode -》 按条件(pNode !== node)判断当点击主菜单2时移除class(”cur“)等相关操作 -》判断children的open状态,进行相应的展开
     *          false:展开/折叠 指定的节点
     *      false:返回
     * @param treeId
     * @param node
     * @returns {boolean}
     */
    function beforeClick(treeId, node) {
       //treeId:leftMenuTree   node为每次点击的对象 node {id: 2, pId: null, name: '主菜单 2',...
        if (node.isParent) {
   
            if (node.level === 0) {
   
                var pNode = curMenu;
                while (pNode && pNode.level !==0) {
   
                    pNode = pNode.getParentNode();  //获取到根节点
                }
                if (pNode !== node) {
   
                    var a = $("#" + pNode.tId + "_a");
                    a.removeClass("cur");
                    zTree_Menu.expandNode(pNode, false);
                }
                a = $("#" + node.tId + "_a");
                a.addClass("cur");

                var isOpen = false;
                for (var i=0,l=node.children.length; i<l; i++) {
   
                    if(node.children[i].open) {
        //判断节点children的open状态
                        isOpen = true;
                        break;
                    }
                }
                if (isOpen) {
   
                    zTree_Menu.expandNode(node, true);
                    curMenu = node;
                } else {
   
                    zTree_Menu.expandNode(node.children[0].isParent?node.children[0]:node, true);
                    curMenu = node.children[0];
                }
            } else {
   
                zTree_Menu.expandNode(node);    //展开 / 折叠 指定的节点
            }
        }
        return !node.isParent;
    }

需求7:拖拽节点高级控制

注意说明1:zNodes7配置中:
open:true,记录 treeNode节点的【展开/折叠】状态
drag:false,禁止拖拽
childOuter:false,禁止子节点移走
dropRoot该属性未知,我查不到
dropInner:false:不变为文件夹
注意说明2:方法dropPrev()+dropInner()+dropNext()就是用来判断【true/false】的

碰到的问题1: 为啥有的移动完目标节点变为文件夹,而“禁止子节点移走 2”下的移动完双方都还是文件,而没有目标节点变为文件夹
解决方案:setting -》edit -》drag -》 inner属性,inner属性用来控制移动后目标节点是否变为文件夹【true:目标节点变为文件夹/false:不变为文件夹】

image.png

案例原型对应官网下面的demo

image.png

前端代吗

<!--需求7:拖拽节点高级控制-->
<div class="col-md-7">
     <hr><p>需求7:拖拽节点高级控制</p>
     <ul id="moveTree" class="ztree"></ul>
 </div>
//需求7:拖拽节点高级控制
    var setting7 = {
   
        edit: {
   
            drag: {
   
                autoExpandTrigger: true,    //拖拽时父节点自动展开是否触发 onExpand 事件回调函数
                prev: dropPrev,     //拖拽到目标节点时,设置是否允许移动到目标节点前面的操作
                inner: dropInner,   //拖拽到目标节点时,设置是否允许成为目标节点的子节点    注意:inner属性用来控制移动后目标节点是否变为文件夹【true:目标节点变为文件夹/false:不变为文件夹】
                next: dropNext      //拖拽到目标节点时,设置是否允许移动到目标节点后面的操作
            },
            enable: true,           //设置 zTree 是否处于编辑状态
            showRemoveBtn: false,   //设置是否显示删除按钮
            showRenameBtn: false    //设置是否显示编辑名称按钮
        },
        data: {
   
            simpleData: {
   
                enable: true    //true 、 false 分别表示 使用 、 不使用 简单数据模式
            }
        },
        callback: {
   
            beforeDrag: beforeDrag,         //用于捕获节点被拖拽之前的事件回调函数,并且根据返回值确定是否允许开启拖拽操作
            beforeDrop: beforeDrop,         //用于捕获节点拖拽操作结束之前的事件回调函数,并且根据返回值确定是否允许此拖拽操作
            beforeDragOpen: beforeDragOpen, //用于捕获拖拽节点移动到折叠状态的父节点后,即将自动展开该父节点之前的事件回调函数,并且根据返回值确定是否允许自动展开操作
            onDrag: onDrag,                 //用于捕获节点被拖拽的事件回调函数
            onDrop: onDrop,                 //用于捕获节点拖拽操作结束的事件回调函数
            onExpand: onExpand              //用于捕获节点被展开的事件回调函数
        }
    };
    var zNodes7 =[
        {
    id:1, pId:0, name:"随意拖拽 1", open:true},   //open:true,记录 treeNode节点的【展开/折叠】状态
        {
    id:11, pId:1, name:"随意拖拽 1-1"},
        {
    id:12, pId:1, name:"随意拖拽 1-2", open:true},
        {
    id:121, pId:12, name:"随意拖拽 1-2-1"},
        {
    id:122, pId:12, name:"随意拖拽 1-2-2"},
        {
    id:123, pId:12, name:"随意拖拽 1-2-3"},
        {
    id:13, pId:1, name:"禁止拖拽 1-3", drag:false},    //drag:false,禁止拖拽
        {
    id:131, pId:13, name:"禁止拖拽 1-3-1", drag:false},
        {
    id:132, pId:13, name:"禁止拖拽 1-3-2", drag:false},
        {
    id:132, pId:13, name:"禁止拖拽 1-3-3", drag:false},
        {
    id:2, pId:0, name:"禁止子节点移走 2", open:true, childOuter:false},  //childOuter:false,禁止子节点移走
        {
    id:21, pId:2, name:"我不想成为父节点 2-1", dropInner:false},
        {
    id:22, pId:2, name:"我不要成为根节点 2-2", dropRoot:false},   //dropRoot该属性未知,我查不到
        {
    id:23, pId:2, name:"拖拽试试看 2-3"},
        {
    id:3, pId:0, name:"禁止子节点排序/增加 3", open:true, childOrder:false, dropInner:false},  //dropInner:false:不变为文件夹
        {
    id:31, pId:3, name:"随意拖拽 3-1"},
        {
    id:32, pId:3, name:"随意拖拽 3-2"},
        {
    id:33, pId:3, name:"随意拖拽 3-3"}
    ];
    function dropPrev(treeId, nodes, targetNode) {
   
        var pNode = targetNode.getParentNode();
        if (pNode && pNode.dropInner === false) {
   
            return false;
        } else {
   
            for (var i=0,l=curDragNodes.length; i<l; i++) {
   
                var curPNode = curDragNodes[i].getParentNode();
                if (curPNode && curPNode !== targetNode.getParentNode() && curPNode.childOuter === false) {
   
                    return false;
                }
            }
        }
        return true;
    }
    function dropInner(treeId, nodes, targetNode) {
   
        if (targetNode && targetNode.dropInner === false) {
   
            return false;
        } else {
   
            for (var i=0,l=curDragNodes.length; i<l; i++) {
   
                if (!targetNode && curDragNodes[i].dropRoot === false) {
   
                    return false;
                } else if (curDragNodes[i].parentTId && curDragNodes[i].getParentNode() !== targetNode && curDragNodes[i].getParentNode().childOuter === false) {
   
                    return false;
                }
            }
        }
        return true;
    }
    function dropNext(treeId, nodes, targetNode) {
   
        var pNode = targetNode.getParentNode();
        if (pNode && pNode.dropInner === false) {
   
            return false;
        } else {
   
            for (var i=0,l=curDragNodes.length; i<l; i++) {
   
                var curPNode = curDragNodes[i].getParentNode();
                if (curPNode && curPNode !== targetNode.getParentNode() && curPNode.childOuter === false) {
   
                    return false;
                }
            }
        }
        return true;
    }
    var log, className = "dark", curDragNodes, autoExpandNode;
    function beforeDrag(treeId, treeNodes) {
   
        className = (className === "dark" ? "":"dark");
        for (var i=0,l=treeNodes.length; i<l; i++) {
   
            if (treeNodes[i].drag === false) {
   
                curDragNodes = null;
                return false;
            } else if (treeNodes[i].parentTId && treeNodes[i].getParentNode().childDrag === false) {
   
                curDragNodes = null;
                return false;
            }
        }
        curDragNodes = treeNodes;
        return true;
    }
    function beforeDragOpen(treeId, treeNode) {
   
        autoExpandNode = treeNode;
        return true;
    }
    function beforeDrop(treeId, treeNodes, targetNode, moveType, isCopy) {
   
        className = (className === "dark" ? "":"dark");
        return true;
    }
    function onDrag(event, treeId, treeNodes) {
   
        className = (className === "dark" ? "":"dark");
    }
    function onDrop(event, treeId, treeNodes, targetNode, moveType, isCopy) {
   
        className = (className === "dark" ? "":"dark");
    }
    function onExpand(event, treeId, treeNode) {
   
        if (treeNode === autoExpandNode) {
   
            className = (className === "dark" ? "":"dark");
        }
    }
    $(document).ready(function(){
   
        $.fn.zTree.init($("#moveTree"), setting7, zNodes7);
    });

image.png

重要信息

image.png
image.png

目录
相关文章
Echarts实战案例代码(23):富文本实现坐标轴文字和图片排版的解决方案
Echarts实战案例代码(23):富文本实现坐标轴文字和图片排版的解决方案
478 0
Cesium 获取当前视图范围
Cesium作为一个开源的WebGlobe解决方案已经很牛了,不过因为开发的资料不多,很多功能不知道怎么实现。下面记录下自己获取Cesium当前场景范围的方法(2维中对应的是extent)。   extent其实对我们有用的也就是左上角和右下角坐标,于是首先应该想办法实现的是获取场景左上角和右下角的经纬度坐标。
1835 0
|
3月前
|
存储 安全 数据安全/隐私保护
Joplin:一款真正属于你的开源笔记与待办事项应用
Joplin是一款免费开源的笔记工具,支持Markdown、多端同步与端到端加密,保障数据自主权。支持全平台使用,可同步至云存储,真正实现隐私安全与知识自由管理,是信息时代的理想笔记伴侣。(239字)
941 13
|
JSON 前端开发 安全
layui框架实战案例(22):多附件上传实战开发实录(php后端、文件删除、数据库删除)
layui框架实战案例(22):多附件上传实战开发实录(php后端、文件删除、数据库删除)
1272 0
|
数据采集 安全 文件存储
NAS极速远程访问!贝锐花生壳推出飞牛fnOS专属内网穿透服务
贝锐花生壳与飞牛私有云fnOS合作,推出专属客户端及映射服务,实现3倍传输速率提升。用户只需在fnOS应用中心搜索“花生壳”,一键安装即可享受高速、稳定、安全的远程NAS访问体验。
1793 9
|
Linux Python Windows
Matplotlib 中设置自定义中文字体的正确姿势
【11月更文挑战第16天】Matplotlib 默认不支持中文字体显示,需手动配置。方法包括:1) 修改全局字体设置,适用于整个脚本;2) 局部设置特定元素的字体;3) 使用系统字体名称,但可能因系统而异。通过这些方法可以有效解决中文乱码问题,确保图表中文本的正确显示。
1477 3
|
机器学习/深度学习 人工智能 编解码
深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
【9月更文挑战第2天】深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
 深入探索AI文生语音技术的奥秘:从文本输入到逼真语音输出的全链条语音合成过程解析
|
机器学习/深度学习 人工智能 供应链
量子计算有哪些应用场景
量子计算有哪些应用场景
3006 6
|
人工智能 前端开发 数据管理
10款低代码平台深度分析:加速复杂应用开发
### 十款低代码开发平台概览 - **Zoho Creator**:提供直观的拖放界面、预建模板、灵活数据管理、集成扩展、移动优化,适用于中小企业。 - **明道云**:专注企业应用,灵活业务模型设计、丰富组件库,但学习曲线较陡峭。 - **Microsoft Power Apps**:无缝集成Microsoft 365,大量组件,自定义连接器,但高度定制成本高。 - **Mendix**:模型驱动,高度定制,企业级安全,但复杂项目成本高。
909 2