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

智能推荐

GB2312简体中文编码表(转)_gb3212编码翻译_anyuliuxing的博客-程序员秘密

GB2312简体中文编码表GB2312编码是第一个汉字编码国家标准,由中国国家标准总局1980年发布,1981年5月1日开始使用。GB2312编码共收录汉字6763个,其中一级汉字3755个,二级汉字3008个。同时,GB2312编码收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄语西里尔字母在内的682个全角字符。分区表示GB2312编码范围:A1A1-FEFE,其中汉字编码...

51单片机实现流水灯左移后右移动_单片机小灯左移到头接着右移_回不到的未来的博客-程序员秘密

代码如下#include&amp;lt;reg52.h&amp;gt;void main() { int i = 0; unsigned count = 0; unsigned char flag = 0; P0 = 0x01; while(1) { if(flag%2 == 0) { P0 = ~(0x01 &amp;lt;&amp;lt; count); } else { P0 =...

推荐几个最好用的CRM软件,本人亲测_weixin_30628077的博客-程序员秘密

CRM是英文Customer Relationship Management 的简写,一般译作“客户关系管理”。CRM最早产生于美国,由Gartner Group 首先提出的CRM这个概念的。20世纪90年代以后伴随着互联网和电子商务的大潮得到了迅速发展。不同的学者或商业机构对CRM的概念都有不同的看法。这个概念的原创者认为,CRM是一种商业策略,它按照客户的分类情况有效地组织企业资源,培养以...

[容斥][数论]JZOJ 5796 划分_weixin_34127717的博客-程序员秘密

Description有一个未知的序列x,长度为n。它的K-划分序列y指的是每连续K个数的和得到划分序列,y[1]=x[1]+x[2]+....+x[K],y[2]=x[K+1]+x[K+2]+....+x[K+K]....。若n不被K整除,则y[n/K+1]可以由少于K个数加起来。比如n=13,K=5,则y[1]=x[1]+...+x[5],y[2]=x[6]+....+x[10],y[...

黑马程序员_泛型_xybiao85的博客-程序员秘密

------- android培训、java培训、期待与您交流! ----------泛型一、  定义:泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。二、  泛型的使用规则:1)        泛型的基本参数只能是类类

java面试题(5)String、StringBuffer、StringBuilder_weixin_44356698的博客-程序员秘密

1、String  String是final修饰的,不可修改,每次操作产生新的对象。我对这句话是表示质疑的,请看以下代码:带上final之后String类型的引用才是不可改变的!看了很多文章后,总结出来这句话少了俩字:String对象是被final修饰的,不可修改,每次操作都会产生新的对象(被final修饰的是String对象,不是String引用)。2、StringBuffer、StringBuilder  都是在原对象基础上进行修改的,StringBuffer是线程安全的(synchroniz

随便推点

著名动物园出版社 O'Reilly 提供数十本免费的电子书【含下载地址】_Phodal的博客-程序员秘密

听说有这惊天大福利,赶紧来写个推送~~,上我大书架照片。著名计算机科学类图书发行商 O'Reilly 向用户提供了数十本免费的电子书, 这些电子书根据其类别分为编程类,...

mysql主从复制实践_轻尘×的博客-程序员秘密

mysql复制原理,推荐一本书《高清中文第三版-高性能mysql》第十章 现状:两个云主机,都是阿里云一 前期准备 将主服务的现有数据导入到从服务中,并确保在配置时两个库都没有任何操作 简单粗暴就是上锁FLUSH TABLES WITH READ LOCK;确保能相互ping通,且3306端口已经开放主上新建一个用户,指定只能让从连接grant replicati...

单片机c语言计时器中断,51单片机中断系统详解(定时器、计数器)_知乎政务的博客-程序员秘密

51单片机中断级别中断源默认中断级别序号(C语言用)INT0---外部中断0最高0T0---定时器/计数器0中断第21INT1---外部中断1第32T1----定时器/计数器1中断第43TX/RX---串行口中断第54T2---定时器/计数器2中断最低5中断允许寄存器IE位序号DB7DB6DB5DB4DB3DB2DB1DB0符号位EA-------ET2ESET1EX1ET0EX0EA---全局中...

python 之 二进制文件处理,只会处理文本?这里教你处理图片,音频!_码农一号已就位的博客-程序员秘密

对于处理文件还不太熟或者不知二进制文件与普通文件有啥区别可以参考:https://blog.csdn.net/xdc1812547560/article/details/107860396https://blog.csdn.net/xdc1812547560/article/details/107866953读取要读取二进制文件,比如图片、视频等等,用’rb’模式打开文件,用w和wb写入我们放一张美图来用代码来演示下:file = '94_349.jpg'with open(file,'rb'

cocos2d-x Scale9Sprite的使用方法 lua篇20200421_cocos2dx scale9sprite_andy1515的博客-程序员秘密

这里简单记录一下Scale9sprite的使用方法,其实使用这个方法主要是用来拉伸图片,好处就是该方法拉伸的程度不会像setScale方法这样严重扭曲变形。而是将一个纹理分为九个部分,也就是九宫格,上图:将图片为9个部分,拉伸的情况下1,3,7,9 不会拉伸,2,8部分水平方向拉伸,4,6部分竖直方向拉伸,5两个方向都会拉伸,这样纹理就不会扭曲变形。下面,贴出代码看一下九宫格怎么使用...

ORACLE 11 ORA-00119 ORA-00132启动异常抛错处理_m2004hsf的博客-程序员秘密

今天意外重启服务器,导致oracle异常出现。SQL&gt; startup ORA-00119: invalid specification for system parameter LOCAL_LISTENER ORA-00132: syntax error or unresolved network name 'LISTENER_ORCL' 在另一个终端进入 [[email protected]