ztree的添加、修改、删除及前后台交互_ztree添加数据_刘家小婉的博客-程序员秘密

技术标签: 功能插件  

一、引入资源

下载并引入ztree的相关js,css和img等。http://www.treejs.cn/v3/api.php

ztree的核心代码jquery.ztree.core.js
ztree关于选中的代码jquery.ztree.excheck.js(如果有复选框引入)
ztree关于是否可编辑的代码jquery.exedit.js(允许修改节点时引入)

二、初始化ztree

1、页面中创建tree需要显示的载体dom
2、设置ztree的基本配置参数 setting

// zTree 的参数配置,深入使用请参考 API 文档(setting 配置详解)
    var setting = {
    
    	//是否允许编辑节点
        edit: {
    
            enable: true,
            editNameSelectAll: true,
            showRemoveBtn: true,
            removeTitle: "删除节点",
            showRenameBtn: true,
            renameTitle: "编辑节点"
        },
        data: {
    
            simpleData: {
    
                enable: true
            }
        },
        callback: {
    
            beforeRemove: beforeRemove,  //移除前
            beforeRename: beforeRename,   //重命名前
            //onRemove: onRemove,
            onRename: onRename,
            beforeDrag:beforeDrag,
            onClick: zTreeOnClick //注册节点的点击事件
        },
        view: {
    
            selectedMulti: false,
            addHoverDom: addHoverDom, //移入节点显示编辑按钮
            removeHoverDom: removeHoverDom  //移入节点显示编辑按钮
        },
    };

3、获取节点初始数据,并初始化ztree
ztree支持的数据结构,可查看官网文档。

 //获取部门tree数据
    function loadTree() {
    
        $.ajax({
    
            type: 'POST',
            contentType: '',
            url: "",
            data: {
    },
            timeout: 1000, //超时时间设置,单位毫秒
            dataType: 'json',
            success: function (res) {
    
                zNodes = []; //初始化ztree
                for (var i = 0; i < res.length; i++) {
    
                    var data = res[i]
                    zNodes.push({
    
                        'id': data.id,
                        'pId': data.pId,
                        'name': data.name,
                        'open': false
                    });
                }
                zTreeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes); //初始化ztree
            }
        })

    }

    $(document).ready(function () {
    
        loadTree();
    });

三、配置增删改方法

添加:

在节点下添加新节点信息
1、首先在setting的callback中,设置addHoverDom方法,鼠标移入节点时,显示编辑按钮;在setting的edit中也需要设置显示编辑按钮。
2、

//鼠标移入节点,显示编辑按钮
    function addHoverDom(treeId, treeNode) {
      //treeNode是当前hover的节点信息
        var sObj = $("#" + treeNode.tId + "_span");
        if (treeNode.editNameFlag || $("#addBtn_" + treeNode.tId).length > 0) return;
        var addStr = "<span class='button add' id='addBtn_" + treeNode.tId
            + "' title='添加节点' onfocus='this.blur();'></span>";
        sObj.after(addStr);
        var btn = $("#addBtn_" + treeNode.tId);

        //判断该部门下是否有人员,用于删除节点时,当节点下有信息,禁止删除。
        var data1 = {
    
            "id": treeNode.id,
            "pageNumber": currentPageNumber,
            "pageSize": currentPageSize
        };
        $.ajax({
    
            type: 'POST',
            url: "",
            data: data1,
            timeout: 1000, //超时时间设置,单位毫秒
            dataType: 'json',
            success: function (res) {
    
                //console.log(res);
                if(res.flag == 0){
    
                    var datalist = res.data.list;
                    if(datalist.length==0){
    
                        hasMember = false;
                    }else{
    
                        hasMember = true;
                    }
                }

            }
        });
        //当点击添加按钮时:
        if (btn) btn.bind("click", function () {
    
            var zTree = $.fn.zTree.getZTreeObj("treeDemo");
            console.log(treeNode.id);
            var name = "新部门" + (newCount++);
            var newNode;
            //发送请求保存一个新建的节点,后台返回ID,用返回的ID新增节点
            var data = {
    
                "code": treeNode.id,
                "name": name
            };
            $.ajax({
    
                type: 'post',
                url: "",
                data: data,
                timeout: 1000, //超时时间设置,单位毫秒
                dataType: 'json',
                success: function (res) {
    
                    console.log(res)
                    if (res.flag == 0 ) {
    
                        var newId = res.data;
                        //在树节点上增加节点
                        newNode = zTree.addNodes(treeNode, {
    id: newId, pId: treeNode.id, name: name});
                        zTree.editName(newNode[0]) //新增的节点进入编辑状态
                    }
                }
            });
            return false;
        });
    }

添加新的根节点
流程与上述方法类似,只是在树节点之外增加一个新增根节点按钮,并添加上对应的方法

//添加根节点
    $('.addnode').click(function () {
    
        var zTree = $.fn.zTree.getZTreeObj("treeDemo"),
            nodes = zTree.getNodes();
            console.log(nodes)
			
        var name = "新部门" + (newCount++);
        var newNode;
        //发送请求保存一个新建的节点,根据返回ID添加新节点
        var data = {
    
            "code": 0,
            "name": name
        };
        $.ajax({
    
            type: 'post',
            url: "",
            data: data,
            timeout: 1000, //超时时间设置,单位毫秒
            dataType: 'json',
            success: function (res) {
    
                console.log(res)
                if (res.flag == 0) {
    
                    var newId = res.data;
                    newNode = zTree.addNodes(null, {
    id: newId, pId: null, name: name});
                    zTree.editName(newNode[0]);  //新增后显示编辑状态
                }
            }
        });
    });

修改

重命名修改
1、重命名之前的判空,在beforeRename函数中判断

//重命名之前的判断
    function beforeRename(treeId, treeNode, newName) {
    
        if (newName.length == 0) {
    
            layer.msg("节点名称不能为空.");
            var zTree = $.fn.zTree.getZTreeObj("treeDemo");
            setTimeout(function () {
    
                zTree.editName(treeNode)
            }, 10);
            return false;
        }
        return true;
    }

2、重命名的前后台交互

//修改节点信息
    function onRename(event, treeId, treeNode, isCancel) {
    
        if (isCancel) {
    
            return;
        }
        var zTree = $.fn.zTree.getZTreeObj("treeDemo");
        var onodes = zTree.getNodes()
        console.log(onodes);
        //发送请求修改节点信息
        var data = {
    
            "id": treeNode.id,
            "code": treeNode.pId,  //父节点
            "name": treeNode.name,
        };
        $.ajax({
    
            type: 'post',
            url: "",
            data: data,
            timeout: 1000, //超时时间设置,单位毫秒
            dataType: 'json',
            success: function (res) {
    
                    layer.msg(res.msg)
            }
        });
    }

删除

需求:
删除前需要二次确认;
当节点下有子节点时,禁止删除改节点;
当节点下有对应的其他信息时,禁止删除;

//删除之前的判断
    function beforeRemove(treeId, treeNode) {
    
        var data = {
    
            "id": treeNode.id
        };
        className = (className === "dark" ? "" : "dark");

        if(treeNode.isParent){
    
            layer.alert('该节点下有子节点,不能删除');
            return false;
        }

        if(hasMember){
    
            layer.alert('该部门下有人员,不能删除');
            return false;
        }
        var oFlag = confirm("确认删除 节点 -- " + treeNode.name + " 吗?");
        if(oFlag){
    
            $.ajax({
    
                type: 'post',
                url: "",
                data: data,
                timeout: 1000, //超时时间设置,单位毫秒
                dataType: 'json',
                success: function (res) {
    
                    console.log(res)
                    if (res.flag == 0) {
    
                        layer.msg(res.msg)
                        return true;
                    }else {
    
                        layer.msg(res.msg);
                        return false;
                    }
                }
            })
        }else{
    
            return false
        }
    }

其他

鼠标移出时,隐藏编辑按钮

function removeHoverDom(treeId, treeNode) {
    
        $("#addBtn_" + treeNode.tId).unbind().remove();
    };

禁止节点之前的拖拽

function beforeDrag(){
    
        return false;  //禁止所有拖拽功能
    }

点击节点的事件

//当点击节点
    function zTreeOnClick(event, treeId, treeNode) {
    
        //alert(treeNode.tId + ", " + treeNode.name);
        //这里根据节点ID获取对应信息或进行对应的操作  
    }
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gali_geigei/article/details/85244666

智能推荐

第一次上传Git项目_第一次上传项目_LMRzero的博客-程序员秘密

转载http://www.cnblogs.com/specter45/p/github.html-1 登录githubgithub的官方网址:https://github.com ,如果没有账号,赶紧注册一个。点击Sign in进入登录界面,输入账号和密码登入github。1-2 创建repository(仓库)为啥要叫repository(仓库)?我起初也纳闷,...

PHP中限制IP段访问、禁止IP提交表单_php限制ip段访问_Sunbrust 的博客-程序员秘密

首先,我们来看看如何获取客户端的IP地址(假设不使用代理):详细可以看看这二篇文章:客户端真实ip的函数,PHP获得真实客户端的真实IP REMOTE_ADDR,HTTP_CLIENT_IP,HTTP_X_FORWARDED_FOR代码:另外贴一些$_SERVER超级数组的信息:

【VMware vSAN 7.0】4.5 vSAN与 vCenter Server 的兼容性—我们有软硬件解决方案_vsan硬件兼容性问题怎么解决_IT干货的博客-程序员秘密

同步vCenter Server和ESXi的版本,以避免由于vCenter Server和ESXi中的vSAN支持不同而产生故障。为了使vCenter Server和ESXi上的vSAN组件实现最佳集成,请部署这两个 vSphere 组件的最新版本。请参见vCenter Server 安装和设置和vSphere 升级文档。...

【Android】TextView字体大小自适应的方式_android 字体大小自适应_ChrisEighteen18的博客-程序员秘密

众所周知,同样的一个话在中英文环境中的字符长度是不一样的。如果TextView没有做相应的适配,那么在切换环境之后读取xml中文本会导致UI变样。尤其是英文文本容易展示不全的问题。

随便推点

canvas绘制刮刮卡,超过一定面积显示全图_hangGe0111的博客-程序员秘密

说明:栗子转自简书,在他的基础上添加了重置和超过一定面积显示全图,仅做学习使用。(推荐7.2的代码)1.前端时间做的一个项目需要支持多终端,网页版需要使用html5中canvas画布对象对一组数据进行渲染还原,但是在实际实现过程中遇到了一个问题,canvas中没有mask(遮罩)层的概念,所以一些效果实现不了,最后翻看文档的时候发现可以通过Context对象的globalCompositeOp...

机器学习视频笔记_Carey_Lu的博客-程序员秘密

1、机器学习是什么第一阶段:试图使用逻辑和规则直接来演绎人类的智商和智能第二阶段: 让机器真正学会人类学习方式范式就是机器学习,通过大量的数据归纳出统计规律。 2、什么是模型类似于y=ax+b的数学公式就是对一个模型的定义,线性回归模型就是假设建立一个模型,符合P=w1X1+w2X2+w3X3+b等式的线性模型,w1,w2,w3作为此模型的参数。 3、监督学习与损失函数...

python提取包含特定字符串的行,如何选择在python中其列值之一包含特定字符串的行?..._精准小天使的博客-程序员秘密

how to select rows which one of its columns values contains specific string in python?I have used the one mentioned here and got errors while I used sample data frame and it looks fine, I am suspiciou...

mysql表排序怎么设置_MySQL数据库如何进行排序(Sort)操作?_瓜掉了你捡不捡的博客-程序员秘密

参考原始文档后, 自已总结一下, 有不对的地方请指正. 在MySQL中进行排序有两种算法, 以4.1版本为分水岭, 在此之前排序时的数据只包括ORDER BY中的列和一个记录的指针(Sort A), 在4.1之后多了一种改进的方法, 排序的数据中可以包括SELECT中的列和ORDER BY中的列(Sort B)Sort A中最主要的坏处是需要进行二次扫表, 第一次是将ORDER BY的列及记录指针...

速查手册--npm install 报错及gyp_error-程序员秘密

妹有用镜像——清空缓存 设置镜像 或者更换镜像源npm node版本不和谐——以往的版本 | Node.jsnpm node vscode版本过旧——更新没使用管理员权限打开命令行——打开网速——自己想办法本地仓库——重新clone...

C# 验证URL有效性_c#url验证_jxitc的博客-程序员秘密

TEST 这篇日志,是直接从OneNote 2010里面发送到CSDN上去的!!发送接口如下:http://blog.csdn.net/jxitc/services/metablogapi.aspx     检测远程URL是否存在的三种方法 收藏 private void Page_Load(object sender, System.EventArgs e){ string url1 = "http://dotnet.aspx.cc/";