最近公司要求做一个关于后台的管理系统。在这个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. CF835 D DP

    所有所有阶回文串的个数.对于一个k阶回文串,定义为:它的左右两侧相同且是k-1阶回文串 显然高阶回文串由低阶构成,那么枚举长度,从左到右遍历,dp[l][r]代表从l到r串最大的阶数,cnt[i]记录 ...

  2. LightOJ 1065 - Number Sequence 矩阵快速幂水题

    http://www.lightoj.com/volume_showproblem.php?problem=1065 题意:给出递推式f(0) = a, f(1) = b, f(n) = f(n - ...

  3. Python学习笔记(四十)— 内置模块(9)HTMLParser

    摘抄自:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001432002312 ...

  4. HTML DOM 节点介绍(nodeName,nodeValue,nodeType)

    对于初学者来说,HTML DOM 里面的 nodeName.nodeValue 以及 nodeType 三个属性的作用和取值不是很清楚.下面整理的信息包含有关于节点的详细信息,供参考. 节点信息 每个 ...

  5. windows下启动mysql服务的命令行启动和手动启动方法

    1.图形界面下启动mysql服务. 在图形界面下启动mysql服务的步骤如下: (1)打开控制面板->管理工具->服务,如下图所示: 可以看到Mysql服务目前的状态是未启动(未写已启动的 ...

  6. 使sqoop能够启用压缩的一些配置

    在使用sqoop 将数据库表中数据导入至hdfs时 配置启用压缩 hadoop 的命令    检查本地库支持哪些  bin/hadoop checknative 需要配置native    要编译版本 ...

  7. Linux下多路径multipath配置【转】

    一.multipath在redhat 6.2中的基本配置: 1. 通过命令:lsmod |grep dm_multipath  检查是否正常安装成功.如果没有输出说明没有安装那么通过yum功能安装一下 ...

  8. 141.Linked List Cycle---双指针

    题目链接 题目大意:给出一个链表,判断该链表是否有环,空间复杂度最好控制在o(1) 这个题没有给测试用例,导致没太明白题目意思,看了题解,用了两种方法示例如下: 法一(借鉴):利用两个指针,一个指针步 ...

  9. java在图片上写字

  10. redis源码分析——aofrewrite

    随着redis的运行,aof会不断膨胀(对于一个key会有多条aof日志),导致通过aof恢复数据时,耗费大量不必要的时间.redis提供的解决方案是aof rewrite.根据db的内容,对于每个k ...