最近公司要求做一个关于后台的管理系统。在这个mvvm模式横行的年代,虽然这里用jquery做项目可能有点不符合时代的潮流,但是管他呢,能做出来先在说呗(公司以后要改用angular或者vue来统一前端的制作方式),个人觉得jquery还挺好用的。废话这里就不多叙述了。下面就先来一张完成后的图片展示一下ztree可以完成的功能。

 

  额····这边弹出层的阴影是录制软件的问题(这边的前端插件用的是layui,想用的小伙伴可以自行百度layui,顺便一提,我这里用的版本是layui 1.0的,现在layui已经更新到2.0版本了,已经有自适应功能了,挺好用的。你问我为什么不用bootstrap?其实这个项目中UI小伙伴给我的时候插件用的是bootstrap,但是本人就先入为主了,还是觉得layui轻便好用,看个人喜好吧)。

  忘记了初衷这里是来介绍ztree的,好了,下面先来介绍下ztree的基本信息。

  使用ztree的时候可以参考官网的教程来一步步跟着做。zTree官网。详细的api可以参照着官网来看。

  先看ztree的初始化过程:

  

 zTreeObj = $.fn.zTree.init($obj, setting, nodes);

  这是就是初始加载ztree树。第一个参数$obj代表的是你需要加载ztree的容器。一般默认是一个div。第二个参数是我们的配置项。下面会详细介绍,第三个nodes就是我们需要显示的数据,实际项目中一般都是后台返回的json.

  上面展示的功能用到了树的左键点击,邮件点击,拖拽3个大的功能点。这里是我项目中写的setting的内容

 1     var setting = {
callback : {
onClick : zTreeOnClick,
onRightClick : zTreeOnRightClick,
beforeDrag : zTreeBeforeDrag,
beforeDrop : zTreeBeforeDrop,
onDrop : zTreeOnDrop,// 如果对象目标不是节点,不会触发beforeDrop,直接触发onDrop
},
data : {
simpleData : {
enable : true,
idKey : "id",
pIdKey : "pId",
},
key : {
name : "sname"
},
keep : {
parent : true,//没有子节点也保持父节点状态
leaf : false
}
},
edit : {
enable : true,
showRemoveBtn : false,
showRenameBtn : false,
drag : {
isCopy : false,//拖拽节点不是复制
isMove : true,//拖拽节点只是移动
prev : true,//可以放到节点前面
next : true,//可以放到其他节点后面
inner : canInner//能否放到节点里面看回调函数返回的值
}
},
view : {
selectedMulti : false
}
};

  这里常用到的左键点击事件什么的这里就不提了,可以参照官网的例子。这里就记录下onRightClick事件和onDrop事件。

  首先是onRightClick事件,弹出右键菜单栏,然后点击不同的节点邮件的菜单栏还是不同的。点击菜单栏上的不同的选项触发不同的事件。首先我们要让右键树节点在相应的地方产生菜单。不过不用急,这里ztree给我们返回的参数中包含了标准的event,右键点击的节点node,还有点击tree的Id(如果一个页面中有多棵树,这个参数就显得十分重要,如果就一个树,那么这个参数就没什么多大的作用)。我们可以通过event来确定鼠标在页面中具体的位置,然后根据node来判断右键菜单的详细内容和相关的绑定事件。下面是项目中的代码:

     // 右键菜单功能
function zTreeOnRightClick(event, treeId, treeNode) {
$('#rightMenu').remove();// 移出之前的右键菜单,如果有;
if (treeNode) {
zTreeObj.selectNode(treeNode);
var isEqu = treeNode.isEqu ? true : false, isEquHtml = "";
if (!isEqu) {
isEquHtml = "<li id='addDep'>添加部门</li>"
+ "<li id='addEqu'>添加设备</li>";
}
var editName = isEqu ? "修改设备" : "修改部门";
var deleteName = isEqu ? "删除设备" : "删除部门";
var html = "<ul id='rightMenu'>" + isEquHtml + "<li id='edit'>"
+ editName + "</li>" + "<li id='delete'>" + deleteName
+ "</li>" + +"</ul>";
var menu = $(html).css({
left : event.pageX + 5 + 'px',
top : event.pageY + 5 + 'px'
});
$('body').append(menu);
menuClick();// 给添加的元素绑定事件
}
}

  我这边的实际情况是看树上的节点中是否有isEqu属性。如果含有这个属性则证明是设备节点,那么就只有修改设备和删除设备2个功能。如果没有,那么就证明这个是部门或者公司节点,那么就有添加设备,添加部门,删除设备和删除部门的功能。然后通过jquery的css函数来确定菜单弹出的具体位置。其他的css可以提前在页面中写好,比如说hover事件和菜单的样式。在代码中只要控制菜单的left和top属性就行了。这里值得一提的是,我们给菜单绑定的事件menuClick函数每次都需要在菜单添加的时候运行而不是在$(function(){})中,因为这里的菜单本身是不存在body中的,是右键点击的时候动态生成的,然后点击以后又移除了,所以每次生成的时候都需要给这个菜单绑定相关的点击事件。详细的点击事件这里就不多展开叙述了。

  接下来是拖拽事件。值得一提的是这个beforeDrag和beforeDrop这两个几户一模一样的回调函数,当时没注意被搞懵逼了。beforeDrag是拖拽前调用的,beforeDrop是拖拽结束前调用的回调。其原理就是鼠标的mousedown和mouseup还有一个dragflag(拖拽的标志)。我这里总公司这个节点是不能移动的,所以在beforeDrap回调里面判断一下节点的id,如果是0就代表是总公司,在beforeDrag中返回false就不会再调用onDrag函数了,节点就不能被拖拽。下面是项目中的代码供参考

    function zTreeBeforeDrag(treeId, treeNodes) {
if (treeNodes[0].id == 0) {
layer.msg('总公司目录无法移动!', {
time : 1000
});
return false;
} else {
return true;
}
}

  这里onDrop回调调用后会自动把移动的节点move到你想要移动的地方。但是我这里需要加一个是否移动的提示框,所以如果还是用onDrop的话,会直接移动。因为我这里的弹窗是异步的,js还是会自己执行下去调用onDrop而不管beforeDrop中返回的,除非调用的是系统的comfirm函数,这个会阻塞js进程,但是样式不好调我就放弃了,我这里是直接在onDrop中return掉,不让他移动节点,而是在beforeDrop中自己判断节点是否可以移动,然后调用ztree的moveNode方法自己移动节点。下面是相关代码

     // 拖拽子节点判断
function canInner(treeId, treeNodes, targetNode) {
return (targetNode && !targetNode.isEqu);
}
// 拖拽前的判断
function zTreeBeforeDrop(treeId, treeNodes, targetNode, moveType) {
var msg = '是否将 [' + treeNodes[0].sname + '] 移动到 [' + targetNode.sname;
switch (moveType) {
case 'inner':
msg += ' ]之内?';
break;
case 'prev':
msg += ' ]之前?';
break;
case 'next':
msg += ' ]之后?';
default:
break;
}
layer.confirm(msg, function(index) {
zTreeObj.moveNode(targetNode, treeNodes[0], moveType);
layer.close(index);
});
return false;
}
// 拖拽结束
function zTreeOnDrop(event, treeId, treeNodes, targetNode, moveType) {
if (!targetNode) {
layer.msg('目标对象无效!', {
time : 1000
});
return;
}
}

  上面代码仅仅用onDrop函数来提示用户移动到的节点是无效的这个功能而已,其他功能都是在beforeDrop中实现的。到这里忘记介绍了nodes这个属性。我们一般会在setting.data中启用simpleData,这样的话我们可以直接设置id和pid2个参数来确定上下级的关系,而不需要嵌套用children这个属性来确定上下级的关系,这样的话后台返回的数据就直接从数据库中取出返回一个List的类型就行而不需要转化成复杂的嵌套模式,这个还是挺好用的。下面是我用到的展示的nodes:

     var zNodes = [ {
sname : '总公司',
id : 0,
pId : -1,
open : true,
isParent : true
}, {
sname : '技术中心',
id : 1,
pId : 0,
open : true,
isParent : true
}, {
sname : '生产中心',
id : 2,
pId : 0,
open : true,
isParent : true
}, {
sname : '物流中心',
id : 3,
pId : 0,
open : true,
isParent : true
}, {
sname : '设备1',
id : 4,
pId : 1,
isEqu : true, }, {
sname : '设备2',
id : 5,
pId : 1,
isEqu : true, }, {
sname : '设备3',
id : 6,
pId : 2,
isEqu : true,
}, {
sname : '设备4',
id : 7,
pId : 3,
isEqu : true,
}, ];

  今天这里的记录就差不多到这里了,具体的api还是可以参考官网的。而且官网的教程也很详细,这里就不多介绍了,哈哈(真的不是我懒哦)~

项目中jquery插件ztree使用记录的更多相关文章

  1. Jquery插件Ztree使用所遇问题

    问题1.$.fn.zTree为空或为Undefined 我在MVC中引用Jquery插件Ztree的JS并不存任何问题,而当我将Ztree的js引入项目中,就出现$.fn.zTree为空或为Undef ...

  2. Eclipse 导入项目与 svn 插件关联全过程记录

    文章摘自:http://www.cnblogs.com/xmmcn/archive/2013/03/01/2938365.html 感谢博友分享! Eclipse 导入项目与 svn 插件关联全过程记 ...

  3. 项目中简单使用ztree,简单数据。

    由于公司架构较旧,使用的jdk版本为1.4,页面上也没有el表达式. 加入 js 文件 <% String context = request.getContextPath(); %> & ...

  4. 在vue项目中的axios使用配置记录

    默认vue项目中已经安装axios,基于element-ui开发,主要记录配置的相关. axiosConfig.js import Vue from 'vue' import axios from ' ...

  5. jQuery插件--zTree中点击节点实现页面跳转时弹出两个页面的问题

    这是第一次使用zTree,所以在使用之前我要先写一个demo来学习一下.我们要注意的是,zTree是一个jQuery插件,所以我们在导入zTree的js文件之前要先导入jQuery的js文件. 我们先 ...

  6. 单页面应用 之 项目中集成插件vue-router

    \es6\my-complex-project>npm install  vue-router -S    (S 表示这个包下载到,当前的项目中) 导入写好的  router 这里尽量使用  @ ...

  7. Vue项目中jQuery的引入

    1.安装jQuery依赖 npm install jquery --save-dev 2.在webpack.base.conf.js头部加入如下代码 var webpack = require(&qu ...

  8. 无限树Jquery插件zTree的使用方法

    其实Ztree官网已经有详细的API文档,一切以官网上的说明为准,我在此只是结合实践总结几条常用的ztree的功能特性. (ztree的语法结构是基于key-value的形式配置) 1:支持异步加载数 ...

  9. vue项目中使用插件将字符串装化为格式化的json数据(可伸缩)

    插件地址:https://www.npmjs.com/package/vue-json-viewer 第一步:安装vue-json-viewer插件 $ npm install vue-json-vi ...

随机推荐

  1. python---Celery分布式任务队列了解

    linux下定时器了解 Celery 框架学习笔记(不错哟) Celery 分布式任务队列快速入门 Celery的最佳实践 一.Celery介绍 Celery 是一个 基于python开发的分布式异步 ...

  2. webpack4.0.1安装问题及解决方法

    2月底的时候,webpack4正式发布了,但是当我们安装之后,使用下面的语句来打包的时候,发现打包失败了 webpack ./src/main.js ./dist/bundle.js 并且给出了下面这 ...

  3. NOIP模拟赛9

    T1U3348 A2-回文数 https://www.luogu.org/problem/show?pid=U3348 考场上钻了牛角尖了,然后0分 #include<cstdio> #i ...

  4. Tomcat处理一个http请求的过程

    假设来自客户的请求为: http://localhost:8080/wsota/wsota_index.jsp 1) 请求被发送到本机端口8080,被在那里侦听的Coyote HTTP/1.1 Con ...

  5. Intellij IDEA 快捷键整理(转)

    Ctrl+Shift + Enter,语句完成 “!”,否定完成,输入表达式时按 “!”键 Ctrl+E,最近的文件 Ctrl+Shift+E,最近更改的文件 Shift+Click,可以关闭文件 C ...

  6. 开发技巧:高效的使用 Response.Redirect

    我正在评估一个 ASP.NET Web 项目应用.它有一些可扩展性问题.意味着当网站访问量增加的时候.系统将会变得缓慢.当我查看应用日志.我找到了大量的 ThreadAbortException. 这 ...

  7. Spring boot初始

    1 创建pom.xml parent:org.springframework.boot  包含启动的依赖 添加依赖,如 spring-boot-starter-web mvn dependency:t ...

  8. 微信小程序开发(三)项目目录及文件结构

    第二章我们已经创建了一个Hello WXapplet示例小程序.我们从文件目录结构来了解Hello WXapplet项目的构成. 目录结构显示,在小程序项目的根目录下面包含3个app开头的文件(app ...

  9. 2017ACM暑期多校联合训练 - Team 8 1006 HDU 6138 Fleet of the Eternal Throne (字符串处理 AC自动机)

    题目链接 Problem Description The Eternal Fleet was built many centuries ago before the time of Valkorion ...

  10. 24、简述Python的深浅拷贝以及应用场景

    深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝 ...