From b92219e35b8d30ecce705ea1e5a8ca0883b1e49a Mon Sep 17 00:00:00 2001
From: cwchen <1048842385@qq.com>
Date: Mon, 11 Nov 2024 17:45:51 +0800
Subject: [PATCH] =?UTF-8?q?=E9=85=8D=E4=BB=B6=E7=AE=A1=E7=90=86?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
lib/layui-v2.9.18/layui/dtree/dtree.css | 113 +
lib/layui-v2.9.18/layui/dtree/dtree.js | 5528 +++++++++++++++++
.../layui/dtree/font/dtreefont.css | 229 +
.../layui/dtree/font/dtreefont.eot | Bin 0 -> 19508 bytes
.../layui/dtree/font/dtreefont.svg | 80 +
.../layui/dtree/font/dtreefont.ttf | Bin 0 -> 19344 bytes
.../layui/dtree/font/dtreefont.woff | Bin 0 -> 19420 bytes
lib/layui-v2.9.18/layui/dtree/font/icons.json | 283 +
page/basic/fit_type_list.html | 4 +-
9 files changed, 6236 insertions(+), 1 deletion(-)
create mode 100644 lib/layui-v2.9.18/layui/dtree/dtree.css
create mode 100644 lib/layui-v2.9.18/layui/dtree/dtree.js
create mode 100644 lib/layui-v2.9.18/layui/dtree/font/dtreefont.css
create mode 100644 lib/layui-v2.9.18/layui/dtree/font/dtreefont.eot
create mode 100644 lib/layui-v2.9.18/layui/dtree/font/dtreefont.svg
create mode 100644 lib/layui-v2.9.18/layui/dtree/font/dtreefont.ttf
create mode 100644 lib/layui-v2.9.18/layui/dtree/font/dtreefont.woff
create mode 100644 lib/layui-v2.9.18/layui/dtree/font/icons.json
diff --git a/lib/layui-v2.9.18/layui/dtree/dtree.css b/lib/layui-v2.9.18/layui/dtree/dtree.css
new file mode 100644
index 0000000..6caec28
--- /dev/null
+++ b/lib/layui-v2.9.18/layui/dtree/dtree.css
@@ -0,0 +1,113 @@
+
+/**************** 主题换肤 ****************/
+/* 默认风格*/
+.dtree-theme-item-this{background-color: #d2d2d2!important;}
+.dtree-theme-item:hover{background-color: #eaeceb!important;}
+.dtree-theme-item cite{font-size:12px!important;}
+.dtree-theme-item:hover cite{color:#fe7786!important;}
+
+.dtree-theme-dtreefont{font-size: 16px!important;}
+.dtree-theme-ficon{color:#000!important;}
+.dtree-theme-icon{color:orange!important;}
+.dtree-theme-checkbox:hover{color:#fe7786!important;}
+.dtree-theme-choose{color:#fe7786!important;}
+
+/* layui主题风格*/
+.dtree-layui-item-this{background: none!important;}
+.dtree-layui-item:hover{background: none!important;}
+.dtree-layui-item cite{font-size:14px!important;}
+.dtree-layui-item:hover cite{opacity:0.5;filter:Alpha(opacity=50);text-decoration: underline;}
+
+.dtree-layui-dtreefont{font-size: 18px!important;}
+.dtree-layui-ficon{font-size: 18px!important;color:#393D49!important;}
+.dtree-layui-icon{color:#666!important;}
+.dtree-layui-checkbox:hover{color:#5FB878!important;}
+.dtree-layui-choose{color:#5FB878!important;}
+
+/* laySimple主题风格*/
+.dtree-laySimple-item-this{background-color: #d2d2d2!important;}
+.dtree-laySimple-item:hover{background-color: #eaeceb!important;}
+.dtree-laySimple-item cite{font-size:12px!important;}
+.dtree-laySimple-item:hover cite{color:#01AAED!important;}
+
+.dtree-laySimple-dtreefont{font-size: 16px!important;}
+.dtree-laySimple-ficon{font-size: 14px!important;color:#393D49!important;}
+.dtree-laySimple-icon{color:#393D49!important;}
+.dtree-laySimple-checkbox:hover{color:#01AAED!important;}
+.dtree-laySimple-choose{color:#01AAED!important;}
+/**************** 树基础 ****************/
+/* 菜单栏*/
+.dtree-menubar {padding-left: 10px;}
+.dtree-menubar .layui-btn-group .layui-btn-sm{height: 20px;line-height: 20px;padding: 0 5px;font-size: 12px;}
+.dtree-menubar .layui-btn-group .layui-btn-sm i{font-size: 12px!important;}
+
+/* 工具栏*/
+.dtree-toolbar{position: absolute;z-index: 940520;padding: 0;background-color: #eceaeb;}
+.dtree-toolbar .layui-nav-child{position: static;}
+.dtree-toolbar .layui-nav-child dd{cursor: pointer;}
+.dtree-toolbar .layui-nav-child dd a i{font-size:16px;display: inline-block;margin: 0px 1px;color:#fe7786;}
+.dtree-toolbar .layui-nav-child dd a i:hover{font-weight: bold;}
+.dtree-toolbar .layui-nav-bar{display: none!important;}
+.dtree-toolbar-tool{padding: 30px;}
+
+.dtree-toolbar-fixed{position: absolute;right: 5px;top: 2px;font-style: normal;transition: all .3s;-webkit-transition: all .3s;}
+/*.dtree-toolbar-fixed a{border:1px solid #fe7786;}*/
+.dtree-toolbar-fixed a i{font-size:14px;display: inline-block;margin: 0px 1px;color:#fe7786;}
+.dtree-toolbar-fixed a i:hover{opacity:0.8;filter:Alpha(opacity=80);}
+
+/* 树基本*/
+.dtree{width:260px;}
+.dtree-nav-item{line-height:33px;padding-left:16px;}
+.dtree-nav-ul-sid{display: none;}
+.dtree-none-text{font-size: 12px;text-align: center;color: gray;}
+
+/* 树线*/
+.dtree-nav-first-line,.dtree-nav-line,.dtree-nav-last-line{position: relative;}
+.dtree-nav-first-line:before{content:"";position: absolute;height: 0;border-left: 1px dotted #c0c4cc;}
+.dtree-nav-first-line:after{content:"";position: absolute;height: 0;border-top: 1px dotted #c0c4cc;}
+
+.dtree-nav-line:before{content:"";position: absolute;top: 0;left: 7px;width: 0;height: 100%;border-left: 1px dotted #c0c4cc;}
+.dtree-nav-line:after{content:"";position: absolute;top: 16px;left: 8px;width: 9px;height: 0;border-top: 1px dotted #c0c4cc;}
+
+.dtree-nav-last-line:before{content:"";position: absolute;top: 0;left: 7px;width: 0;height: 17px;border-left: 1px dotted #c0c4cc;}
+.dtree-nav-last-line:after{content:"";position: absolute;top: 16px;left: 8px;width: 9px;height: 0;border-top: 1px dotted #c0c4cc;}
+
+
+/* 图标及复选框*/
+.dtreefont{cursor: pointer;}
+.dtreefont-special{margin: 0 4px;}
+.dtree-nav-checkbox-div{display: inline-block;}
+.dtree-nav-checkbox-div>i{display: inline-block;margin: 0px 1px;}
+.dtree-nav-checkbox-div>i:last-child{margin-right: 4px;}
+.dtree-nav-checkbox-div>i:hover{opacity:0.8;filter:Alpha(opacity=80);}
+
+/* 行 文字*/
+.dtree-nav-div{display:block;vertical-align:top;position:relative;}
+.dtree-nav-div cite{font-style: normal;cursor: pointer;}
+.dtree-nav-div:hover cite{opacity:0.7;filter:Alpha(opacity=70);transition: all .3s;-webkit-transition: all .3s;}
+
+/* 规则属性*/
+.dtree-nav-show {display: block!important;}
+.dtree-nav-hide {display: none!important;}
+.dtree-nav-this {}
+.dtree-icon-hide {opacity:0;filter:Alpha(opacity=0);}
+.dtree-icon-null-open,.dtree-icon-null-close,.dtree-icon-null{margin: 0 2px;}
+.dtree-disabled{cursor: not-allowed; color:#c2c2c2!important;}
+.dtree-disabled:hover{color:#c2c2c2!important;}
+.dtree-nav-div cite.dtree-disabled{font-style: normal; cursor: not-allowed; color:#c2c2c2!important;}
+.dtree-nav-div>cite.dtree-disabled:hover{color:#c2c2c2!important;}
+
+
+/** 下拉树属性*/
+.dtree-select{position: absolute;max-height: 500px;height: 350px;overflow: auto;width: 99%;z-index: 123;display: none;border:1px solid silver;top: 42px;}
+.dtree-select-show{display: block!important;}
+.dtree-select-up{top: auto; bottom: 42px;}
+
+/* 简单适配*/
+@media screen and (max-width:1700px) and (min-width:1300px){
+ .dtree-nav-item {padding-left: 15px;}
+}
+
+
+
+
diff --git a/lib/layui-v2.9.18/layui/dtree/dtree.js b/lib/layui-v2.9.18/layui/dtree/dtree.js
new file mode 100644
index 0000000..c15c9fc
--- /dev/null
+++ b/lib/layui-v2.9.18/layui/dtree/dtree.js
@@ -0,0 +1,5528 @@
+/**
+ *@Name dtree 树形组件
+ *@Author 智慧的小西瓜
+ *@DOCS http://www.wisdomelon.com/DTreeHelper/
+ *@License https://www.layui.com/
+ *@LASTTIME 2020/01/19
+ *@VERSION v2.5.7
+ */
+layui.define(['jquery','layer','form'], function(exports) {
+ var $ = layui.$,
+ layer = layui.layer,
+ form = layui.form;
+
+ // 树的公共定义样式汇总
+ var LI_NAV_CHILD = "dtree-nav-ul-sid", LI_NAV_ITEM = "dtree-nav-item",
+ LI_DIV_ITEM = "dtree-nav-div", DTREEFONTSPECIAL="dtreefont-special", NONETITLE="dtree-none-text",
+ LI_DIV_MENUBAR = "dtree-menubar",
+ LI_DIV_TOOLBAR = "dtree-toolbar", TOOLBAR_TOOL = "dtree-toolbar-tool", TOOLBAR_TOOL_EM = "dtree-toolbar-fixed",
+ LI_DIV_CHECKBAR = "dtree-nav-checkbox-div",
+ LI_CLICK_CHECKBAR = "d-click-checkbar", //绑定点击复选框时需要用到
+ LI_DIV_TEXT_CLASS = "t-click", UL_ROOT="dtree",
+ LI_NAV_FIRST_LINE = "dtree-nav-first-line", LI_NAV_LINE = "dtree-nav-line", LI_NAV_LAST_LINE = "dtree-nav-last-line";
+
+
+ // 树的公共指定
+ var NAV_THIS = "dtree-nav-this", //当前节点
+ NAV_SHOW = "dtree-nav-show", //显示子节点
+ NAV_HIDE = "dtree-nav-hide", //隐藏节点
+ NAV_DIS = "dtree-disabled", //禁用节点
+ ICON_HIDE = "dtree-icon-hide", //隐藏图标
+ $BODY = $("body"), //body选择器
+ $WIN = $(window), //window窗口
+ $DOC = $(document), //当前文档
+ MOD_NAME = "dtree", //模块名称
+ VERSION = "v2.5.7", //版本
+ OPTIONS = {}, //全局属性配置
+ DTrees = {}; //当前被实例化的树的集合
+
+ // 树的自定义图标
+ var DTREEFONT = "dtreefont", //默认使用图标字体
+ LI_DIV_CHECKBAR_ON = "dtree-icon-fuxuankuangxuanzhong", //复选框选中图标
+ LI_DIV_CHECKBAR_OUT = "dtree-icon-fuxuankuang", //复选框未选中图标
+ LI_DIV_CHECKBAR_NOALL = "dtree-icon-fuxuankuang-banxuan", //复选框半选图标
+ LI_DIV_MENUBAR_DOWN = "dtree-icon-move-down", //menubar的展开全部的图标
+ LI_DIV_MENUBAR_UP = "dtree-icon-move-up", //menubar的收缩全部的图标
+ LI_DIV_MENUBAR_REFRESH = "dtree-icon-refresh", //menubar的刷新图标
+ LI_DIV_MENUBAR_CHECKALL = "dtree-icon-roundcheckfill", //menubar的全选图标
+ LI_DIV_MENUBAR_UNCHECKALL = "dtree-icon-roundclosefill", //menubar的全不选图标
+ LI_DIV_MENUBAR_INVERTALL = "dtree-icon-roundcheck", //menubar的反选图标
+ LI_DIV_MENUBAR_DELETE = "dtree-icon-delete1", //menubar的删除图标
+ LI_DIV_MENUBAR_SEARCH = "dtree-icon-search_list_light", //menubar的搜索图标
+ LI_DIV_TOOLBAR_PULLDOWN = "dtree-icon-pulldown", //toolbar的展开图标
+ LI_DIV_TOOLBAR_PULLUP = "dtree-icon-pullup", //toolbar的收缩图标
+ LI_DIV_TOOLBAR_ADD = "dtree-icon-roundadd", //toolbar的新增图标
+ LI_DIV_TOOLBAR_EDIT = "dtree-icon-bianji", //toolbar的编辑图标
+ LI_DIV_TOOLBAR_DEL = "dtree-icon-roundclose"; //toolbar的删除图标
+
+ // 树的非叶子节点图标集合
+ var nodeIconArray = {
+ "-1": {"open": "dtree-icon-null-open", "close": "dtree-icon-null-close"}, //未指定
+ "0" : {"open": "dtree-icon-wenjianjiazhankai", "close": "dtree-icon-weibiaoti5"}, //文件夹(二级图标默认样式)
+ "1" : {"open": "dtree-icon-jian", "close": "dtree-icon-jia"}, //+-图标(一级图标默认样式)
+ "2" : {"open": "dtree-icon-xiangxia1", "close": "dtree-icon-xiangyou"} //箭头图标
+ };
+
+ // 树的叶子节点图标集合
+ var leafIconArray = {
+ "-1": "dtree-icon-null", //未指定
+ "0" : "dtree-icon-weibiaoti5", //文件夹
+ "1" : "dtree-icon-yonghu", //人员
+ "2" : "dtree-icon-fenzhijigou", //机构
+ "3" : "dtree-icon-fenguangbaobiao", //报表
+ "4" : "dtree-icon-xinxipilu", //信息
+ "5" : "dtree-icon-shuye1", //叶子(二级图标默认样式)
+ "6" : "dtree-icon-caidan_xunzhang", //勋章
+ "7" : "dtree-icon-normal-file", //文件
+ "8" : "dtree-icon-dian", //小圆点(一级图标默认样式)
+ "9" : "dtree-icon-set-sm", //齿轮
+ "10" : "dtree-icon-rate" //星星
+ };
+
+ // 树的自定义样式
+ var DTREE = "dtree-", //自定义样式前缀
+ ITEMTHIS = "-item-this", //自定义样式当前行选中后缀
+ ITEM = "-item", //自定义样式当前行后缀
+ DFONT = "-dtreefont", //自定义样式图标样式后缀
+ FICON = "-ficon", //自定义样式一级图标样式后缀
+ ICON = "-icon", //自定义样式二级图标样式后缀
+ CBOX = "-checkbox", //自定义样式复选框样式后缀
+ CHS = "-choose"; //自定义样式复选框选中样式后缀
+
+ // 树自定义操作事件名称集合 绑定dtree-click的事件
+ var eventName = {
+ checkNodeClick: "checkNodeClick", //点击复选框
+ itemNodeClick: "itemNodeClick" //点击子节点div
+ };
+
+ // 树默认toolbar提供的功能集合 绑定dtree-tool的事件
+ var defaultTool = {
+ pulldown: "pulldown", //点击展开当前节点下的全部节点
+ pullup: "pullup", //点击收缩当前节点下的全部节点
+ addTool: "addToolbar", //点击toolbar新增
+ editTool: "editToolbar", //点击toolbar编辑
+ delTool: "delToolbar" //点击toolbar删除
+ };
+
+ // 树默认menubar提供的功能集合 绑定dtree-menu的事件
+ var defaultMenu = {
+ moveDown: "moveDown", //menubar展开全部节点
+ moveUp: "moveUp", //menubar收缩全部节点
+ refresh: "refresh", //menubar刷新树
+ checkAll: "checkAll", //menubar全选
+ unCheckAll: "unCheckAll", //menubar全不选
+ invertAll: "invertAll", //menubar反选
+ remove: "remove", //menubar删除选中节点
+ searchNode: "searchNode" //menubar查询节点
+ };
+
+ // 树的公共事件
+ var event = {
+ getElemId: function(options){ // 根据传入的参数获取ID
+ var elem = options.elem || "";
+ var obj = options.obj || $(elem);
+
+ if (obj.length == 0) { //页面中未找到绑定id
+ return "";
+ } else {
+ return $(obj)[0].id;
+ }
+ },
+ escape: function(html){ // 编码
+ if(typeof html !== 'string') return '';
+ return html.replace(entityReg.escape, function(match){return entityMap.escape[match];});
+ },
+ unescape: function(str){ // 解码
+ if(typeof str !== 'string') return '';
+ return str.replace(entityReg.unescape, function(match){return entityMap.unescape[match];});
+ },
+ cloneObj: function (obj, filter) { //深复制对象方法
+ var newObj = {};
+ if (obj instanceof Array) {
+ newObj = [];
+ }
+ var str = "";
+ if(typeof filter !== 'undefined') {str = filter.join(",");}
+ for (var key in obj) {
+ if(str.indexOf(key) == -1){
+ var val = obj[key];
+ newObj[key] = typeof val === 'object' ? event.cloneObj(val, typeof filter !== undefined ? filter : []): val;
+ }
+
+ }
+ return newObj;
+ },
+ trimToDot: function(str){
+ return str.replace(/ /g, ".");
+ }
+ };
+
+ // 特殊符号转义
+ var keys = Object.keys || function(obj) {
+ obj = Object(obj);
+ var arr = [];
+ for(var a in obj) arr.push(a);
+ return arr;
+ };
+ var invert = function(obj){
+ obj = Object(obj);
+ var result = {};
+ for(var a in obj) result[obj[a]] = a;
+ return result;
+ };
+ var entityMap = {
+ escape: {
+ "&" : "&",
+ "<" : "<",
+ ">" : ">",
+ "'" : "&quo;"
+ }
+ };
+ entityMap.unescape = invert(entityMap.escape);
+ var entityReg = {
+ escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'),
+ unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g')
+ };
+
+ //异步加载接口
+ var AjaxHelper = {
+ request : function(config) {
+ var data = config.data ? config.data : {};
+ var async = (typeof (config.async) === "boolean") ? config.async : true;
+ $.ajax({
+ type : config.type ? config.type : "POST",
+ headers : config.headers,
+ url : config.url,
+ dataType : config.dataType ? config.dataType : "json",
+ data : data,
+ async : async,
+ contentType : config.contentType,
+ xhrFields: {withCredentials: config.withCredentials},
+ beforeSend: function (XMLHttpRequest, self) {
+ if (typeof (config.beforeSend) === "function") {
+ return config.beforeSend(XMLHttpRequest, self);
+ }
+ return true;
+ },
+ success : config.success,
+ error : function(XMLHttpRequest, textStatus, errorThrown) {
+ if (typeof (config.error) === "function") {
+ config.error(XMLHttpRequest, textStatus, errorThrown);
+ } else {
+ layer.msg("异步加载失败: " + textStatus,{icon:5, shift:6});
+ }
+ },
+ statusCode : {
+ 404 : function() {
+ layer.msg('未找到指定请求,请检查访问路径!',{icon:5, shift:6});
+ },
+ 500 : function() {
+ layer.msg('系统错误!',{icon:5, shift:6});
+ }
+ },
+ complete : function(XMLHttpRequest, textStatus) {
+ if (typeof (config.complete) === "function") {
+ config.complete(XMLHttpRequest, textStatus);
+ }
+ }
+ });
+ },
+ serialize: function(first, param){ //json序列化 key=value&key1=value1
+ var p = first;
+ for (var key in param) {
+ p += key + "=" + param[key] + "&";
+ }
+ p = p.substring(0, p.length-1);
+ return p;
+ }
+ };
+
+ /** 树类 Class定义 */
+ var DTree = function(options){
+ var _this = this;
+ /** 默认赋值**/
+ this.formatter = { // 数据过滤
+ title: false // 文字,默认不开启
+ };
+ this.response = { // 树返回的json格式
+ statusName: "code", //返回标识
+ statusCode: 200, //返回码
+ message: "message", //返回信息
+ rootName: "data", //根节点名称
+ treeId: "id", //节点ID
+ parentId: "parentId", //父节点ID
+ title: "title", //节点名称
+ ficonClass: "ficonClass", //自定义一级图标
+ iconClass: "iconClass", //自定义二级图标
+ childName: "children", //子节点名称
+ last: "last", //是否最后一级节点
+// level: "level", //层级
+ spread: "spread", //展开
+ disabled: "disabled", //禁用
+ hide: "hide", //隐藏
+ checkArr: "checkArr", //复选框列表
+ checked: "checked", //是否选中
+ type: "type", //复选框标记
+ basicData: "basicData" //表示用户自定义需要存储在树节点中的数据
+ };
+ this.defaultRequest = { // 树的默认发起请求参数格式,最后会将value作为参数名称传递
+ nodeId: "nodeId", //节点ID
+ parentId: "parentId", //父节点ID
+ context: "context", //节点内容
+ leaf: "leaf", //是否叶子节点
+ level: "level", //层级
+ spread: "spread", //节点展开状态
+ dataType: "dataType", //节点标记
+ checked: "checked", //节点复选框选中状态
+ initchecked: "initchecked", //节点复选框初始状态
+ basicData: "basicData", //用户自定义的记录节点数据
+ recordData: "recordData", //当前data数据(排除basicData和children字段)
+ };
+ this.toolbarFun = {
+ addTreeNode: function(param, $div) { //添加树节点后调用的函数,用于用户自定义,如未指定则树不会发生变化
+ return ;
+ },
+ editTreeNode: function(param, $div) { //编辑树节点后调用的函数,用于用户自定义,如未指定则树不会发生变化
+ return ;
+ },
+ editTreeLoad: function(param){ // 编辑树的数据回显,用于打开编辑时,回填数据
+ return ;
+ },
+ delTreeNode: function(param, $div){ //删除树后调用的函数,用于用户自定义,如未指定则树不会发生变化
+ return ;
+ },
+ loadToolbarBefore: function(buttons, param, $div){ // 右键菜单加载前的函数
+ return buttons;
+ }
+ };
+ this.toolbarStyle = { // 工具栏弹出层的自定义样式
+ title: "节点",
+ area: ["60%","80%"]
+ };
+ this.menubarFun = {
+ remove: function(checkbarNodes){ //删除复选框选中节点,需要用户自定义,如未指定则树只是页面上做了修改
+ return true;
+ }
+ };
+ this.menubarTips = { // 菜单栏的默认显示
+ toolbar: [],
+ group: [defaultMenu.moveDown, defaultMenu.moveUp, defaultMenu.refresh, defaultMenu.checkAll, defaultMenu.unCheckAll, defaultMenu.invertAll, defaultMenu.remove, defaultMenu.searchNode],
+ freedom: []
+ };
+ this.checkbarFun = {
+ chooseBefore: function($i, node){ // 复选框点击前回调
+ return true;
+ },
+ chooseDone: function(checkbarNodesParam) { //复选框点击事件完毕后,返回该树关于复选框操作的全部信息,用于用户自定义,如未指定则树只是页面上做了修改
+ return ;
+ }
+ };
+ this.iframeDefaultRequest = { //iframe的默认参数,目的是与加载树的参数不一样
+ nodeId: "nodeId", //节点ID
+ parentId: "parentId", //父节点ID
+ context: "context", //节点内容
+ leaf: "leaf", //是否叶子节点
+ level: "level", //层级
+ spread: "spread", //节点展开状态
+ dataType: "dataType", //节点标记
+ checked: "checked", //节点复选框选中状态
+ initchecked: "initchecked", //节点复选框初始状态
+ basicData: "basicData", //用户自定义的记录节点数据
+ recordData: "recordData", //当前data数据(排除basicData和children字段)
+ };
+
+ this.iframeFun = {
+ iframeDone: function(iframeParam){ //iframe加载完毕后,用于用户自定义事件
+ return ;
+ }
+ };
+ this.style = { //树最终使用的样式集合
+ item: "", //每一项div的样式
+ itemThis: "", //选中div的样式
+ dfont: "", //一级图标的样式
+ icon: "", //二级图标的样式
+ cbox: "", //复选框的样式
+ chs: "" //复选框选中的样式
+ };
+ this.usefontStyle = { //树最终使用的图标集合
+ fnode:{ //一级节点
+ node:{ //非叶子节点
+ open:"", //节点展开
+ close:"" //节点关闭
+ },
+ leaf:"" //叶子节点
+ },
+ snode:{ //二级节点
+ node:{ //非叶子节点
+ open:"", //节点展开
+ close:"" //节点关闭
+ },
+ leaf:"" //叶子节点
+ },
+ checkbox:{ //复选框
+ on:"", //复选框选中
+ out:"", //未选中
+ noall:"" //半选
+ },
+ menubar:{ //菜单栏
+ movedown:"", //全部展开
+ moveup:"", //全部收缩
+ refresh:"", //刷新
+ checkAll:"", //全选
+ unCheckAll:"", //全不选
+ invertAll:"", //反选
+ remove:"", //删除
+ search:"" //搜索
+ },
+ menubarExt:"", //扩展菜单栏
+ toolbar:{ //工具栏
+ menubar:{ //依附在菜单栏的工具栏
+ movedown:"", //全部展开
+ moveup:"", //全部收缩
+ refresh:"", //刷新
+ checkAll:"", //全选
+ unCheckAll:"", //全不选
+ invertAll:"", //反选
+ remove:"", //删除
+ search:"" //搜索
+ },
+ menubarExt:"", //依附在菜单栏的扩展菜单栏
+ pulldown:"", //展开
+ pullup:"", //收缩
+ add:"", //添加
+ edit:"", //编辑
+ del:"" //删除
+ },
+ toolbarExt:"" //扩展工具栏
+ }
+
+ /** 数据绑定**/
+ this.node = { // 树节点选中时,包含当前节点的全部信息
+ nodeId: "", //节点ID
+ parentId: "", //父节点ID
+ context: "", //节点内容
+ leaf: "", //是否叶子节点
+ level: "", //层级
+ spread: "", //节点展开状态
+ dataType: "", //节点标记
+ checked: "", //节点复选框选中状态
+ initchecked: "", //节点复选框初始状态
+ basicData: "", //用户自定义的记录节点数据
+ recordData: "", //当前data数据(排除basicData和children字段)
+ };
+
+ this.toolbarMenu = {}; // 工具栏右键菜单绑定的所有元素
+ this.checkbarNode = []; // 复选框标记的全部节点数据
+ this.errData = []; // 记录在渲染节点时有问题的数据
+ this.checkArrLen = 0; // 添加节点的时判断复选框个数
+ this.temp = []; // 临时变量
+ this.bak = ""; // 临时变量
+ this.setting(options);
+ };
+
+ /******************** 初始参数加载 ********************/
+ /**
+ * @Desc: 设置基本属性值
+ * @Param: options:JSON对象,初始设置dtree所需的全部属性
+ */
+ DTree.prototype.setting = function(options) {
+ this.options = options || {};
+
+ /** 绑定元素参数(必填,2个参数项必填一个)**/
+ this.elem = this.options.elem || OPTIONS.elem || ""; //树绑定的元素ID:#elem
+ if(typeof this.options.obj === 'undefined'){
+ if(this.elem) {
+ if($(this.elem).length > 0) {
+ this.obj = $(this.elem);
+ }
+ }
+ } else {
+ this.obj = this.options.obj || OPTIONS.obj || this.obj; //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到
+ this.elem = "#" + this.obj[0].id;
+ }
+
+ /** 基本参数**/
+ this.scroll = this.options.scroll || OPTIONS.scroll || this.elem; //树的上级div容器,让树可以显示滚动条的div容器的ID
+ this.accordion = (typeof (this.options.accordion) === "boolean") ? this.options.accordion : (typeof (OPTIONS.accordion) === "boolean") ? OPTIONS.accordion : false; //手风琴加载, 默认false
+ if(this.accordion) {
+ this.initLevel = 1; //默认展开节点 1节
+ } else {
+ this.initLevel = this.options.initLevel || OPTIONS.initLevel || 2; //默认展开节点 2节
+ }
+ this.type = this.options.type || OPTIONS.type || "load"; //树的加载方式 all,全量树, load,增量树,默认load
+ this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : (typeof (OPTIONS.cache) === "boolean") ? OPTIONS.cache : true; //数据缓存,默认true
+ this.record = this.options.record || OPTIONS.record || false; //开启数据记录模式,默认false
+ this.load = (typeof (this.options.load) === "boolean") ? this.options.load : (typeof (OPTIONS.load) === "boolean") ? OPTIONS.load : true; //开启加载动画,默认true
+ this.none = this.options.none || OPTIONS.nont || "无数据"; //初始加载无记录时显示文字
+ this.tempHeight = this.options.height || OPTIONS.height; //临时转换高度变量
+ if(this.tempHeight) { // 设置高度
+ if(/^full-\d+$/.test(this.tempHeight)) {
+ this.fullHeightGap = this.tempHeight.split('-')[1];
+ this.height = $WIN.height() - this.fullHeightGap; //设置高度
+ } else {
+ this.fullHeightGap = this.tempHeight;
+ this.height = this.tempHeight;
+ }
+ } else {
+ this.fullHeightGap = "";
+ this.height = "";
+ }
+ this.width = this.options.width || OPTIONS.width || "260"; //宽度
+ this.obj.css("width", this.width);
+
+ /** 样式相关参数**/
+ this.iconfont = this.options.iconfont || OPTIONS.iconfont || DTREEFONT; //默认图标字体 dtreefont
+ this.iconfontStyle = this.options.iconfontStyle || OPTIONS.iconfontStyle || {}; //用于自定义树的每个关键部位使用的图标
+ this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray || OPTIONS.nodeIconArray) || nodeIconArray; //用户自定义非叶子节点图标集合,node
+ this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray || OPTIONS.leafIconArray) || leafIconArray; //用户自定义叶子节点图标集合,leaf
+ this.skin = this.options.skin || OPTIONS.skin || "theme"; // 自定义样式
+ if(this.skin == "layui"){ // layui主题
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : (typeof (OPTIONS.line) === "boolean") ? OPTIONS.line : true; //开启树线,默认开启
+ this.ficon = this.options.ficon || OPTIONS.ficon || "7"; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'7'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'1'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; //一级图标中的leaf节点图标
+ this.icon = this.options.icon || OPTIONS.icon || "-1"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标
+ } else if(this.skin == "laySimple"){ // laySimple主题
+ this.line = this.options.line || OPTIONS.line || false; //开启树线,默认不开启
+ this.ficon = this.options.ficon || OPTIONS.ficon || ["2","-1"]; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'-1'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "2") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'2'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标
+ this.icon = this.options.icon || OPTIONS.icon || "-1"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标
+ } else { // 默认主题 或者自定义主题
+ this.line = this.options.line || OPTIONS.line || false; //开启树线,默认不开启
+ this.ficon = this.options.ficon || OPTIONS.ficon || "8"; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'8'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示一级图标,默认'1'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标
+ this.icon = this.options.icon || OPTIONS.icon || "5"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'5'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'0'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标
+ }
+
+ /** 数据加载参数**/
+ this.url = this.options.url || OPTIONS.url || ""; //请求地址
+ this.async = (typeof (this.options.async) === "boolean") ? this.options.async : (typeof (OPTIONS.async) === "boolean") ? OPTIONS.async : true; //异步同步加载,默认异步加载
+ this.asyncLoad = this.options.asyncLoad || OPTIONS.asyncLoad || []; //初始异步加载层级数据
+ this.headers = this.options.headers || OPTIONS.headers || {}; //ajax header属性
+ this.method = this.options.method || OPTIONS.method || "post"; //请求类型
+ this.dataType = this.options.dataType || OPTIONS.dataType || "json"; //参数类型
+ this.contentType = this.options.contentType || OPTIONS.contentType || "application/x-www-form-urlencoded"; //发送信息至服务器时内容编码类型
+ this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest || OPTIONS.defaultRequest) || this.defaultRequest; //默认请求参数
+ this.filterRequest = this.options.filterRequest || OPTIONS.filterRequest || []; //过滤请求参数
+ this.request = this.options.request || OPTIONS.request || {}; //用户自定义请求参数
+ this.response = $.extend(this.response, this.options.response || OPTIONS.response) || this.response; //返回json格式
+ this.data = this.options.data || OPTIONS.data || null; //初始化指定该参数,则不会访问异步接口
+ this.dataFormat = this.options.dataFormat || OPTIONS.dataFormat || "levelRelationship"; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认
+ this.dataStyle = this.options.dataStyle || OPTIONS.dataStyle || "defaultStyle"; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格
+ this.errDataShow = this.options.errDataShow || OPTIONS.errDataShow || false; //是否在递归数据出现错误后,显示错误信息,默认false
+ this.withCredentials = this.options.withCredentials || OPTIONS.withCredentials || false; //是否允许跨域请求,默认false
+ this.beforeSend = this.options.beforeSend || OPTIONS.beforeSend || function(ajax, XMLHttpRequest, self){return true}; //异步加载之前的回调
+ this.success = this.options.success || OPTIONS.success || function(data, obj, first){}; //树加载完毕后执行解析树之前的回调
+ this.done = this.options.done || OPTIONS.done || function(data, obj, first){}; //树加载完毕后的回调
+ this.formatter = $.extend(this.formatter, this.options.formatter || OPTIONS.formatter) || this.formatter; //数据过滤
+ this.error = this.options.error || OPTIONS.error || function(XMLHttpRequest, textStatus, errorThrown){}; // 异步加载异常回调
+ this.complete = this.options.complete || OPTIONS.complete || function(XMLHttpRequest, textStatus){}; // 异步加载完成回调
+
+ /** 复选框参数**/
+ this.checkbar = this.options.checkbar || OPTIONS.checkbar || false; //是否开启复选框模式
+ this.checkbarLoad = this.options.checkbarLoad || OPTIONS.checkbarLoad || "node"; //复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点
+ this.checkbarType = this.options.checkbarType || OPTIONS.checkbarType || "all"; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all
+ this.checkbarData = this.options.checkbarData || OPTIONS.checkbarData || "choose"; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all记录全部数据,halfChoose记录选中和半选中的数据,默认choose
+ this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun || OPTIONS.checkbarFun) || this.checkbarFun; //checkbar事件加载
+
+ /** 菜单栏参数**/
+ this.menubar = this.options.menubar || OPTIONS.menubar || false; //是否打开菜单栏
+ this.menubarTips = $.extend(this.menubarTips, this.options.menubarTips || OPTIONS.menubarTips) || this.menubarTips; //菜单栏吸附, toolbar:依附在工具栏,group:依附在按钮组,freedom,自由
+ this.menubarFun = $.extend(this.menubarFun, this.options.menubarFun || OPTIONS.menubarFun) || this.menubarFun; //menubar事件加载
+
+ /** 工具栏参数**/
+ this.toolbar = this.options.toolbar || OPTIONS.toolbar || false; //是否开启可编辑模式
+ this.toolbarWay = this.options.toolbarWay || OPTIONS.toolbarWay || "contextmenu"; //工具栏显示方式,contextmenu:右键,follow:跟随节点,fixed:固定在节点右侧
+ this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle || OPTIONS.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小
+ this.toolbarLoad = this.options.toolbarLoad || OPTIONS.toolbarLoad || "node"; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级
+ this.toolbarShow = this.options.toolbarShow || OPTIONS.toolbarShow || ["add","edit","delete"]; //toolbar三个按钮自定义加载
+ this.toolbarBtn = this.options.toolbarBtn || OPTIONS.toolbarBtn || null; //toolbar增删改中内容的自定义加载
+ this.toolbarExt = this.options.toolbarExt || OPTIONS.toolbarExt || []; //toolbar按钮扩展
+ this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun || OPTIONS.toolbarFun) || this.toolbarFun; //toolbar事件加载
+
+ /** iframe模式参数**/
+ this.useIframe = this.options.useIframe || OPTIONS.useIframe || false; //是否加载iframe 默认false,
+ this.iframeElem = this.options.iframeElem || OPTIONS.iframeElem || ""; //iframe的ID
+ this.iframeUrl = this.options.iframeUrl || OPTIONS.iframeUrl || ""; //树关联的iframe地址
+ this.iframeLoad = this.options.iframeLoad || OPTIONS.iframeLoad || "leaf"; //点击哪一层加载frame: node:所有节点, leaf:默认,最后一级
+ this.iframeDefaultRequest = $.extend(this.iframeDefaultRequest, this.options.iframeDefaultRequest || OPTIONS.iframeDefaultRequest) || this.iframeDefaultRequest; //iframe的默认传递参数
+ this.iframeRequest = $.extend(this.iframeRequest, this.options.iframeRequest) || $.extend(this.iframeRequest, OPTIONS.iframeRequest) || this.iframeRequest; //iframe的自定义参数
+ this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || $.extend(this.iframeFun, OPTIONS.iframeFun) || this.iframeFun; //iframe事件加载
+
+ /** 下拉树模式参数**/
+ this.select = this.options.select || false;
+ if(this.select) {
+ // 重置下拉树
+ this.selectSetting();
+ }
+
+ /** 调用确认最终主题方法*/
+ this.ensureTheme();
+ };
+
+ /**
+ * @Desc: 重置基本属性值
+ * @Param: options:JSON对象,重置dtree所需的全部属性
+ */
+ DTree.prototype.reloadSetting = function(options) {
+ this.options = $.extend(this.options, options) || this.options;
+
+ /** 绑定元素参数**/
+ this.elem = this.options.elem || this.elem; //树绑定的元素ID:#elem
+ if(typeof this.options.obj === 'undefined'){
+ if(this.elem) {
+ if($(this.elem).length > 0) {
+ this.obj = $(this.elem);
+ }
+ }
+ } else {
+ this.obj = this.options.obj || this.obj; //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到
+ this.elem = "#" + this.obj[0].id;
+ }
+
+ /** 基本参数**/
+ this.scroll = this.options.scroll || this.scroll; //树的上级div容器,让树可以显示滚动条的div容器
+ this.accordion = (typeof (this.options.accordion) === "boolean") ? this.options.accordion : this.accordion; //开启手风琴加载
+ if(this.accordion) {
+ this.initLevel = 1; //默认展开节点 1节
+ } else {
+ this.initLevel = this.options.initLevel || this.initLevel; //默认展开节点 2节
+ }
+ this.type = this.options.type || this.type; //树的加载方式 all,全量树, load,增量树,默认load
+ this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : this.cache; //开启数据缓存
+ this.record = (typeof (this.options.record) === "boolean") ? this.options.record : this.record; //开启数据记录模式
+ this.load = (typeof (this.options.load) === "boolean") ? this.options.load : this.load; //开启加载动画
+ this.none = this.options.none || this.none; //初始节点加载无数据时显示文字
+ this.tempHeight = this.options.height || this.height; //临时转换高度变量
+ if(this.tempHeight) { //设置高度
+ if(/^full-\d+$/.test(this.tempHeight)) {
+ this.fullHeightGap = this.tempHeight.split('-')[1];
+ this.height = $WIN.height() - this.fullHeightGap;
+ } else {
+ this.fullHeightGap = this.tempHeight;
+ this.height = this.tempHeight;
+ }
+ }
+ this.width = this.options.width || this.width; //宽度
+ this.obj.css("width", this.width);
+
+ /** 样式相关参数**/
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : this.line; //开启树线,默认不开启
+ this.iconfont = this.options.iconfont || this.iconfont; //默认图标字体 dtreefont
+ this.iconfontStyle = this.options.iconfontStyle || this.iconfontStyle; //用于自定义树的每个关键部位使用的图标
+ this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray) || this.nodeIconArray; //用户自定义非叶子节点图标集合,node
+ this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray) || this.leafIconArray; //用户自定义叶子节点图标集合,leaf
+ this.skin = this.options.skin || this.skin; //自定义样式
+ if(this.skin == "layui"){ //layui主题
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : true; //开启树线,默认开启
+ this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'7'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'1'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; //一级图标中的leaf节点图标
+ this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标
+ } else if(this.skin == "laySimple"){ //laySimple主题
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : false; //开启树线,默认不开启
+ this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'-1'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "2") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'2'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1];//一级图标中的leaf节点图标
+ this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'-1'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'-1'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标
+ } else { // 默认主题 或者自定义主题
+ this.line = (typeof (this.options.line) === "boolean") ? this.options.line : false; //开启树线,默认不开启
+ this.ficon = this.options.ficon || this.ficon; //一级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示一级图标。默认'8'
+ this.fnodeIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? (this.ficon == "-1" ? "-1" : "1") : this.ficon[0]; //一级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'1'
+ this.fleafIcon = (typeof this.ficon === 'string' || typeof this.ficon === 'number') ? this.ficon : this.ficon[1]; // 一级图标中的leaf节点图标
+ this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章,7:文件,8:小圆点,9:齿轮,10:星星, -1:不显示二级图标。默认'5'
+ this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; //二级图标中的node节点图标。0:文件夹,1:+、-,2:三角形, -1:不显示二级图标,默认'0'
+ this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; //二级图标中的leaf节点图标
+ }
+
+ /** 数据加载参数**/
+ this.url = this.options.url || this.url; //请求地址
+ this.async = (typeof (this.options.async) === "boolean") ? this.options.async : this.async; //异步同步加载,默认异步加载
+ this.asyncLoad = this.options.asyncLoad || this.asyncLoad; //初始异步加载层级数据
+ this.headers = this.options.headers || this.headers; //ajax header属性
+ this.method = this.options.method || this.method; //请求类型
+ this.dataType = this.options.dataType || this.dataType; //参数类型
+ this.contentType = this.options.contentType || this.contentType; //发送信息至服务器时内容编码类型
+ this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest) || this.defaultRequest; //默认请求参数
+ this.filterRequest = this.options.filterRequest || this.filterRequest; //过滤请求参数
+ this.request = this.options.request || this.request; //用户自定义请求参数
+ this.response = $.extend(this.response, this.options.response) || this.response; //返回json格式
+ this.data = this.options.data || this.data; //初始化指定该参数,则不会访问异步接口
+ this.dataFormat = this.options.dataFormat || this.dataFormat; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认
+ this.dataStyle = this.options.dataStyle || this.dataStyle; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格
+ this.errDataShow = (typeof (this.options.errDataShow) === "boolean") ? this.options.errDataShow : this.errDataShow; //是否在使用list模式递归数据出现错误时,显示错误信息
+ this.withCredentials = (typeof (this.options.withCredentials) === "boolean") ? this.options.withCredentials : this.withCredentials; //是否允许跨域请求
+ this.beforeSend = this.options.beforeSend || this.beforeSend; //异步加载之前的回调
+ this.success = this.options.success || this.success; //树加载完毕后执行解析树之前的回调
+ this.done = this.options.done || this.done; //树加载完毕后的回调
+ this.formatter = $.extend(this.formatter, this.options.formatter)|| this.formatter; //数据过滤
+ this.error = this.options.error || this.error; //异步加载异常回调
+ this.complete = this.options.complete || this.complete; //异步加载完成回调
+
+ /** 复选框参数**/
+ this.checkbar = this.options.checkbar || this.checkbar; //是否开启复选框模式
+ this.checkbarLoad = this.options.checkbarLoad || this.checkbarLoad; //复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点
+ this.checkbarType = this.options.checkbarType || this.checkbarType; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all
+ this.checkbarData = this.options.checkbarData || this.checkbarData; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all记录全部数据,halfChoose记录选中和半选中的数据,默认choose
+ this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun)|| this.checkbarFun; //checkbar事件加载
+
+ /** 菜单栏参数**/
+ this.menubar = this.options.menubar || this.menubar; //是否打开菜单栏
+ this.menubarTips = $.extend(this.menubarTips, this.options.menubarTips) || this.menubarTips; //菜单栏吸附, toolbar:依附在工具栏,group:依附在按钮组,freedom,自由
+ this.menubarFun = $.extend(this.menubarFun, this.options.menubarFun) || this.menubarFun; //menubar事件加载
+
+ /** 工具栏参数**/
+ this.toolbar = this.options.toolbar || this.toolbar; //是否开启工具栏
+ this.toolbarWay = this.options.toolbarWay || this.toolbarWay; //工具栏显示方式,contextmenu:右键,follow:跟随节点,fixed:固定在节点右侧
+ this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小
+ this.toolbarLoad = this.options.toolbarLoad || this.toolbarLoad; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级
+ this.toolbarShow = this.options.toolbarShow || this.toolbarShow; //toolbar三个按钮
+ this.toolbarBtn = this.options.toolbarBtn || this.toolbarBtn; //toolbar增删改中内容的自定义加载
+ this.toolbarExt = this.options.toolbarExt || this.toolbarExt; //toolbar按钮扩展
+ this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun) || this.toolbarFun; //toolbar事件加载
+
+ /** iframe模式参数**/
+ this.useIframe = this.options.useIframe || this.useIframe;//是否加载iframe 默认false
+ this.iframeElem = this.options.iframeElem || this.iframeElem; //iframe的ID
+ this.iframeUrl = this.options.iframeUrl || this.iframeUrl; //树关联的iframe地址
+ this.iframeLoad = this.options.iframeLoad || this.iframeLoad; //点击哪一层加载frame: node:所有节点, leaf:默认,最后一级
+ this.iframeDefaultRequest = $.extend(this.iframeDefaultRequest, this.options.iframeDefaultRequest) || this.iframeDefaultRequest; //iframe的默认传递参数
+ this.iframeRequest = $.extend(this.iframeRequest, this.options.iframeRequest) || this.iframeRequest; //iframe的自定义参数
+ this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || this.iframeFun; //iframe事件加载
+
+ /** 下拉树模式参数**/
+ if(this.select) {
+ // 重置下拉树
+ this.reloadSelectSetting();
+ }
+
+ /** 调用确认最终主题方法*/
+ this.ensureTheme();
+
+ };
+
+ /**
+ * @Desc: 设置下拉树的基本参数值
+ */
+ DTree.prototype.selectSetting = function() {
+ /** select模式参数*/
+ this.select = true; //配置成select模式
+
+ this.selectInitVal = this.obj.attr("data-value") || this.options.selectInitVal || ""; //输入框的值
+ this.selectTreeDiv = this.obj[0].id + "_tree_div"; // 上级DIV节点
+ this.selectCardDiv = this.obj[0].id + "_select_card_div"; // 上级layui卡片节点
+ this.selectDiv = this.obj[0].id + "_select_div"; // 模拟的select节点
+ this.selectTipsName = this.obj[0].id + "_select_input"; // select的提示输入框名称
+ this.selectTips = this.options.selectTips || "请选择"; // 输入框的提示语
+ this.selectCardHeight = this.options.selectCardHeight || "350"; // 下拉面板的高度
+ this.selectInputName = this.options.selectInputName || {nodeId: this.obj[0].id + "_select_nodeId"}; // select表单中的元素
+
+ // 调取下拉树的特殊处理页面元素标识
+ this.renderSelectDom();
+ }
+
+ /**
+ * @Desc: 重置下拉树的基本参数值
+ */
+ DTree.prototype.reloadSelectSetting = function() {
+
+ this.selectInitVal = this.obj.attr("data-value") || this.options.selectInitVal || this.selectInitVal; //输入框的值
+ this.selectTips = this.options.selectTips || this.selectTips; // 输入框的提示语
+ this.selectCardHeight = this.options.selectCardHeight || this.selectCardHeight; // 下拉面板的高度
+ this.selectInputName = $.extend(this.selectInputName, this.options.selectInputName) || this.selectInputName; // select表单中的元素
+
+ // 调取下拉树的特殊处理页面元素标识
+ this.reloadSelectDom();
+ }
+
+ /******************** 下拉树设置区域 ********************/
+ /**
+ * @Desc: 渲染下拉树的Dom结构
+ */
+ DTree.prototype.renderSelectDom = function() {
+ var _this = this;
+ var rootId = _this.obj[0].id;
+
+ // 设置自定义表单隐藏域
+ var selectInputName = _this.selectInputName;
+ var selectInput = [];
+ for(var key in selectInputName) {
+ selectInput.push('');
+ }
+
+ // 设置html
+ var prevHtml = ['
'].join('');
+
+ _this.obj.before(prevHtml);
+
+ var cardStyle = "style=";
+ if(this.selectCardHeight) {
+ cardStyle += "'height:"+_this.selectCardHeight+"px'";
+ }
+ _this.obj.wrap('').wrap('').wrap('');
+
+ }
+
+ /**
+ * @Desc: 重新渲染下拉树的Dom结构
+ */
+ DTree.prototype.reloadSelectDom = function() {
+ var _this = this;
+ var rootId = _this.obj[0].id;
+
+ // 设置自定义表单隐藏域
+ var selectInputName = _this.selectInputName;
+ var selectInput = [];
+ for(var key in selectInputName) {
+ selectInput.push('');
+ }
+
+ $("div[dtree-id='"+rootId+"'][dtree-select='"+_this.selectDiv+"']").find("div.layui-select-title").html("");
+
+ // 设置html
+ var prevHtml = [selectInput.join(""),
+ '',
+ ''].join('');
+
+ $("div[dtree-id='"+rootId+"'][dtree-select='"+_this.selectDiv+"']").find("div.layui-select-title").html(prevHtml);
+
+ var cardStyle = "style=";
+ if(this.selectCardHeight) {
+ cardStyle += "'height:"+_this.selectCardHeight+"px'";
+ }
+ $("div[dtree-id='"+rootId+"'][dtree-card='"+_this.selectCardDiv+"']").attr("style", cardStyle);
+ }
+
+ /**
+ * @Desc: 设置下拉树模式中,input输入框的值
+ * @Param: param: input中的值对应树数据的ID值\当前树选中的数据JSON对象,可不传,不传的话则树内部读取
+ */
+ DTree.prototype.selectVal = function(param) {
+ var _this = this;
+ var rootId = _this.obj[0].id;
+ var selectInputName = _this.selectInputName;
+ var selectTipsNameValue = "";
+ var selectValues = {};
+
+ // 如果开启了复选框,则此方法用来取值
+ if(_this.checkbar) {
+ return _this.selectCheckboxVal();
+ }
+
+ if(typeof param === 'undefined') { // 不传,则为当前树中记录的ID
+ param = _this.getNowParam();
+ }
+ if(typeof param === 'string') { // 传递ID,则查询树节点ID对应的值
+ param = _this.getParam(param);
+ }
+
+ selectTipsNameValue = param["context"];
+ for(var key in selectInputName) {
+ selectValues[selectInputName[key]] = param[key];
+ $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+selectInputName[key]+"']").val(param[key] || "");
+ }
+
+ if(param["nodeId"] && !param["context"]) {
+ selectTipsNameValue = _this.getParam(param["nodeId"]);
+ }
+
+ // 返显提示输入框值
+ $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+_this.selectTipsName+"']").val(selectTipsNameValue || "");
+
+ // 返回隐藏域中的值
+ return selectValues;
+ }
+
+ /**
+ * @Desc: 设置复选框模式中的下拉树的选中值
+ */
+ DTree.prototype.selectCheckboxVal = function() {
+ var _this = this;
+ var rootId = _this.obj[0].id;
+ var selectInputName = _this.selectInputName;
+
+ // 获取全部复选框选中节点
+ var param = _this.getCheckbarJsonArrParam();
+
+ selectTipsNameValue = param["context"];
+ var selectValues = {};
+ for(var key in selectInputName) {
+ var value = param[key].join(",");
+ selectValues[selectInputName[key]] = value;
+ $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+selectInputName[key]+"']").val(value);
+ }
+
+ $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "'][name='"+_this.selectTipsName+"']").val(selectTipsNameValue);
+
+ // 返回隐藏域中的值
+ return selectValues;
+ }
+
+ /**
+ * @Desc: 重置下拉树的值,1.表单清空;2.节点重置;3.复选框重置
+ */
+ DTree.prototype.selectResetVal = function() {
+ var _this = this;
+ var rootId = _this.obj[0].id;
+ // 表单清空
+ $("input[dtree-id='"+rootId+"']").val("");
+ // 节点重置
+ _this.cancelNavThis();
+ if(_this.checkbar) {
+ // 复选框重置
+ _this.cancelCheckedNode();
+ }
+ }
+
+
+ /******************** 字体及图标区域 ********************/
+ /**
+ * @Desc: 树使用的最终主题方案
+ */
+ DTree.prototype.ensureTheme = function(){
+ var _this = this;
+
+ // 确认style
+ this.style.item = DTREE + this.skin + ITEM;
+ this.style.itemThis = DTREE + this.skin + ITEMTHIS;
+ this.style.dfont = DTREE + this.skin + DFONT;
+ this.style.ficon = DTREE + this.skin + FICON;
+ this.style.icon = DTREE + this.skin + ICON;
+ this.style.cbox = DTREE + this.skin + CBOX;
+ this.style.chs = DTREE + this.skin + CHS;
+
+ // 确认usefontStyle
+ var iconfont = this.iconfont;
+ var iconfonts = [];
+ if(typeof iconfont === 'string') {
+ iconfonts.push(iconfont);
+ } else {
+ iconfonts = iconfont;
+ }
+
+ var iconfontStyle = this.iconfontStyle;
+ var iconfontStyles = [];
+ if(iconfontStyle.length == undefined) {
+ iconfontStyles.push(iconfontStyle);
+ } else {
+ iconfontStyles = iconfontStyle;
+ }
+
+ for(var i=0; i 0) {
+ $lis.each(function(){
+ _this.showLineLi($(this));
+ });
+ } else {
+ _this.obj.find("li[data-id]").each(function(){
+ _this.showLineLi($(this));
+ });
+ }
+ }
+ }
+
+ /**
+ * @Desc: 真正显示树线的方法
+ * @Param: $li: JQuery对象,表示组成树的li节点
+ */
+ DTree.prototype.showLineLi = function($li){
+ var _this = this;
+ var $div = $li.children("div"),
+ $nextLi = $li.next("li"),
+ $ul = $li.parent("ul");
+ if($ul[0].id == _this.obj[0].id) {
+ // 根节点下的节点
+ $li.removeClass(LI_NAV_LINE);
+ $li.removeClass(LI_NAV_LAST_LINE);
+ $li.addClass(LI_NAV_FIRST_LINE);
+ } else {
+ // 非根节点下的节点
+ var $pnextLi = $ul.parent("li").next("li");
+ if($pnextLi.length == 0) {
+ if($nextLi.length == 0){
+ $li.removeClass(LI_NAV_LINE);
+ $li.removeClass(LI_NAV_FIRST_LINE);
+ $li.addClass(LI_NAV_LAST_LINE);
+ } else {
+ $li.removeClass(LI_NAV_FIRST_LINE);
+ $li.removeClass(LI_NAV_LAST_LINE);
+ $li.addClass(LI_NAV_LINE);
+ }
+ }else {
+ var $pnextdiv = $pnextLi.children("div");
+ if($nextLi.length == 0 && $div.children("cite").attr("data-leaf") == "leaf" && $pnextdiv.children("cite").attr("data-leaf") == "leaf") {
+ $li.removeClass(LI_NAV_FIRST_LINE);
+ $li.removeClass(LI_NAV_LINE);
+ $li.addClass(LI_NAV_LAST_LINE);
+ } else {
+ $li.removeClass(LI_NAV_FIRST_LINE);
+ $li.removeClass(LI_NAV_LAST_LINE);
+ $li.addClass(LI_NAV_LINE);
+ }
+ }
+ }
+ }
+
+ /******************** 初始化数据区域 ********************/
+ /**
+ * @Desc: 设置高度
+ */
+ DTree.prototype.autoHeight = function(){
+ var _this = this;
+ var height = _this.height;
+ if(height != "") {
+ if(_this.elem == _this.scroll){
+ _this.obj.parent().css("height", height + "px");
+ } else {
+ var $toolbarDiv = _this.obj.closest(_this.scroll);
+ $toolbarDiv.css("height", height + "px");
+ }
+ }
+ };
+
+ /**
+ * @Desc: 重载树
+ * @Param: options: dtree的所有属性的json对象
+ */
+ DTree.prototype.reload = function(options){
+ var _this = this;
+ _this.reloadSetting(options);
+ _this.init();
+ };
+
+ /**
+ * @Desc: 初始化加载
+ */
+ DTree.prototype.loadTreeInit = function(){
+ var _this = this;
+ var asyncLoad = _this.asyncLoad;
+ // 初始化加载
+ _this.init(function(){
+ // ajax加载之后的回调
+ if(asyncLoad && asyncLoad.length > 0) {
+ _this.obj.addClass(NAV_SHOW);
+
+ // 说明此时要异步加载子节点
+ _this.loadChildTreeInit(asyncLoad, 0);
+ }
+ })
+ }
+
+ /**
+ * @Desc: 初始化加载子节点
+ * @Param: asyncLoad: 需异步加载的层级,在基础属性中配置
+ * @Param: i: 已经加载到的层级
+ */
+ DTree.prototype.loadChildTreeInit = function(asyncLoad, i){
+ var _this = this;
+ if(i == asyncLoad.length) { // 满足条件,终止递归
+ return ;
+ }
+
+ var $div = _this.getNode(asyncLoad[i]);
+
+ if($div && $div.length > 0) {
+ // 设置节点状态
+ var $ul = $div.next("ul"),
+ $i_fnode = _this.getNodeDom($div).fnode(),
+ $i_snode = _this.getNodeDom($div).snode();
+
+ $ul.addClass(NAV_SHOW);
+ _this.accordionUL($ul);
+ _this.operateIcon($i_fnode, $i_snode).open();
+ // 加载子节点
+ _this.getChild($div, undefined, function(){
+ // 继续递归
+ _this.loadChildTreeInit(asyncLoad, ++i);
+ });
+ }
+
+ }
+
+ /**
+ * @Desc: 初始化树
+ * @Param: callback: 异步加载完成之后的回调函数
+ */
+ DTree.prototype.init = function(callback){
+ var _this = this;
+ if (typeof _this !== "object") {
+ layer.msg("树组件未成功加载,请检查配置", {icon:5});
+ return ;
+ }
+
+ // 设置组件高度
+ _this.autoHeight();
+
+ if(_this.data) {
+ _this.dataLoadTree(true, _this.obj, _this.data);
+ } else {
+ _this.asyncLoadTree(true, _this.obj, callback);
+ }
+ };
+
+ /**
+ * @Desc: 加载子节点
+ * @Param: $div: JQuery对象,代表当前子节点的父节点div
+ * @Param: data: data方式加载的数据
+ * @Param: callback: 子节点加载完成之后的回调喊出
+ */
+ DTree.prototype.getChild = function($div, data, callback) {
+ var _this = this, $ul = $div.next("ul");
+
+ _this.setNodeParam($div);
+
+ if(typeof data !== 'undefined') {
+ _this.dataLoadTree(false, $ul, data);
+ } else {
+ _this.asyncLoadTree(false, $ul, callback);
+ }
+ };
+
+ /**
+ * @Desc: 用data加载树
+ * @Param: first: 表示是否第一次加载
+ * @Param: $ul: JQuery对象,代表当前数据加载到的ul标签里
+ * @Param: data: data加载的数据
+ */
+ DTree.prototype.dataLoadTree = function(first, $ul, data){
+ var _this = this;
+
+ if(typeof data.length === 'undefined'){
+ layer.msg("数据解析异常,data数据格式不正确", {icon:5});
+ return ;
+ }
+
+ if(first && data.length == 0) {
+ $ul.html(_this.getNoneDom().text());
+ return ;
+ }
+
+ //先将ul中的元素清空
+ $ul.html("");
+
+ var index = _this.load ? layer.load(1) : "";
+
+ setTimeout(function () {
+ // 加载完毕后执行树解析前的回调
+ _this.success(data, $ul, first);
+
+ var pid = (first == true) ? $ul.attr("data-id") : _this.node.nodeId;
+ var level = (first == true) ? 1 : parseInt(_this.node.level)+1;
+
+ // 解析树
+ if (_this.dataFormat == 'list'){
+ //1.构建一个存放节点的树组
+ var rootListData = _this.queryListTreeByPid(pid, data);
+ _this.loadListTree(rootListData, _this.data, level);
+ } else {
+ _this.loadTree(data, level);
+ }
+
+ // 显示树线
+ _this.showLine();
+
+ // 这种情况下需要一开始就将toolbar显示在页面上
+ if(_this.toolbar && _this.toolbarWay != 'contextmenu') {
+ _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu);
+ }
+
+ // 判断是否存在错误数据,并是否打印错误数据
+ _this.msgErrData();
+
+ // 设置下拉树的初始值
+ if(first && _this.select && _this.selectInitVal){
+ if(_this.checkbar) { // 复选框模式下
+ _this.chooseDataInit(_this.selectInitVal);
+ _this.selectCheckboxVal(_this.selectInitVal);
+ } else { // 普通模式下
+ _this.dataInit(_this.selectInitVal);
+ _this.selectVal(_this.selectInitVal);
+ }
+ }
+
+ // 保存树副本
+ _this.bak = _this.obj.html();
+
+ // 加载完毕后的回调
+ _this.done(_this.data, $ul, first);
+
+ if(_this.load){layer.close(index);}
+ }, 100);
+ }
+
+ /**
+ * @Desc: 异步加载树
+ * @Param: first: 表示是否第一次加载
+ * @Param: $ul: JQuery对象,代表当前数据加载到的ul标签里
+ * @Param: callback: 异步加载完成之后的回调函数
+ */
+ DTree.prototype.asyncLoadTree = function(first, $ul, callback){
+ var _this = this;
+
+ if (!_this.url) {
+ layer.msg("数据请求异常,url参数未指定", {icon:5});
+ return ;
+ }
+
+ //先将ul中的元素清空
+ $ul.html("");
+
+ var index = "";
+
+ AjaxHelper.request({
+ async: _this.async,
+ headers: _this.headers,
+ type: _this.method,
+ url: _this.url,
+ dataType: _this.dataType,
+ contentType: _this.contentType,
+ withCredentials: _this.withCredentials,
+ data: _this.getFilterRequestParam(_this.getRequestParam()),
+ beforeSend: function(XMLHttpRequest, self){
+ index = _this.load ? layer.load(1) : "";
+ var returnFlag = _this.beforeSend(this, XMLHttpRequest, self);
+ if(!returnFlag) {
+ if(_this.load){layer.close(index);}
+ }
+ return returnFlag;
+ },
+ success: function(result) {
+ if (typeof result === 'string') {
+ result = $.parseJSON(result);
+ }
+
+ // 加载完毕后执行树解析前的回调
+ _this.success(result, $ul, first);
+
+ var code = "";
+ if (_this.dataStyle == 'layuiStyle'){
+ code = result[_this.response.statusName];
+ } else {
+ code = result.status[_this.response.statusName];
+ }
+
+ if (code == _this.response.statusCode) {
+
+ var d = result[_this.response.rootName];
+
+ if(first && typeof d.length === 'undefined'){
+ $ul.html(_this.getNoneDom().errText("数据解析异常,url回调后的数据格式不正确"));
+ //layer.msg("数据解析异常,url回调后的数据格式不正确", {icon:5});
+ return ;
+ }
+
+ if(first && d.length == 0) {
+ $ul.html(_this.getNoneDom().text());
+ return ;
+ }
+
+ //1.识别根节点ul中的data-id标签,判断顶级父节点
+ var pid = (first == true) ? $ul.attr("data-id") : _this.node.nodeId;
+ var level = (first == true) ? 1 : parseInt(_this.node.level)+1;
+
+ // 第一次解析树
+ if (_this.dataFormat == 'list'){
+ //1.构建一个存放节点的树组
+ var rootListData = _this.queryListTreeByPid(pid, d);
+ if(first) {
+ _this.loadListTree(rootListData, d, level);
+ } else {
+ _this.loadListTree(rootListData, d, level, $ul);
+ }
+ } else {
+ if(first) {
+ _this.loadTree(d, level);
+ } else {
+ _this.loadTree(d, level, $ul);
+ }
+ }
+
+ // 显示树线
+ _this.showLine();
+
+ // 这种情况下需要一开始就将toolbar显示在页面上
+ if(_this.toolbar && _this.toolbarWay != 'contextmenu') {
+ _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu);
+ }
+
+ // 判断是否存在错误数据,并是否打印错误数据
+ _this.msgErrData();
+
+ if(!first) {
+ $ul.addClass(NAV_SHOW);
+ }
+
+ // 设置下拉树的初始值
+ if(first && _this.select && _this.selectInitVal){
+ if(_this.checkbar) { // 复选框模式下
+ _this.chooseDataInit(_this.selectInitVal);
+ _this.selectCheckboxVal(_this.selectInitVal);
+ } else { // 普通模式下
+ _this.dataInit(_this.selectInitVal);
+ _this.selectVal(_this.selectInitVal);
+ }
+ }
+
+ // 保存树副本
+ _this.bak = _this.obj.html();
+
+ // 加载完毕后的回调
+ _this.done(result, $ul, first);
+
+ callback && callback();
+ } else {
+ // 如果打印不出任何信息说明是在这里,用了错误的数据格式, 或返回码不正确
+ if (_this.dataStyle == 'layuiStyle'){
+ _this.obj.html(_this.getNoneDom().errText(result[_this.response.message]));
+ _this.error(null, code, result[_this.response.message]);
+ } else {
+ _this.obj.html(_this.getNoneDom().errText(result.status[_this.response.message]));
+ _this.error(null, code, result.status[_this.response.message]);
+ }
+ }
+ },
+ error: function(XMLHttpRequest, textStatus, errorThrown){// 异步加载异常回调
+ _this.obj.html(_this.getNoneDom().errText(textStatus + ": " + errorThrown));
+ _this.error(XMLHttpRequest, textStatus, errorThrown);
+ },
+ complete: function(XMLHttpRequest, textStatus){// 异步加载完成回调
+ if(_this.load){layer.close(index);}
+ _this.complete(XMLHttpRequest, textStatus);
+ }
+ });
+
+ }
+
+ /**
+ * @Desc: 初始化渲染树或者拼接渲染树,list模式下
+ * @Param: nowListData: 表示当前需要被渲染的数据
+ * @Param: listData: 表示全部数据
+ * @Param: level: 当前渲染的层级
+ * @Param: $ul: JQuery对象,代表当前数据加载到的ul标签里
+ */
+ DTree.prototype.loadListTree = function(nowListData, listData, level, $ul){
+ var _this = this;
+ $ul = $ul || _this.getNodeDom().nowOrRootUl(); //当前选中的节点或根节点
+ if (nowListData.length > 0){
+ for (var i = 0; i < nowListData.length; i++) {
+ // 1.获取已知节点的全部数据
+ var data = nowListData[i];
+ if(typeof data !== "object") continue;
+ var parseData = _this.parseData(data);
+ var childListData = _this.queryListTreeByPid(parseData.treeId(), listData); // 根据已知数据的id判断该条数据是否还有子数据
+
+ // 3. 页面元素加载数据
+ $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(childListData.length), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(level), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), ($ul.hasClass(UL_ROOT) ? "root" : "item")));
+ // 4.有子数据的元素加载子节点
+ if(childListData.length > 0){
+ var cLevel = parseInt(level)+1;
+ _this.loadListTree(childListData, listData, cLevel, _this.obj.find("ul[data-id='"+parseData.treeId()+"']"));
+ }
+ }
+ }
+ };
+
+ /**
+ * @Desc: 根据父ID查找list数据中匹配的元素
+ * @Param: pid: 表示父ID
+ * @Param: listData: 表示全部数据
+ */
+ DTree.prototype.queryListTreeByPid = function(pid, listData){
+ var _this = this;
+ var rootListData = [];
+ if (listData) {
+ for (var i = 0; i < listData.length; i++) {
+ var data = listData[i];
+ if(typeof data !== "object") continue;
+ if(pid == "null" || pid == null){
+ if(data[_this.response.parentId] == null) { rootListData.push(data); }
+ } else {
+ if (data[_this.response.parentId] == pid){
+ if (data[_this.response.treeId] == pid){
+ _this.errData.push(data);
+ } else {
+ rootListData.push(data);
+ }
+ }
+ }
+ }
+ }
+ return rootListData;
+ };
+
+ /**
+ * @Desc: 初始化渲染树或者拼接渲染树,层级关系模式下
+ * @Param: listData: 表示全部数据
+ * @Param: level: 当前渲染的层级
+ * @Param: $ul: JQuery对象,代表当前数据加载到的ul标签里
+ */
+ DTree.prototype.loadTree = function(listData, level, $ul){
+ var _this = this;
+ if (listData) {
+ $ul = $ul || _this.getNodeDom().nowOrRootUl(); //当前选中的节点或根节点
+ for (var i = 0; i < listData.length; i++) { // 遍历跟节点或追加的跟节点
+ var data = listData[i];
+ if(typeof data !== "object") continue;
+ if(data[_this.response.treeId] == data[_this.response.parentId]) { _this.errData.push(data); }
+ var parseData = _this.parseData(data);
+ var children = parseData.children();
+ $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(children.length), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(level), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), ($ul.hasClass(UL_ROOT) ? "root" : "item")));
+ if (children.length != 0) {
+ var cLevel = parseInt(level)+1;
+ _this.loadTree(children, cLevel, _this.obj.find("ul[data-id='"+parseData.treeId()+"']"));
+ }
+ }
+ }
+ };
+
+ /**
+ * @Desc: 判断在数据加载时是否存在错误数据,并是否打印错误数据
+ * @Param:
+ */
+ DTree.prototype.msgErrData = function() {
+ var _this = this;
+ if(_this.errData.length > 0 && _this.errDataShow) {
+ var title = "";
+ for(var i=0; i<_this.errData.length; i++) {
+ var edata = _this.errData[i];
+ title += "数据:【"+edata[_this.response.title]+"】中节点id和上级id值一致! \n";
+ }
+ layer.msg(title, {icon:2,time:5000});
+ }
+ // 显示之后,将错误数据制空
+ _this.errData = [];
+ };
+
+ /**
+ * @Desc: 解析单个数据
+ * @Param: data: 被解析的单个数据对象
+ */
+ DTree.prototype.parseData = function(data) {
+ var _this = this;
+
+ return {
+ treeId: function(){
+ return data[_this.response.treeId];
+ },
+ parentId: function(){
+ return data[_this.response.parentId];
+ },
+ fmtTitle: function(){
+ if(typeof _this.formatter.title === 'function'){
+ var ftitle = _this.formatter.title(data);
+ var tt = data[_this.response.title];
+ tt = (ftitle == "" || ftitle == undefined || ftitle == null) ? tt : ftitle;
+ return tt || "";
+ }
+ return data[_this.response.title];
+ },
+ title: function(){
+ return data[_this.response.title];
+ },
+ level: function(){
+ return data[_this.response.level] || "";
+ },
+ ficonClass: function(){
+ return data[_this.response.ficonClass] || "";
+ },
+ iconClass: function(){
+ return data[_this.response.iconClass] || "";
+ },
+ last: function(len){
+ return ((len == 0) ?
+ ((typeof (data[_this.response.last]) === "boolean") ? data[_this.response.last] : true) :
+ ((typeof (data[_this.response.last]) === "boolean") ? data[_this.response.last] : false));
+ },
+ spread: function(level){
+ return ((level < _this.initLevel) ?
+ ((typeof (data[_this.response.spread]) === "boolean") ? data[_this.response.spread] : true) :
+ ((typeof (data[_this.response.spread]) === "boolean") ? data[_this.response.spread] : false));
+ },
+ disabled: function(){
+ return (typeof (data[_this.response.disabled]) === "boolean") ? data[_this.response.disabled] : false;
+ },
+ hide: function(){
+ return (typeof (data[_this.response.hide]) === "boolean") ? data[_this.response.hide] : false;
+ },
+ checkArr: function(){
+ var checkArr = [];
+ var checkArrData = data[_this.response.checkArr];
+ if(typeof checkArrData === 'string'){
+ if(checkArrData.indexOf("{") > -1 && checkArrData.indexOf("}") > -1){
+ checkArrData = JSON.parse(checkArrData);
+ } else {
+ checkArrData = {"type":"0","checked":checkArrData};
+ }
+ }
+ if(typeof checkArrData === 'object'){
+ if(typeof checkArrData.length === 'undefined'){
+ checkArr.push(checkArrData);
+ } else {
+ checkArr = checkArrData;
+ }
+ }
+
+ if(checkArr.length > 0 && checkArr.length > _this.checkArrLen){
+ _this.checkArrLen = checkArr.length; // 获取复选框个数
+ }
+ return checkArr;
+
+ },
+ children: function(){
+ return data[_this.response.childName] || [];
+ },
+ basicData: function(){
+ return event.escape(JSON.stringify(data[_this.response.basicData])) || JSON.stringify({});
+ },
+ recordData: function(){
+ var recordData = _this.record ? event.cloneObj(data, [_this.response.treeId,
+ _this.response.parentId,
+ _this.response.title,
+ _this.response.iconClass,
+ _this.response.childName,
+ _this.response.last,
+ _this.response.spread,
+ _this.response.disabled,
+ _this.response.hide,
+ _this.response.checkArr,
+ _this.response.checked,
+ _this.response.type,
+ _this.response.basicData]) : {};
+
+ return event.escape(JSON.stringify(recordData));
+ },
+ data: function(){
+ return data;
+ }
+ }
+
+ };
+
+ /**
+ * @Desc: 无节点数据、节点数据异常时显示dom
+ */
+ DTree.prototype.getNoneDom = function(){
+ var _this = this,
+ rootId = _this.obj[0].id,
+ noneTitle = _this.none;
+
+ return {
+ text: function(){
+ return ""+noneTitle+"
";
+ },
+ errText: function(errInfo){
+ return ""+errInfo+"
";
+ }
+ }
+ };
+
+ /**
+ * @Desc: 新增节点的dom值
+ * @Param: treeId: 节点ID
+ * @Param: parentId: 节点父ID
+ * @Param: title: 节点标题
+ * @Param: fmtTitle: 节点附加标题
+ * @Param: last: 是否最后一级节点
+ * @Param: ficonClass: 一级图标class
+ * @Param: iconClass: 二级图标class
+ * @Param: checkArr: 复选框
+ * @Param: spread: 是否展开
+ * @Param: disabled: 是否禁用
+ * @Param: hide: 是否隐藏
+ */
+ DTree.prototype.getDom = function(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide) {
+ var _this = this,
+ rootId = _this.obj[0].id,
+ toolbar = _this.toolbar,
+ checkbar = _this.checkbar;
+
+ return {
+ fnode: function() { // + - 图标
+ // 获取图标的变量
+ var fnodeIcon = _this.fnodeIcon,
+ fleafIcon = _this.fleafIcon;
+
+ var fleafIconLeaf = _this.usefontStyle.fnode.leaf,
+ fnodeIconOpen = _this.usefontStyle.fnode.node.open,
+ fnodeIconClose = _this.usefontStyle.fnode.node.close;
+
+ if(ficonClass){
+ var iconfont = _this.iconfont;
+ if(typeof iconfont === 'string') {
+ fleafIconLeaf = iconfont + " " + ficonClass;
+ fnodeIconOpen = iconfont + " " + ficonClass;
+ fnodeIconClose = iconfont + " " + ficonClass;
+ } else {
+ fleafIconLeaf = iconfont[0] + " " + ficonClass;
+ fnodeIconOpen = iconfont[0] + " " + ficonClass;
+ fnodeIconClose = iconfont[0] + " " + ficonClass;
+ }
+ }
+
+ if(fnodeIcon != "-1" && fleafIcon != "-1"){ // 都加载
+ return last ? "" :
+ (spread ? "" : "");
+ }
+
+ if(fnodeIcon != "-1" && fleafIcon == "-1"){ // 加载node 隐藏leaf
+ return last ? "" :
+ (spread ? "" : "");
+ }
+
+ if(fnodeIcon == "-1" && fleafIcon != "-1"){ // 隐藏node 加载leaf
+ return last ? "" :
+ (spread ? "" : "");
+ }
+
+ if(fnodeIcon == "-1" && fleafIcon == "-1"){ // 都隐藏
+ return last ? "" :
+ (spread ? "" : "");
+ }
+ },
+ node: function() { // 二级图标样式
+ // 获取图标的变量
+ var nodeIcon = _this.nodeIcon,
+ leafIcon = _this.leafIcon;
+
+ var sleafIconLeaf = _this.usefontStyle.snode.leaf,
+ snodeIconOpen = _this.usefontStyle.snode.node.open,
+ snodeIconClose = _this.usefontStyle.snode.node.close;
+ if(iconClass){
+ var iconfont = _this.iconfont;
+ if(typeof iconfont === 'string') {
+ sleafIconLeaf = iconfont + " " + iconClass;
+ snodeIconOpen = iconfont + " " + iconClass;
+ snodeIconClose = iconfont + " " + iconClass;
+ } else {
+ sleafIconLeaf = iconfont[0] + " " + iconClass;
+ snodeIconOpen = iconfont[0] + " " + iconClass;
+ snodeIconClose = iconfont[0] + " " + iconClass;
+ }
+ }
+
+ if(nodeIcon != "-1" && leafIcon != "-1"){ // 都加载
+ return last ? "" :
+ (spread ? "" : "");
+ }
+
+ if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf
+ return last ? "" :
+ (spread ? "" : "");
+ }
+
+ if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf
+ return last ? "" :
+ (spread ? "" : "");
+ }
+
+ if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏
+ return last ? "" :
+ (spread ? "" : "");
+ }
+ },
+ checkbox: function() { // 复选框
+ var flag = false;
+ if(_this.checkbarLoad == "node"){if (checkbar) {flag = true;}} else {if (last) {if (checkbar) {flag = true;}}}
+
+ if(flag){
+ var result = "";
+ if(checkArr && checkArr.length > 0){
+
+ for (var i = 0; i < checkArr.length; i++) {
+ var checkData = checkArr[i];
+ var checked = checkData[_this.response.checked];
+ var type = checkData[_this.response.type];
+ var CHOOSE_CLASS = _this.usefontStyle.checkbox.out;
+ if (checked == "2") { //半选择
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.noall + " " + _this.style.chs;
+ } else if (checked == "1") { //选择
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.on + " " + _this.style.chs;
+ } else { //未选择或者无值
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.out;
+ }
+ var disClass = "";
+ if(disabled){disClass = NAV_DIS;}
+ result += "";
+ }
+ }
+ result += "
";
+ return result;
+ }
+
+ return "";
+ },
+ text: function() { // 文字显示
+ var disClass = "";
+ if(disabled){disClass = NAV_DIS;}
+ return ""+fmtTitle+"";
+ },
+ ul: function() { //子节点ul
+ return last ? "" :
+ (spread ? "" : "");
+ }
+ };
+ };
+
+ /**
+ * @Desc: 替换节点的dom值,或指定这些值
+ * @Param: $div: JQuery对象,表示当前被操作的节点
+ * @Param: treeId: 节点ID
+ * @Param: last: 是否最后一级节点
+ * @Param: spread: 是否展开
+ * @Param: disabled: 是否禁用
+ * @Param: hide: 是否隐藏
+ */
+ DTree.prototype.replaceDom = function($div, treeId, last, spread, disabled, hide) {
+ var _this = this,
+ rootId = _this.obj[0].id,
+ toolbar = _this.toolbar,
+ checkbar = _this.checkbar;
+
+ return {
+ fnode: function(ficonClass) { // + - 图标
+ var fnode = "";
+
+ // 获取图标的变量
+ var fnodeIcon = _this.fnodeIcon,
+ fleafIcon = _this.fleafIcon;
+
+ var fleafIconLeaf = _this.usefontStyle.fnode.leaf,
+ fnodeIconOpen = _this.usefontStyle.fnode.node.open,
+ fnodeIconClose = _this.usefontStyle.fnode.node.close;
+
+ if(ficonClass){
+ var iconfont = _this.iconfont;
+ if(typeof iconfont === 'string') {
+ fleafIconLeaf = iconfont + " " + ficonClass;
+ fnodeIconOpen = iconfont + " " + ficonClass;
+ fnodeIconClose = iconfont + " " + ficonClass;
+ } else {
+ fleafIconLeaf = iconfont[0] + " " + ficonClass;
+ fnodeIconOpen = iconfont[0] + " " + ficonClass;
+ fnodeIconClose = iconfont[0] + " " + ficonClass;
+ }
+ }
+
+ if(fnodeIcon != "-1" && leafIcon != "-1"){ // 都加载
+ fnode = last ? "" :
+ (spread ? "" : "");
+ }else if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf
+ fnode = last ? "" :
+ (spread ? "" : "");
+ }else if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf
+ fnode = last ? "" :
+ (spread ? "" : "");
+ }else if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏
+ fnode = last ? "" :
+ (spread ? "" : "");
+ }
+ if(fnode != ""){_this.getNodeDom($div).fnode().replaceWith($(fnode));}
+ },
+ node: function(iconClass) { // 二级图标样式
+ var snode = "";
+
+ // 获取图标的变量
+ var nodeIcon = _this.nodeIcon,
+ leafIcon = _this.leafIcon;
+
+ var sleafIconLeaf = _this.usefontStyle.snode.leaf,
+ snodeIconOpen = _this.usefontStyle.snode.node.open,
+ snodeIconClose = _this.usefontStyle.snode.node.close;
+ if(iconClass){
+ var iconfont = _this.iconfont;
+ if(typeof iconfont === 'string') {
+ sleafIconLeaf = iconfont + " " + iconClass;
+ snodeIconOpen = iconfont + " " + iconClass;
+ snodeIconClose = iconfont + " " + iconClass;
+ } else {
+ sleafIconLeaf = iconfont[0] + " " + iconClass;
+ snodeIconOpen = iconfont[0] + " " + iconClass;
+ snodeIconClose = iconfont[0] + " " + iconClass;
+ }
+ }
+
+ if(nodeIcon != "-1" && leafIcon != "-1"){ // 都加载
+ snode = last ? "" :
+ (spread ? "" : "");
+ }else if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf
+ snode = last ? "" :
+ (spread ? "" : "");
+ }else if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf
+ snode = last ? "" :
+ (spread ? "" : "");
+ }else if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏
+ snode = last ? "" :
+ (spread ? "" : "");
+ }
+ if(snode != ""){_this.getNodeDom($div).snode().replaceWith($(snode));}
+ },
+ checkbox: function(checkArr) { // 复选框
+ var flag = false;
+ if(_this.checkbarLoad == "node"){if (checkbar) {flag = true;}} else {if (last) {if (checkbar) {flag = true;}}}
+
+ if(flag){
+ var result = "";
+ if(checkArr && checkArr.length > 0){
+
+ for (var i = 0; i < checkArr.length; i++) {
+ var checkData = checkArr[i];
+ var checked = checkData[_this.response.checked];
+ var type = checkData[_this.response.type];
+ var CHOOSE_CLASS = _this.usefontStyle.checkbox.out;
+ if (checked == "2") { //半选择
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.noall + " " + _this.style.chs;
+ } else if (checked == "1") { //选择
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.on + " " + _this.style.chs;
+ } else { //未选择或者无值
+ CHOOSE_CLASS = _this.usefontStyle.checkbox.out;
+ }
+ var disClass = "";
+ if(disabled){disClass = NAV_DIS;}
+ result += "";
+ }
+ }
+ result += "
";
+ _this.getNodeDom($div).snode().next("div").replaceWith($(result));
+ }
+ },
+ text: function(title) { // 文字显示
+ var disClass = "";
+ if(disabled){disClass = NAV_DIS;}
+ var cite = ""+title+""
+ _this.getNodeDom($div).cite().replaceWith($(cite));
+ },
+ ul: function() { //子节点ul
+ var ul = last ? "" :
+ (spread ? "" : "");
+ _this.getNodeDom($div).nextUl().replaceWith($(ul));
+ },
+ div: function(){
+ $div.attr("data-id", treeId);
+ },
+ basicData: function(basicData){
+ basicData = (basicData == "{}") ? "" : basicData;
+ $div.attr("data-basic", basicData);
+ },
+ recordData: function(recordData){
+ recordData = (recordData == "{}") ? "" : recordData;
+ $div.attr("data-record", recordData);
+ },
+ p_li: function(pId){
+ var $li = $div.parent("li");
+ $li.attr("data-id", treeId);
+ if(pId) {
+ $li.attr("data-pid", pId);
+ }
+ return $li;
+ }
+ };
+
+ };
+
+ /**
+ * @Desc: 获取拼接好的li的dom
+ * @Param: treeId: 节点ID
+ * @Param: parentId: 节点父ID
+ * @Param: title: 节点标题
+ * @Param: fmtTitle: 节点附加标题
+ * @Param: last: 是否最后一级节点
+ * @Param: ficonClass: 一级图标class
+ * @Param: iconClass: 二级图标class
+ * @Param: checkArr: 复选框
+ * @Param: level: 当前li的层级
+ * @Param: spread: 是否展开
+ * @Param: disabled: 是否禁用
+ * @Param: hide: 是否隐藏
+ * @Param: basicData: 自定义的扩展字段值(转义后的JSON字符)
+ * @Param: recordData: 开启记录模式的记录值(转义后的JSON字符)
+ * @Param: isRoot: 当前节点是否是根节点下的节点
+ */
+ DTree.prototype.getLiItemDom = function(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide, basicData, recordData, isRoot) {
+ var _this = this,
+ rootId = _this.obj[0].id;
+
+ var dom = _this.getDom(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide);
+ basicData = (basicData == "{}") ? "" : basicData;
+ recordData = (recordData == "{}") ? "" : recordData;
+ var div = ""; }
+ if(_this.toolbarLoad == "noleaf") { if(!last){ div += " d-contextmenu='true'>"; } else { div += " d-contextmenu='false'>";} }
+ if(_this.toolbarLoad == "leaf") { if(last){ div += " d-contextmenu='true'>"; } else { div += " d-contextmenu='false'>";} }
+ } else { div += " d-contextmenu='false'>"; }
+ } else { div += " d-contextmenu='false'>"; }
+
+ var hideClass = "";
+ var lineClass = "";
+ if(hide){hideClass = NAV_HIDE;}
+ var li = ["
" +
+ div ,
+ dom.fnode(),
+ dom.node(),
+ dom.checkbox(),
+ dom.text(),
+ "", dom.ul(), ""].join("");
+
+ return li;
+ };
+
+ /**
+ * @Desc: 初始化节点,用于数据回显
+ * @Param: chooseId: 节点ID
+ */
+ DTree.prototype.dataInit = function(chooseId){
+ var _this = this;
+ var $div = _this.obj.find("div[data-id='"+chooseId+"']");
+ if($div && $div.length > 0) {
+ _this.obj.find("."+NAV_THIS).removeClass(NAV_THIS);
+ _this.obj.find("."+_this.style.itemThis).removeClass(_this.style.itemThis);
+ $div.addClass(NAV_THIS);
+ $div.addClass(_this.style.itemThis);
+ _this.setNodeParam($div);
+ // 将该节点的父节点全部展开
+ var $li_parents = $div.parents("."+LI_NAV_ITEM);
+ $li_parents.children("ul").addClass(NAV_SHOW);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.fnode.node.close)).addClass(_this.usefontStyle.fnode.node.open);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.fnode.node.close)).removeClass(_this.usefontStyle.fnode.node.close);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.snode.node.close)).addClass(_this.usefontStyle.snode.node.open);
+ $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+event.trimToDot(_this.usefontStyle.snode.node.close)).removeClass(_this.usefontStyle.snode.node.close);
+ }
+ return _this.getNowParam();
+ };
+
+ /**
+ * @Desc: 基于备份的Html数据回滚
+ * @Param: chooseId: 节点ID
+ */
+ DTree.prototype.rollbackHtml = function(chooseId){
+ var _this = this;
+ if(_this.bak) {
+ _this.obj.html(_this.bak);
+ // 取消全部选中状态
+ _this.cancelNavThis();
+ if(_this.checkbar) {
+ _this.cancelCheckedNode();
+ _this.chooseDataInit(chooseId);
+ } else {
+ _this.dataInit(chooseId);
+ }
+
+ _this.bak = _this.obj.html();
+ }
+ };
+
+
+ /******************** 基础事件区域 ********************/
+ /**
+ * @Desc: 数据格式化
+ * @Param: html: 需要格式化的数据
+ */
+ DTree.prototype.escape = function(html){
+ return event.escape(html);
+ };
+
+ /**
+ * @Desc: 格式化数据转回正常数据
+ * @Param: str: 需要转回的数据
+ */
+ DTree.prototype.unescape = function(str){
+ return event.unescape(str);
+ };
+
+ /**
+ * @Desc: 取消选中当前选中的div
+ */
+ DTree.prototype.cancelNavThis = function(){
+ var _this = this;
+ _this.obj.find("div[data-id]").parent().find("."+NAV_THIS).removeClass(NAV_THIS);
+ _this.obj.find("div[data-id]").parent().find("."+_this.style.itemThis).removeClass(_this.style.itemThis);
+ }
+
+ /**
+ * @Desc: 选中div
+ * @Param: id: 当前div本身 / 当前选中div的id值
+ */
+ DTree.prototype.navThis = function(id){
+ var _this = this;
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ if($div != null) {
+ _this.cancelNavThis();
+ $div.addClass(NAV_THIS);
+ $div.addClass(_this.style.itemThis);
+ }
+ }
+
+ /**
+ * @Desc: 手风琴模式操作其他节点
+ * @Param: $ul: JQuery对象,表示dtree中的ul节点
+ */
+ DTree.prototype.accordionUL = function($ul) {
+ var _this = this;
+ if(_this.accordion) {
+ $ul.closest("li[data-index]").siblings("li[data-index]").children("ul[data-id]").removeClass(NAV_SHOW);
+ var $divs = $ul.closest("li[data-index]").siblings("li[data-index]").children("ul[data-id]").prev("div");
+ if($divs.length && $divs.length > 0) {
+ for (var i=0; i<$divs.length; i++) {
+ var $div = $($divs[i]);
+ var $i_fnode = _this.getNodeDom($div).fnode(),
+ $i_snode = _this.getNodeDom($div).snode();
+ if($i_fnode.attr("data-spread") != 'last'){
+ _this.operateIcon($i_fnode, $i_snode).close();
+ }
+ }
+ }
+
+ }
+ };
+
+ /**
+ * @Desc: 展开或隐藏节点 作用点: div
+ * @Param: $div: JQuery对象,表示当前操作的div节点
+ */
+ DTree.prototype.clickSpread = function($div) {
+ var _this = this;
+ var $i_fnode = _this.getNodeDom($div).fnode(),
+ $i_snode = _this.getNodeDom($div).snode(),
+ $cite = _this.getNodeDom($div).cite(),
+ spread = $i_fnode.attr("data-spread"),
+ $ul = $div.next("ul");
+
+ if ($ul.length > 0) {
+ if (spread == "close") {
+ if (_this.type=="load") { //增加加载
+ if (_this.cache) { //开启缓存
+ if ($ul.html()) {
+ $ul.addClass(NAV_SHOW);
+ _this.accordionUL($ul);
+ } else { //加载节点
+ _this.getChild($div);
+ _this.accordionUL($ul);
+ }
+ }else { //每次取新的数据
+ $ul.html("");
+ _this.getChild($div);
+ _this.accordionUL($ul);
+ }
+ } else { // 全量加载
+ $ul.addClass(NAV_SHOW);
+ _this.accordionUL($ul);
+ }
+ _this.operateIcon($i_fnode, $i_snode).open();
+ } else if (spread == "open") {
+ $ul.removeClass(NAV_SHOW);
+ _this.operateIcon($i_fnode, $i_snode).close();
+ }
+ }
+ };
+
+ /**
+ * @Desc: 设置节点为disabled
+ * @Param: disabledIds: 需要设置禁用的节点id字符串集合(用,分割)/id数组
+ */
+ DTree.prototype.setDisabledNodes = function(disabledIds){
+ var _this = this;
+ var disabledId = [];
+ if(typeof disabledIds === "string") {
+ disabledId = disabledIds.split(",");
+ } else {
+ disabledId = disabledIds;
+ }
+
+ if(disabledIds.length) {
+ for (var i=0; i 0) {
+ _this.getChild($div, data);
+ } else {
+ var parseData = _this.parseData(data);
+
+ if(parseData.treeId()){
+ var level = parseInt($div.parent("li").attr("data-index"))+1;
+ $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(0), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), "item"));
+
+ // 建造完毕后,选中该DIV
+ $thisDiv = $ul.find("div[data-id='"+parseData.treeId()+"']");
+ _this.setNodeParam($thisDiv);
+
+ _this.showLine($ul.find("li"));
+ // 这种情况下需要在新增节点后对节点新增工具栏
+ if(_this.toolbar && _this.toolbarWay != 'contextmenu') {
+ _this.dynamicToolbarDom($thisDiv.find("cite[data-leaf]"));
+ }
+ } else {
+ layer.msg("添加失败,节点ID为undefined!",{icon:5});
+ // 重新赋值
+ _this.setNodeParam($div);
+ }
+ }
+ } else {
+ _this.getChild($div);
+ }
+ }
+
+ /**
+ * @Desc: 局部刷新树--编辑当前节点选中节点时
+ * @Param: $div: JQuery对象,当前编辑节点的Div
+ * @Param: data: 当前需要渲染的数据,JSON对象、字符串
+ */
+ DTree.prototype.partialRefreshEdit = function($div, data){
+ var _this = this;
+ $ul = $div.next("ul"),
+ $p_li = $div.parent("li");
+
+ if(data) {
+ if(typeof data === 'object') {
+ var parseData = _this.parseData(data);
+
+ if(parseData.treeId()){
+ var replaceDom = _this.replaceDom($div, parseData.treeId(), parseData.last(0), parseData.spread(), parseData.disabled(), parseData.hide());
+ replaceDom.div();
+ replaceDom.node(parseData.iconClass());
+ replaceDom.checkbox(parseData.checkArr());
+ replaceDom.text(parseData.title());
+ replaceDom.ul();
+ replaceDom.basicData(parseData.basicData());
+ replaceDom.recordData(parseData.recordData());
+
+ var parentId = parseData.parentId();
+ var oldParentId = $p_li.attr("data-pid");
+ if(parentId && parentId != oldParentId) {
+ // 变更了父节点
+ $p_li = replaceDom.p_li(parentId);
+
+ // 根据parentId找到下挂节点的ul
+ var $goto_div = _this.getNodeDom(parentId).div(),
+ $goto_ul = _this.getNodeDom(parentId).nextUl();
+ // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式
+ if($goto_ul.children("li").length == 0){
+ var $icon_i = $goto_div.find("i[data-spread]");
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).openWithLeaf();
+ $goto_ul.addClass(NAV_SHOW);
+ }
+ $goto_ul.append($p_li);
+ } else {
+ replaceDom.p_li();
+ }
+ _this.setNodeParam($div);
+ } else {
+ layer.msg("编辑失败,节点ID为undefined!",{icon:5});
+ // 重新赋值
+ _this.setNodeParam($div);
+ }
+ } else {
+ _this.getNodeDom($div).cite().html(data);
+ }
+ }
+ }
+
+ /**
+ * @Desc: 局部刷新树--当前节点选中被删除时
+ * @Param: $div: JQuery对象,当前被删除节点的Div
+ */
+ DTree.prototype.partialRefreshDel = function($div){
+ var _this = this;
+ $p_li = $div.parent("li");
+ $p_ul = _this.getNodeDom($div).parentUl();
+ $p_div = _this.getNodeDom($div).parentDiv();
+
+ $p_li.remove();
+ _this.showLine($p_ul.find("li"));
+ // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式
+ if($p_ul.children("li").length == 0){
+ var $icon_i = $p_div.find("i[data-spread]");
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).closeWithLeaf();
+ }
+ _this.initNodeParam();
+ }
+
+ /***
+ * @Desc: 搜索节点,保留上级节点
+ * @param: value: 传入的节点名称
+ * layui-dtree群友: 没水平的水瓶提供。
+ */
+ DTree.prototype.fuzzySearch = function (value) {
+ var _this = this;
+ //
+ if (value.trim() == '') {
+ _this.obj.find("li").removeClass("layui-hide").attr("dtree-hide", false)
+ return
+ }
+ _this.obj.find("li").addClass("layui-hide").attr("dtree-hide", true)
+
+ var cites = []
+ var filterMode = _this.filterMode
+ /*if (filterMode == 'default') {
+ cites = _this.obj.find("li>div cite:contains('" + value + "')");
+ }*/
+ cites = _this.obj.find("li>div cite:contains('" + value + "')");
+ cites.each(function (index, cite) {
+ var li = $(cite).parent().parent();
+ var curNode = _this.getParam(li.attr("data-id"));
+ li.removeClass("layui-hide").attr("dtree-hide", false);
+ // 显示所有子级
+ li.find('ul li').removeClass("layui-hide").attr("dtree-hide", false);
+ // 显示所有父级
+ li.parents('li').removeClass("layui-hide").attr("dtree-hide", false);
+ })
+ }
+
+ /******************** 复选框区域 ********************/
+ /**
+ * @Desc: 初始化复选框的值
+ * @Param: chooseIds: 需要被选中的节点id字符串集合(用,分割)/id数组/id二维数组(多级复选框)
+ */
+ DTree.prototype.chooseDataInit = function(chooseIds){
+ var _this = this;
+ // 多级复选框二维数组
+ var chooseIdArrs = [];
+ var chooseId = [];
+ if(typeof chooseIds === "string") {
+ chooseId = chooseIds.split(",");
+ } else {
+ chooseId = chooseIds;
+ }
+ if(chooseId.length) {
+ // 说明是数组
+ for (var i=0; i."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).noCheck();
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var flag = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
+ if (flag == 0) {
+ //把父级去掉选中
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($item_i).noCheck();
+ }
+ }
+ } else {
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).check();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).check();
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ //把父级选中
+ _this.checkStatus($item_i).check();
+ }
+ }
+ };
+
+ /**
+ * @Desc: 实现复选框点击, no-all 子集选中父级半选中,子集全选父级选中
+ * @Param: $i: JQuery对象,表示当前点击的checkbox节点
+ */
+ DTree.prototype.checkAllOrNoallOrNot = function($i) {
+ var _this = this;
+ //$i 当前点击的checkbox
+ var $div = $i.closest("."+LI_DIV_ITEM),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).noCheck();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).noCheck();
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var flag = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ if (flag == 0) {
+ //把父级去掉选中
+ _this.checkStatus($item_i).noCheck();
+ } else {
+ //把父级半选
+ _this.checkStatus($item_i).noallCheck();
+ }
+ }
+ } else { //当前复选框为未选中状态,点击后变为选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).check();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).check();
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var flag1 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
+ var flag2 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']").length;
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ if (flag1 != flag2) {
+ // 父级复选框半选
+ _this.checkStatus($item_i).noallCheck();
+ } else {
+ // 父级复选框全选
+ _this.checkStatus($item_i).check();
+ }
+ }
+ }
+ };
+
+ /**
+ * @Desc: 实现复选框点击,p-casc:父级选中子集全选,子集无法改变父级选中状态
+ * @Param: $i: JQuery对象,表示当前点击的checkbox节点
+ */
+ DTree.prototype.checkAllOrPcascOrNot = function($i) {
+ var _this = this;
+ //$i 当前点击的checkbox
+ var $div = $i.closest("."+LI_DIV_ITEM),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).noCheck();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).noCheck();
+
+ } else { //当前复选框为未选中状态,点击后变为选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).check();
+
+ // 处理子级节点的选中状态
+ var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ _this.checkStatus($child_li_i).check();
+ }
+ };
+
+ /**
+ * @Desc: 实现复选框点击,self:各自选中互不影响
+ * @Param: $i: JQuery对象,表示当前点击的checkbox节点
+ */
+ DTree.prototype.checkOrNot = function($i) {
+ var _this = this;
+ //$i 当前点击的checkbox
+ var $div = $i.closest("."+LI_DIV_ITEM),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).noCheck();
+ } else { //当前复选框为未选中状态,点击后变为选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).check();
+ }
+ };
+
+ /**
+ * @Desc: 实现复选框点击,only:只能选中1个复选框
+ * @Param: $i: JQuery对象,表示当前点击的checkbox节点
+ */
+ DTree.prototype.checkOnly = function($i) {
+ var _this = this;
+ //$i 当前点击的checkbox
+ var $div = $i.closest("."+LI_DIV_ITEM),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ var checked = $i.attr("data-checked");
+ // 将全部节点全部设为未选中状态
+ var $all_i = _this.obj.find("i[data-checked]");
+ _this.checkStatus($all_i).noCheck();
+
+ if (checked != "1") { //当前复选框为未选中状态,点击后变为选中状态
+ // 处理当前节点的选中状态
+ _this.checkStatus($i).check();
+ }
+ };
+
+ /**
+ * @Desc: 实现复选框点击汇总,分派具体的点击方式
+ * @Param: $i: JQuery对象,表示当前点击的checkbox节点
+ */
+ DTree.prototype.changeCheck = function($i) {
+ var _this = this;
+ var temp = _this.temp;
+ if(typeof $i === 'undefined') {
+ $i = temp[0];
+ }
+ // 复选框选中事件
+ if (_this.checkbarType == "all") {
+ _this.checkAllOrNot($i);
+ } else if(_this.checkbarType == "no-all") {
+ _this.checkAllOrNoallOrNot($i);
+ } else if(_this.checkbarType == "p-casc") {
+ _this.checkAllOrPcascOrNot($i);
+ } else if(_this.checkbarType == "self") {
+ _this.checkOrNot($i);
+ } else if(_this.checkbarType == "only") {
+ _this.checkOnly($i);
+ } else {
+ _this.checkAllOrNot($i);
+ }
+
+ if(_this.select) {
+ // 设置复选框模式中的下拉树的值
+ _this.selectCheckboxVal();
+ }
+
+ // 获取复选框选中节点的内容
+ var checkbarNodes = _this.setAndGetCheckbarNodesParam(true);
+
+ // 用户自定义想做的事情
+ _this.checkbarFun.chooseDone(checkbarNodes);
+ layui.event.call(this, MOD_NAME, "chooseDone("+$(_this.obj)[0].id+")", {"checkbarParams": checkbarNodes});
+ _this.temp = [];
+ };
+
+ /**
+ * @Desc: 复选框半选状态初始化设置,树节点渲染完毕后重置半选状态
+ */
+ DTree.prototype.initNoAllCheck = function(){
+ var _this = this;
+ //1.获取所有选中节点
+ var $is = _this.obj.find("i[data-checked='1']");
+ if($is.length > 0){
+ for ( var key = 0; key < $is.length; key++) {
+ var $i = $($is[key]),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var flag1 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
+ var flag2 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']").length;
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ if (flag1 != flag2) {
+ // 父级复选框半选
+ _this.checkStatus($item_i).noallCheck();
+ } else {
+ // 父级复选框全选
+ _this.checkStatus($item_i).check();
+ }
+ }
+ }
+ }
+ };
+
+ /**
+ * @Desc: 复选框选中状态初始化设置,树节点渲染完毕后重置选中状态
+ */
+ DTree.prototype.initAllCheck = function(){
+ var _this = this;
+ //1.获取所有选中节点
+ var $is = _this.obj.find("i[data-checked='1']");
+ if($is.length > 0){
+ for ( var key = 0; key < $is.length; key++) {
+ var $i = $($is[key]),
+ dataPar = $i.attr("data-par"),
+ dataType = $i.attr("data-type"),
+ $li = $i.closest(dataPar), //当前checkbox的上级li节点
+ $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
+ $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
+
+ // 处理父级节点的选中状态
+ for (var i = 1, item = $parent_li; i < item.length; i++) {
+ var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
+ // 父级复选框全选
+ _this.checkStatus($item_i).check();
+ }
+ }
+ }
+ };
+
+ /**
+ * @Desc: 设置复选框选中/未选中/半选 _this.checkStatus($i).check(); _this.checkStatus($i).noCheck(); _this.checkStatus($i).noallCheck();
+ * @Param: $i: JQuery对象,表示当前点击的checkbox节点
+ */
+ DTree.prototype.checkStatus = function($i) {
+ var _this = this;
+ return {
+ check: function(){
+ $i.removeClass(_this.usefontStyle.checkbox.out);
+ $i.removeClass(_this.usefontStyle.checkbox.noall);
+ $i.addClass(_this.usefontStyle.checkbox.on);
+ $i.addClass(_this.style.chs);
+ $i.attr("data-checked","1");
+ },
+ noCheck: function(){
+ $i.removeClass(_this.usefontStyle.checkbox.noall);
+ $i.removeClass(_this.usefontStyle.checkbox.on);
+ $i.removeClass(_this.style.chs);
+ $i.addClass(_this.usefontStyle.checkbox.out);
+ $i.attr("data-checked","0");
+ },
+ noallCheck: function(){
+ $i.removeClass(_this.usefontStyle.checkbox.out);
+ $i.removeClass(_this.usefontStyle.checkbox.on);
+ $i.addClass(_this.usefontStyle.checkbox.noall);
+ $i.addClass(_this.style.chs);
+ $i.attr("data-checked","2");
+ }
+ }
+ };
+
+ /**
+ * @Desc: 设置树的复选框操作值的全部参数,并获取
+ * @Param: requestParamFlag: 设置复选框返回值的数据结构, true:基于请求类型的返回对象数组, false:原始的节点返回对象数组
+ */
+ DTree.prototype.setAndGetCheckbarNodesParam = function(requestParamFlag) {
+ var _this = this;
+ //操作前先清空
+ _this.checkbarNode = [];
+ // 选择所有复选框节点
+ if (_this.checkbarData == "change"){ //记录变更数据
+ _this.obj.find("i[data-par][dtree-disabled='false']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+ if ($i.attr("data-checked") != $i.attr("data-initchecked")) {
+ if(requestParamFlag) {
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ } else {
+ _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i));
+ }
+ }
+ });
+ } else if (_this.checkbarData == "all"){ //记录全部数据
+ _this.obj.find("i[data-par][data-checked][dtree-disabled='false']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+ if(requestParamFlag) {
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ } else {
+ _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i));
+ }
+ });
+ } else if (_this.checkbarData == "choose"){ //记录选中数据
+ _this.obj.find("i[data-par][data-checked='1'][dtree-disabled='false']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+ if(requestParamFlag) {
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ } else {
+ _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i));
+ }
+ });
+ } else if (_this.checkbarData == "halfChoose"){ //记录选中和半选数据
+ _this.obj.find("i[data-par][data-checked='1'][dtree-disabled='false']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+ if(requestParamFlag) {
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ } else {
+ _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i));
+ }
+ });
+ _this.obj.find("i[data-par][data-checked='2'][dtree-disabled='false']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+ if(requestParamFlag) {
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ } else {
+ _this.checkbarNode.push(_this.getCheckbarNodeParam($div, $i));
+ }
+ });
+ }
+ return _this.checkbarNode;
+ };
+
+ /**
+ * @Desc: 获取树的复选框操作值的全部参数
+ */
+ DTree.prototype.getCheckbarNodesParam = function() {
+ var _this = this;
+ return _this.setAndGetCheckbarNodesParam(true);
+ };
+
+ /**
+ * @Desc: 获取树的一个复选框的参数
+ * @Param: $div: JQuery对象,表示当前选中节点
+ * @Param: $i: JQuery对象,表示当前选中的复选框节点
+ */
+ DTree.prototype.getCheckbarNodeParam = function($div, $i){
+ var _this = this;
+ var temp_node = {};
+ temp_node.nodeId = $div.attr("data-id");
+ temp_node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid");
+ temp_node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text();
+ temp_node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false;
+ temp_node.level = _this.getNodeDom($div).parentLi().attr("data-index");
+ temp_node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false;
+
+ var basicData = $div.attr("data-basic");
+ if(basicData) {
+ basicData = JSON.parse(event.unescape(basicData));
+ }
+ temp_node.basicData = basicData;
+ var recordData = $div.attr("data-record");
+ if(recordData) {
+ recordData = JSON.parse(event.unescape(recordData));
+ }
+ temp_node.recordData = recordData;
+
+ temp_node.dataType = $i.attr("data-type");
+ temp_node.checked = $i.attr("data-checked");
+ temp_node.initchecked = $i.attr("data-initchecked");
+ return temp_node;
+ };
+
+ /**
+ * @Desc: 获取基于返回参数的树的复选框参数,选中数据横向存储
+ */
+ DTree.prototype.getCheckbarJsonArrParam = function(){
+ var _this = this;
+ var checkbarJsonArr = {
+ nodeId: [], //节点ID
+ parentId: [], //父节点ID
+ context: [], //节点内容
+ leaf: [], //是否叶子节点
+ level: [], //层级
+ spread: [], //节点展开状态
+ dataType: [], //节点标记
+ checked: [], //节点复选框选中状态
+ initchecked: [], //节点复选框初始状态
+ basicData: [], //用户自定义的记录节点数据
+ recordData: [], //当前data数据(排除basicData和children字段)
+ };
+ // 获取全部复选框选中节点
+ var params = _this.setAndGetCheckbarNodesParam(false);
+ if(params && params.length > 0) {
+ for(var i=0; i 0) { _this.checkStatus($i).check(); }
+ }
+
+ /**
+ * @Desc: 取消全部复选框选中
+ */
+ DTree.prototype.cancelCheckedNode = function(){
+ var _this = this;
+ var $i = _this.obj.find("i[data-par][data-checked!='0']");
+ if($i.length > 0) { _this.checkStatus($i).noCheck(); }
+ }
+
+ /**
+ * @Desc: 反选复选框
+ */
+ DTree.prototype.invertCheckedNode = function(){
+ var _this = this;
+ if(_this.obj.find("i[data-par]").length > 0) {
+ var flag = false;
+ _this.obj.find("i[data-par]").each(function(){
+ var $i = $(this);
+ if($i.attr("data-checked") == '2'){
+ flag = true;
+ }else if($i.attr("data-checked") == '0') {
+ _this.checkStatus($i).check();
+ }else if($i.attr("data-checked") == '1') {
+ _this.checkStatus($i).noCheck();
+ }
+ });
+
+ if(flag) {
+ _this.initNoAllCheck();
+ } else {
+ _this.initAllCheck();
+ }
+ }
+ }
+
+ /**
+ * @Desc: 删除选中节点
+ */
+ DTree.prototype.removeCheckedNode = function(){
+ var _this = this;
+ var len = _this.obj.find("i[data-par][data-checked='1']").length;
+ if(len == 0){
+ layer.msg("请至少选中一个节点",{icon:2});
+ }else{
+ //操作前先清空
+ _this.checkbarNode = [];
+ // 选择所有复选框节点
+ var i_node = {};
+ _this.obj.find("i[data-par][data-checked='1']").each(function(){
+ var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
+
+ _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
+ });
+
+ layer.confirm('确定要删除选中节点?', {icon: 3, title:'删除选中节点'}, function(index1){
+ var flag = _this.menubarFun.remove(_this.checkbarNode);
+ if(flag){
+ _this.obj.find("i[data-par][data-checked='1']").closest("."+LI_DIV_ITEM).next("ul").remove();
+ _this.obj.find("i[data-par][data-checked='1']").closest("."+LI_DIV_ITEM).remove();
+ _this.checkbarNode=[];
+ }
+
+ layer.close(index1);
+ });
+ }
+ }
+
+ /******************** 工具栏及菜单栏区域 ********************/
+ /**
+ * @Desc: 初始化菜单栏和工具栏的div
+ */
+ DTree.prototype.initTreePlus = function(){
+ var _this = this;
+ // 初始化菜单栏和工具栏的div
+ _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).remove();
+ _this.toolbarMenu = {};
+ if(_this.menubar && _this.menubarTips.group && _this.menubarTips.group.length > 0) _this.obj.before("");
+ if(_this.toolbar){
+ if(_this.toolbarWay == "contextmenu") {
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).remove();
+ _this.obj.before("");
+ }
+ }
+
+ };
+
+ /**
+ * @Desc: 开启工具栏和菜单栏
+ */
+ DTree.prototype.openTreePlus = function(){
+ var _this = this;
+ // 先对工具栏做处理,因为菜单栏可能会与工具栏产生关联。
+ var ggMenu = [];
+ if(_this.toolbar) _this.getToolbarDom();
+
+ if(_this.menubar) {
+ var menubarTips = _this.menubarTips,
+ mtbar = menubarTips.toolbar,
+ group = menubarTips.group,
+ freedom = menubarTips.freedom;
+ if(mtbar && mtbar.length > 0){
+ // 菜单栏吸附工具栏上
+ for(var i=0; i 0){
+ // 菜单栏吸附在上方的按钮组div中
+ for(var i=0; i";
+ break;
+ case defaultMenu.moveUp:
+ gg = "";
+ break;
+ case defaultMenu.refresh:
+ gg = "";
+ break;
+ case defaultMenu.checkAll:
+ gg = (_this.checkbar && _this.checkbarType != 'only') ? "" : "";
+ break;
+ case defaultMenu.unCheckAll:
+ gg = (_this.checkbar && _this.checkbarType != 'only') ? "" : "";
+ break;
+ case defaultMenu.invertAll:
+ gg = (_this.checkbar && _this.checkbarType != 'only') ? "" : "";
+ break;
+ case defaultMenu.remove:
+ gg = (_this.checkbar) ? "" : "";
+ break;
+ case defaultMenu.searchNode:
+ gg = "";
+ break;
+ }
+ return gg;
+ };
+
+ /**
+ * @Desc: 获取扩展菜单栏
+ * @Param: menu: 扩展菜单栏的Json对象
+ */
+ DTree.prototype.getExtMenubarDom = function(menu){
+ var _this = this;
+ return "";
+ };
+
+ /**
+ * @Desc: 获取依附在工具栏的菜单栏
+ * @Param: menu: 菜单栏的具体操作字符串
+ */
+ DTree.prototype.getMenubarToolDom = function(menu){
+ var _this = this;
+ var rootId = _this.obj[0].id;
+ switch (menu) {
+ case defaultMenu.moveDown:
+ _this.toolbarMenu[defaultMenu.moveDown] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.moveDown, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.movedown, "展开全部");
+ break;
+ case defaultMenu.moveUp:
+ _this.toolbarMenu[defaultMenu.moveUp] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.moveUp, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.moveup, "收缩全部");
+ break;
+ case defaultMenu.refresh:
+ _this.toolbarMenu[defaultMenu.refresh] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.refresh, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.refresh, "刷新");
+ break;
+ case defaultMenu.checkAll:
+ if(_this.checkbar && _this.checkbarType != 'only')
+ _this.toolbarMenu[defaultMenu.checkAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.checkAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.checkAll, "全选节点");
+ break;
+ case defaultMenu.unCheckAll:
+ if(_this.checkbar && _this.checkbarType != 'only')
+ _this.toolbarMenu[defaultMenu.unCheckAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.unCheckAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.unCheckAll, "全不选节点");
+ break;
+ case defaultMenu.invertAll:
+ if(_this.checkbar && _this.checkbarType != 'only')
+ _this.toolbarMenu[defaultMenu.invertAll] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.invertAll, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.invertAll, "反选节点");
+ break;
+ case defaultMenu.remove:
+ if(_this.checkbar)
+ _this.toolbarMenu[defaultMenu.remove] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.remove, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.remove, "删除选中");
+ break;
+ case defaultMenu.searchNode:
+ _this.toolbarMenu[defaultMenu.searchNode] = _this.setToolbarDom().setMenuToolbarOption(defaultMenu.searchNode, _this.toolbarStyle.title, _this.usefontStyle.toolbar.menubar.searchNode, "查询");
+ break;
+ }
+ };
+
+ /**
+ * @Desc: 获取依附在工具栏的扩展菜单栏
+ * @Param: menu: 扩展菜单栏的Json对象
+ */
+ DTree.prototype.getExtMenubarToolDom = function(menu){
+ var _this = this;
+ _this.toolbarMenu[menu.menubarId] = _this.setToolbarDom().setMenuToolbarOption(menu.menubarId, menu.title, _this.usefontStyle.toolbar.menubarExt+" "+menu.icon, "");
+ };
+
+ /**
+ * @Desc: menubar内置方法
+ */
+ DTree.prototype.menubarMethod = function(){
+ var _this = this;
+ return {
+ openAllNode: function(obj){ // 展开所有节点
+ var $ulNode = obj || _this.obj.children("li").children("ul");
+ // 遍历所有ul子节点
+ for (var i = 0; i < $ulNode.length; i++) {
+ // 获取当前节点的信息
+ var $ul = $($ulNode[i]),
+ $div = $ul.prev("div"),
+ $i_fnode = _this.getNodeDom($div).fnode(),
+ $i_snode = _this.getNodeDom($div).snode(),
+ $cite = _this.getNodeDom($div).cite(),
+ spread = $i_fnode.attr("data-spread"),
+ leaf = $cite.attr("data-leaf");
+
+ if (leaf == "leaf") { continue; } // 说明是叶子了,则继续循环下一个
+
+ if (spread == "open") {
+ // 说明该节点已经展开了,则进行子节点循环
+ } else {
+ if (_this.type=="load") { //是否全量加载
+ if (_this.cache) { //是否开启缓存
+ if ($ul.html()) {
+ $ul.addClass(NAV_SHOW);
+ } else { //加载节点
+ _this.getChild($div);
+ }
+ }else { //每次取新的数据
+ $ul.html("");
+ _this.getChild($div);
+ }
+ } else { // 全量加载
+ $ul.addClass(NAV_SHOW);
+ }
+ _this.operateIcon($i_fnode, $i_snode).open();
+
+ }
+ var $childUl = $ul.children("li").children("ul");
+ _this.menubarMethod().openAllNode($childUl);
+ }
+ },
+ closeAllNode: function(){ //收缩所有节点
+ _this.obj.find("."+LI_NAV_CHILD).each(function(){
+ // 获取当前节点的信息
+ var $ul = $(this),
+ $div = $ul.prev("div"),
+ $i_fnode = _this.getNodeDom($div).fnode(),
+ $i_snode = _this.getNodeDom($div).snode(),
+ $cite = _this.getNodeDom($div).cite(),
+ spread = $i_fnode.attr("data-spread"),
+ leaf = $cite.attr("data-leaf");
+
+ $ul.removeClass(NAV_SHOW);
+ _this.operateIcon($i_fnode, $i_snode).close();
+ });
+ },
+ refreshTree: function(){// 刷新树
+ _this.refreshTree();
+ },
+ checkAll: function(){ // 全选节点
+ _this.checkAllNode();
+ },
+ unCheckAll: function(){ // 全不选节点
+ _this.cancelCheckedNode();
+ },
+ invertAll: function(){ // 反选节点
+ _this.invertCheckedNode();
+ },
+ remove: function(){// 删除选中节点
+ _this.removeCheckedNode();
+ },
+ searchNode: function(){//模糊查询该值,展开该值节点
+ layer.prompt({
+ formType: 0,
+ value: "",
+ title: '查询节点'
+ }, function(value, index1, elem){
+ if (value) {
+ var flag = _this.searchNode(value);
+ if (!flag) {
+ layer.msg("该名称节点不存在!", {icon:5});
+ }
+ } else {
+ layer.msg("未指定查询节点名称", {icon:5});
+ }
+ layer.close(index1);
+ });
+ },
+ extMethod: function(menuId, $div, flag){
+ if(_this.menubar && _this.menubarTips.group && _this.menubarTips.group.length > 0 && flag == "group"){
+ for(var i=0; i<_this.menubarTips.group.length; i++){
+ var ext = _this.menubarTips.group[i];
+ if (menuId == ext.menubarId){
+ ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div));
+ break;
+ }
+ }
+ }
+ if(_this.menubar && _this.menubarTips.toolbar && _this.menubarTips.toolbar.length > 0 && flag == "toolbar"){
+ for(var i=0; i<_this.menubarTips.toolbar.length; i++){
+ var ext = _this.menubarTips.toolbar[i];
+ if (menuId == ext.menubarId){
+ ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div));
+ break;
+ }
+ }
+ }
+ if(_this.menubar && _this.menubarTips.freedom && _this.menubarTips.freedom.length > 0 && flag == "freedom"){
+ for(var i=0; i<_this.menubarTips.freedom.length; i++){
+ var ext = _this.menubarTips.freedom[i];
+ if (menuId == ext.menubarId){
+ ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div));
+ break;
+ }
+ }
+ }
+ }
+ };
+ };
+
+ /**
+ * @Desc: menubar监听方法
+ * @Param: menuId:菜单栏的具体操作字符串
+ * @Param: flag:菜单栏的显示方式
+ */
+ DTree.prototype.menubarListener = function(menuId, flag){
+ var _this = this;
+ var $div = _this.getNodeDom().nowDiv();
+ switch (menuId) {
+ case defaultMenu.moveDown: // 展开全部节点
+ _this.menubarMethod().openAllNode();
+ break;
+ case defaultMenu.moveUp: // 收缩全部节点
+ _this.menubarMethod().closeAllNode();
+ break;
+ case defaultMenu.refresh:
+ _this.menubarMethod().refreshTree(); // 刷新树
+ break;
+ case defaultMenu.checkAll:
+ _this.menubarMethod().checkAll();
+ break;
+ case defaultMenu.unCheckAll:
+ _this.menubarMethod().unCheckAll();
+ break;
+ case defaultMenu.invertAll:
+ _this.menubarMethod().invertAll();
+ break;
+ case defaultMenu.remove:
+ _this.menubarMethod().remove();
+ break;
+ case defaultMenu.searchNode:
+ _this.menubarMethod().searchNode();
+ break;
+ default:
+ _this.menubarMethod().extMethod(menuId, $div, flag);
+ break;
+ }
+ };
+
+ /**
+ * @Desc: 模糊查询该值,展开该值节点
+ * @Param: value: 模糊查询的值
+ */
+ DTree.prototype.searchNode = function(value){
+ var _this = this;
+ var b = false;
+ var $lis = [];
+ _this.obj.find("cite[data-leaf]").each(function(){
+ var $nthis = $(this);
+ var html = $nthis.html();
+ if(html.indexOf(value) > -1){
+ if($nthis.attr("data-leaf") == "leaf") {
+ // 叶子节点提供包含父节点的所有信息
+ var title = "";
+ $nthis.parents("li").each(function(){
+ title = "-" + $(this).find("cite[data-leaf]").html() + title;
+ });
+ title = title.substring(1, title.length);
+ $nthis.attr("title", title);
+ }
+ // 保存当前cite所在的li及父li中包含该值,则只保留父的
+ var i = 0;
+ $nthis.parents("li").each(function(){
+ var html2 = $(this).find("cite[data-leaf]").html();
+ if(html2.indexOf(value) > -1){
+ i++;
+ }
+ if(i >= 2){
+ return true;
+ }
+ });
+ if (i < 2){
+ $lis.push($nthis.closest("li").prop("outerHTML"));
+ }
+ }
+ });
+ if($lis.length > 0) {
+ b = true;
+ // 1.将树节点清空
+ _this.obj.html("");
+ // 2.遍历所有cite节点,展开当前cite节点
+ for(var i=0; i<$lis.length; i++){
+ _this.obj.append($lis[i]);
+ }
+ }
+ return b;
+ };
+
+
+ /******************** 工具栏区域 ********************/
+ /**
+ * @Desc: 获取工具栏
+ */
+ DTree.prototype.getToolbarDom = function(){
+ var _this = this;
+ var toolbarShow = _this.toolbarShow,
+ toolbarExt = _this.toolbarExt,
+ toolbarWay = _this.toolbarWay;
+
+ if(toolbarShow.length > 0){
+ for(var i=0; i 0){
+ for(var i=0; i "+other +title+"";
+ } else if(toolbarWay == "fixed" || toolbarWay == "follow") {
+ return "";
+ }
+ },
+ setMenuToolbarOption: function(menubarId, title, classId, other){
+ var rootId = _this.obj[0].id;
+ if(toolbarWay == "contextmenu") {
+ return " "+other +title+"";
+ } else if(toolbarWay == "fixed" || toolbarWay == "follow") {
+ return "";
+ }
+ },
+ setToolbarPlace: function(toolbarMenu){
+ if(toolbarWay == "contextmenu") {
+ if(toolbarMenu){
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).find('div.layui-nav-item>dl.layui-nav-child').html("");
+ for(var key in toolbarMenu){
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).find('div.layui-nav-item>dl.layui-nav-child').append(toolbarMenu[key]);
+ }
+ }
+ } else if(toolbarWay == "fixed" || toolbarWay == "follow") {
+ _this.obj.find("cite[data-leaf][dtree-disabled='false']").each(function(){
+ var $cite = $(this);
+ _this.dynamicToolbarDom($cite);
+ });
+ }
+ }
+ }
+ };
+
+ /**
+ * @Desc: 在节点后动态绑定fixed和follow条件的工具栏
+ * @Param: $cite: JQuery对象,表示当前文本节点
+ */
+ DTree.prototype.dynamicToolbarDom = function($cite){
+ var _this = this;
+ var toolbarWay = _this.toolbarWay;
+ if($cite.next("em."+TOOLBAR_TOOL_EM).length == 0) {
+ var $div = $cite.parent("div");
+ var param = _this.getRequestParam(_this.getTempNodeParam($div));
+ var toolbarMenus = _this.toolbarFun.loadToolbarBefore(event.cloneObj(_this.toolbarMenu), param, $div);
+ var hideCls = (toolbarWay == "follow") ? NAV_HIDE : "";
+ var em = [""];
+ if(toolbarMenus){
+ for(var key in toolbarMenus){
+ em.push(toolbarMenus[key]);
+ }
+ }
+ em.push("");
+ $cite.after(em.join(''));
+ }
+ }
+
+ /**
+ * @Desc: 隐藏toolbar
+ */
+ DTree.prototype.toolbarHide = function() {
+ var _this = this;
+ if(_this.toolbar && _this.toolbarWay == "contextmenu") {
+ var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
+ $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
+ }
+ }
+
+ /**
+ * @Desc: toolbar内置方法
+ */
+ DTree.prototype.toolbarMethod = function(){
+ var _this = this;
+ return {
+ pulldown: function(obj){ // 展开当前点击节点的下面全部节点
+ if(!obj) return;
+ var $ulNode = obj;
+ // 遍历所有ul子节点
+ for (var i = 0; i < $ulNode.length; i++) {
+ // 获取当前节点的信息
+ var $ul = $($ulNode[i]),
+ $div = $ul.prev("div"),
+ $i_fnode = _this.getNodeDom($div).fnode(),
+ $i_snode = _this.getNodeDom($div).snode(),
+ $cite = _this.getNodeDom($div).cite(),
+ spread = $i_fnode.attr("data-spread"),
+ leaf = $cite.attr("data-leaf");
+
+ if (leaf == "leaf") { continue; } // 说明是叶子了,则继续循环下一个
+
+ if (spread == "open") {
+ // 说明该节点已经展开了,则进行子节点循环
+ } else {
+ if (_this.type=="load") { //是否全量加载
+ if (_this.cache) { //是否开启缓存
+ if ($ul.html()) {
+ $ul.addClass(NAV_SHOW);
+ } else { //加载节点
+ _this.getChild($div);
+ }
+ }else { //每次取新的数据
+ $ul.html("");
+ _this.getChild($div);
+ }
+ } else { // 全量加载
+ $ul.addClass(NAV_SHOW);
+ }
+ _this.operateIcon($i_fnode, $i_snode).open();
+
+ }
+ var $childUl = $ul.children("li").children("ul");
+ _this.toolbarMethod().pulldown($childUl);
+ }
+ },
+ pullup: function($li){ // 收缩当前点击节点的下面全部节点
+ $li.find("."+LI_NAV_CHILD).each(function(){
+ // 获取当前节点的信息
+ var $ul = $(this),
+ $div = $ul.prev("div"),
+ $i_fnode = _this.getNodeDom($div).fnode(),
+ $i_snode = _this.getNodeDom($div).snode(),
+ $cite = _this.getNodeDom($div).cite(),
+ spread = $i_fnode.attr("data-spread"),
+ leaf = $cite.attr("data-leaf");
+
+ $ul.removeClass(NAV_SHOW);
+ _this.operateIcon($i_fnode, $i_snode).close();
+ });
+ }
+ }
+ };
+
+ /**
+ * @Desc: toolbar监听方法
+ * @Param: tool: 工具栏的具体操作字符串
+ * @Param: $div: JQuery对象,表示当前操作节点
+ */
+ DTree.prototype.toolbarListener = function(tool, $div) {
+ var _this = this;
+ var $cite = $div.children("cite[data-leaf]"),
+ $ul = $div.next("ul"),
+ $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点
+ $p_ul = $p_li.parent("ul"), //当前选中节点的顶级li节点的父级ul
+ $p_div = $p_ul.prev("div"), //当前选中节点的顶级li节点的父级ul的前一个div
+ title = (typeof _this.formatter.title === 'function') ? $cite.attr("data-title") : $cite.text();
+
+ switch (tool) {
+ case defaultTool.pulldown:
+ _this.toolbarMethod().pulldown($ul);
+ break;
+ case defaultTool.pullup:
+ _this.toolbarMethod().pullup($p_li);
+ break;
+ case defaultTool.addTool:
+ var content = _this.loadToolBar(title, defaultTool.addTool);
+
+ layer.open({
+ title: "新增"+_this.toolbarStyle.title,
+ type: 1,
+ area: _this.toolbarStyle.area,
+ content: content,
+ success: function(layero, index){
+ form.render();
+ form.on("submit(dtree_addNode_" + _this.obj[0].id + "_form)",function(data){
+ var data = data.field;
+ var parentId = $div.attr("data-id"),
+ id = $div.attr("data-id")+"_node_"+$ul[0].childNodes.length,
+ leaf = true,
+ checked = "0",
+ level = parseInt($p_li.attr("data-index"))+1;
+
+ var type = _this.response.type;
+ var checked = _this.response.checked;
+ // 创建子节点的DOM,添加子节点
+ var checkArr = [];
+ if (_this.checkArrLen > 0) {
+ for (var i = 0; i < _this.checkArrLen; i++) {
+ checkArr.push({type: i, checked: "0"});
+ }
+ }
+
+ $ul.append(_this.getLiItemDom(id, parentId, data.addNodeName, data.addNodeName, true, "", "", checkArr, level, false, false, false, "", "", "item"));
+ // 先将li节点隐藏
+ $ul.find("li[data-id='"+id+"']").hide();
+ // 重新赋值
+ var $addDiv = $ul.find("div[data-id='"+id+"']");
+ node = _this.getNodeParam($addDiv);
+
+ //获取组装后的requestNode,组合参数
+ var requestNode = _this.getRequestParam(node);
+ requestNode = $.extend(requestNode, data);
+
+ _this.temp = [id, $ul, $div, level];
+ // 用户自定义想做的事情
+ _this.toolbarFun.addTreeNode(requestNode, $div);
+
+ layer.close(index);
+ return false;
+ });
+ }
+ });
+ break;
+ case defaultTool.editTool:
+ var content = _this.loadToolBar(title, defaultTool.editTool);
+
+ layer.open({
+ title: "编辑"+_this.toolbarStyle.title,
+ type: 1,
+ area: _this.toolbarStyle.area,
+ content: content,
+ success: function(layero, index){
+ _this.toolbarFun.editTreeLoad(_this.getRequestParam(_this.getNodeParam($div)));
+ form.render();
+ form.on("submit(dtree_editNode_form)",function(data){
+ var data = data.field;
+ $cite.html(data.editNodeName);
+ node = _this.getNodeParam($div);
+ var requestNode = _this.getRequestParam(node);
+ requestNode = $.extend(requestNode, data);
+ _this.temp = [$cite, $div, title, $p_div];
+ _this.toolbarFun.editTreeNode(requestNode, $div);
+
+ layer.close(index);
+ });
+ }
+ });
+ break;
+ case defaultTool.delTool:
+ layer.confirm('确定要删除该'+_this.toolbarStyle.title+'?', {icon: 3, title:'删除'+_this.toolbarStyle.title}, function(index){
+ var node = _this.getNodeParam($div);
+ _this.temp = [$p_li, $p_div];
+ _this.toolbarFun.delTreeNode(_this.getRequestParam(_this.getNodeParam($div)), $div);
+
+ layer.close(index);
+ });
+ break;
+ default:
+ if(_this.toolbarExt.length > 0){
+ for(var i=0; i<_this.toolbarExt.length; i++){
+ var ext = _this.toolbarExt[i];
+ if (tool == ext.toolbarId){
+ ext.handler(_this.getRequestParam(_this.getNodeParam($div)), $div);
+ break;
+ }
+ }
+ }
+ break;
+ }
+ }
+
+
+ /**
+ * @Desc: 加载toolbar中的内容
+ * @Param: title: 默认操作中的input输入框的值
+ * @Param: name: 工具栏的具体操作字符串
+ */
+ DTree.prototype.loadToolBar = function(title, name){
+ var _this = this;
+ var toolbarShow = _this.toolbarShow;
+ var nodeBarContents = _this.toolbarBtn;
+
+ var html = "";
+ switch (name) {
+ case defaultTool.addTool:
+ var addNodeBarDef = [{"label": "当前选中", "name": "nodeTitle", "type": "text", "value": title, "defElem": "nowChoose", "readonly": true},
+ {"label": "新增"+_this.toolbarStyle.title, "name": "addNodeName", "type": "text", "value": "", "defElem": "nowChange", "verify": "required"},
+ {"type": "submit", "value": "确认添加", "defElem": "btn", "filter": "dtree_addNode_" + _this.obj[0].id + "_form"}];
+
+ //2. 用户自定义的节点内容
+ var addNodeBar = ['');
+ html = addNodeBar.join('');
+ break;
+
+ case defaultTool.editTool:
+ var editNodeBarDef = [{"label": "当前选中", "name": "nodeTitle", "type": "text", "value": title, "defElem": "nowChoose", "readonly": true},
+ {"label": "编辑"+_this.toolbarStyle.title, "name": "editNodeName", "type": "text", "value": "", "defElem": "nowChange", "verify": "required"},
+ {"type": "submit", "value": "确认编辑", "defElem": "btn", "filter": "dtree_editNode_" + _this.obj[0].id + "_form"}];
+
+ var editNodeBar = ['');
+ html = editNodeBar.join('');
+ break;
+ }
+ return html;
+ };
+
+ /**
+ * @Desc: 获取toolbar详细的标签信息
+ * @Param: nodeBarContents: 工具栏中的数据渲染内容JSON对象
+ */
+ DTree.prototype.loadToolBarDetail = function(nodeBarContents){
+ var _this = this;
+ var readonly = (typeof (nodeBarContents.readonly) === "boolean") ? nodeBarContents.readonly : false;
+ var disabled = (typeof (nodeBarContents.disabled) === "boolean") ? nodeBarContents.disabled : false;
+ var id = nodeBarContents.id ? nodeBarContents.id : "";
+ var name = nodeBarContents.name ? nodeBarContents.name : "";
+ var val = nodeBarContents.value ? nodeBarContents.value : "";
+ var verify = nodeBarContents.verify ? nodeBarContents.verify : "";
+ var placeholder = nodeBarContents.placeholder ? nodeBarContents.placeholder : val;
+ return{
+ text: function(){
+ return [''].join('');
+ },
+ textarea: function(){
+ return ['',
+ '
',
+ '
',
+ '',
+ '
',
+ '
'].join('');
+ },
+ hidden: function(){
+ return [''].join('');
+ },
+ select: function(){
+ var optionsData = (typeof nodeBarContents.optionsData === 'object') ? nodeBarContents.optionsData : nodeBarContents.optionsData();
+ var options = "";
+ for(var key in optionsData){
+ if(val == optionsData[key]){
+ options += "";
+ } else {
+ options += "";
+ }
+ }
+ return [''].join('');
+ },
+ submit: function(){
+ var filter = nodeBarContents.filter;
+ return [''].join('');
+ },
+ button: function(){
+ return [''].join('');
+ },
+ reset: function(){
+ return [''].join('');
+ }
+ }
+ };
+
+ /**
+ * @Desc: 新增节点后改变节点内容
+ * @Param: returnID: 当前需要加载的内容,JSON对象、字符串、指定字符串("refresh")、true
+ */
+ DTree.prototype.changeTreeNodeAdd = function(returnID){
+ var _this = this;
+ var temp = _this.temp;
+ var id = temp[0], $ul = temp[1], $div = temp[2], level = temp[3];
+ var flag = false;
+ if(returnID){
+ var $thisDiv = _this.obj.find("[data-id='"+id+"']");
+ if(typeof returnID === "object"){
+ // 如果是JSON格式数据,则将当前DIV删除,重新建造DIV
+ $thisDiv.remove();
+ var parseData = _this.parseData(returnID);
+
+ if(parseData.treeId()){
+ $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.fmtTitle(), parseData.last(0), parseData.ficonClass(), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(), parseData.disabled(), parseData.hide(), parseData.basicData(), parseData.recordData(), "item"));
+
+ // 建造完毕后,选中该DIV
+ $thisDiv = $ul.find("div[data-id='"+parseData.treeId()+"']");
+ _this.setNodeParam($thisDiv)
+ } else {
+ layer.msg("添加失败,节点ID为undefined!",{icon:5});
+ // 将li节点删除
+ $ul.find("li[data-id='"+id+"']").remove();
+ // 重新赋值
+ _this.setNodeParam($div);
+ // 临时变量制空
+ _this.temp = [];
+ return ;
+ }
+ }else if(returnID == 'refresh' || returnID == true){
+ // 如果是设置为refresh参数,则向后台发送请求,获取新增节点下的真实参数,局部刷新树。
+ flag = true;
+ } else if(typeof returnID === "string" || typeof returnID === 'number'){
+ $thisDiv.attr("data-id", returnID);
+ // 将li节点展示
+ $ul.find("li[data-id='"+returnID+"']").show();
+ _this.setNodeParam($thisDiv)
+ }
+
+ // 判断当前点击的节点是否是最后一级节点,如果是,则需要修改节点的样式
+ var $icon_i = $div.find("i[data-spread]");
+ if ($icon_i.eq(0).attr("data-spread") == "last") {
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).openWithLeaf();
+ } else { //如果不是,也要修改节点样式
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).open();
+ }
+ $ul.addClass(NAV_SHOW); //展开UL
+ _this.accordionUL($ul);
+ if(flag) {
+ _this.getChild($div);
+ } else {
+ // _this.showLine();
+ _this.showLine($ul.find("li"));
+ // 这种情况下需要在新增节点后对节点新增工具栏
+ if(_this.toolbar && _this.toolbarWay != 'contextmenu') {
+ _this.dynamicToolbarDom($thisDiv.find("cite[data-leaf]"));
+ }
+ }
+
+ } else {
+ // 将li节点删除
+ $ul.find("li[data-id='"+id+"']").remove();
+ // 重新赋值
+ _this.setNodeParam($div);
+ }
+
+ _this.temp = []; // 临时变量制空
+
+ };
+
+ /**
+ * @Desc: 编辑页打开后显示编辑页内容
+ * @Param: param: 编辑页打开之后回显的数据集
+ */
+ DTree.prototype.changeTreeNodeDone = function(param){
+ var _this = this;
+ form.val('dtree_editNode_' + _this.obj[0].id + '_form', param);
+ form.render();
+ };
+
+ /**
+ * @Desc: 修改节点后改变节点内容
+ * @Param: returnID: 当前需要变更的内容,JSON对象
+ */
+ DTree.prototype.changeTreeNodeEdit = function(returnID){
+ var _this = this;
+ var temp = _this.temp;
+ var $cite = temp[0], $div = temp[1], title = temp[2], $p_div = temp[3];
+ var flag = false;
+ if(returnID){
+ if(typeof returnID === "object"){
+ var parseData = _this.parseData(data);
+
+ if(parseData.treeId()){
+ var replaceDom = _this.replaceDom($div, parseData.treeId(), parseData.last(0), parseData.spread(), parseData.disabled(), parseData.hide());
+ replaceDom.node(parseData.iconClass());
+ replaceDom.checkbox(parseData.checkArr());
+ replaceDom.text(parseData.title());
+ replaceDom.ul();
+ replaceDom.basicData(parseData.basicData());
+ replaceDom.recordData(parseData.recordData());
+ _this.setNodeParam($div);
+ } else {
+ layer.msg("编辑失败,节点ID为undefined!",{icon:5});
+ // 重新赋值
+ _this.setNodeParam($div);
+ }
+ }
+ } else {
+ $cite.html(title);
+ _this.getNodeParam($div);
+ }
+
+ _this.temp = []; // 临时变量制空
+ };
+
+ /**
+ * @Desc: 删除节点后改变节点内容
+ * @Param: flag: 是否要删除节点
+ */
+ DTree.prototype.changeTreeNodeDel = function(flag){
+ var _this = this;
+ var temp = _this.temp;
+ var $p_li = temp[0],
+ $p_ul = $p_li.parent("ul"),
+ $p_div = temp[1];
+
+ if(flag){
+ $p_li.remove();
+ _this.showLine($p_ul.find("li"));
+ // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式
+ if($p_ul.children("li").length == 0){
+ var $icon_i = $p_div.find("i[data-spread]");
+ _this.operateIcon($icon_i.eq(0), $icon_i.eq(1)).closeWithLeaf();
+ }
+ _this.initNodeParam();
+ }
+
+ _this.temp = []; // 临时变量制空
+ };
+
+ /******************** iframe区域 ********************/
+ /**
+ * @Desc: 加载iframe
+ * @Param: $div: JQuery对象,表示当前节点
+ * @Param: iframeParam: iframe加载的参数
+ */
+ DTree.prototype.loadIframe = function($div, iframeParam) {
+ var _this = this;
+ var $cite = _this.getNodeDom($div).cite();
+ if (!_this.useIframe) { // 启用iframe
+ return false;
+ }
+ var iframeElem = _this.iframeElem,
+ iframeUrl = _this.iframeUrl,
+ iframeLoad = _this.iframeLoad;
+
+ var flag = iframeLoad == "leaf" ? (($cite.attr("data-leaf") == "leaf") ? true : false) : true;
+
+ if (flag) {
+ if ($(iframeElem).length > 0) { //iframe存在
+ if (!iframeUrl) {
+ layer.msg("数据请求异常,iframeUrl参数未指定", {icon:5});
+ return false;
+ }
+ var param = AjaxHelper.serialize("?", iframeParam);
+ if(iframeUrl.indexOf("?")> -1){
+ param = "&"+param.substring(1, param.length);
+ }
+ var url = iframeUrl + param;
+ $(iframeElem).attr("src", url);
+ } else {
+ layer.msg("iframe绑定异常,请确认页面中是否有iframe页对应的容器", {icon:5});
+ return false;
+ }
+ }
+ return flag;
+ };
+
+ /**
+ * @Desc: 获取传递出去的参数,根据iframe.iframeDefaultRequest、iframe.iframeRequest和node拼出发出请求的参数
+ * @Param: nodes: 需要传递出去的参数
+ */
+ DTree.prototype.getIframeRequestParam = function(nodes){
+ var _this = this;
+ var request = _this.iframeRequest,
+ defaultRequestNames = _this.iframeDefaultRequest,
+ node = nodes || _this.node,
+ requestParam = {};
+
+ // 先拼用户自定义的,在拼树生成的,这样的话用户可以自定义当树未生成时的节点的初始值
+ for ( var key in request) {
+ requestParam[key] = request[key];
+ }
+ for ( var key in defaultRequestNames) {
+ var paramName = defaultRequestNames[key];
+ var paramValue = node[key];
+ if(typeof paramValue === "boolean"){
+ requestParam[paramName] = paramValue;
+ }else {
+ if(paramValue){
+ requestParam[paramName] = paramValue;
+ }
+ }
+ }
+
+ // 解决传递中文的乱码问题
+ var reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/; //正则匹配中文
+ for(var key in requestParam){
+ if(reg.test(requestParam[key])) {
+ var str = requestParam[key];
+ requestParam[key] = encodeURI(encodeURI(str));
+ }
+ }
+
+ return requestParam;
+ };
+
+ /******************** 数据回调区域 ********************/
+ /**
+ * @Desc: 根据具体的id获取基于当前id的div以及对应的其他dom元素
+ * @Param: id: 节点的ID值
+ */
+ DTree.prototype.getNodeDom = function(id){
+ var _this = this;
+ // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ return {
+ div: function(){ // 获取当前div
+ return $div;
+ },
+ fnode: function(){ // 获取一级图标元素
+ return ($div == null) ? null : $div.find("i[data-spread]").eq(0);
+ },
+ snode: function(){ // 获取二级图标元素
+ return ($div == null) ? null : $div.find("i[data-spread]").eq(1);
+ },
+ checkbox: function(){ // 获取复选框元素
+ return ($div == null) ? null : $div.find("i[data-par]");
+ },
+ cite: function(){ // 获取cite元素
+ return ($div == null) ? null : $div.find("cite[data-leaf]");
+ },
+ nextUl: function(){ // 获取相邻的ul元素
+ return ($div == null) ? null : $div.next("ul");
+ },
+ parentLi: function(){ // 获取父级li元素
+ return ($div == null) ? null : $div.parent("li");
+ },
+ parentUl: function(){ // 获取基于当前$div的上级$ul
+ return ($div == null) ? null : $div.parent("li").parent("ul");
+ },
+ parentDiv: function(){ // 获取基于当前$div的上级$div
+ return ($div == null) ? null : $div.parent("li").parent("ul").prev("div");
+ },
+ nowDiv: function(){ // 获取当前选中节点,没有则返回null
+ return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS);
+ },
+ nowOrRootDiv: function(){ // 获取当前选中节点,没有则返回根节点下的第一个div
+ return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? _this.obj.children("li").eq(0).children("div").eq(0) : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS);
+ },
+ nowOrRootUl: function(){ // 获取当前选中节点下一个UL 或根节点。为了将新节点放入ul下
+ return (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).length == 0) ? _this.obj : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id]").parent().find("."+NAV_THIS).next("ul");
+ }
+ }
+ };
+
+ /**
+ * @Desc: 获取当前选中节点下一个ul节点 或根节点。为了将新节点放入ul下
+ */
+ DTree.prototype.getNowNodeUl = function() {
+ var _this = this;
+ return _this.getNodeDom().nowOrRootUl();
+ };
+
+ /**
+ * @Desc: 获取当前选中div节点 或第一个根div节点。
+ */
+ DTree.prototype.getNowNode = function() {
+ var _this = this;
+ return _this.getNodeDom().nowOrRootDiv();
+ };
+
+ /**
+ * @Desc: 获取当前选中div节点 无则返回null。
+ */
+ DTree.prototype.getNowNodeOrNull = function() {
+ var _this = this;
+ return _this.getNodeDom().nowDiv();
+ };
+
+ /**
+ * @Desc: 根据获取指定div节点。
+ * @Param: id: 指定节点的ID
+ */
+ DTree.prototype.getNode = function(id) {
+ var _this = this;
+ return _this.getNodeDom(id).div();
+ };
+
+ /**
+ * @Desc: 设置当前选中节点的全部参数
+ * @Param: $div: 当前选中的节点
+ */
+ DTree.prototype.setNodeParam = function($div) {
+ var _this = this;
+ _this.node.nodeId = $div.attr("data-id");
+ _this.node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid");
+ _this.node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text();
+ _this.node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false;
+ _this.node.level = _this.getNodeDom($div).parentLi().attr("data-index");
+ _this.node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false;
+
+ var basicData = $div.attr("data-basic");
+ if(basicData) {
+ basicData = JSON.parse(event.unescape(basicData));
+ }
+ _this.node.basicData = basicData;
+
+ var recordData = $div.attr("data-record");
+ if(recordData) {
+ recordData = JSON.parse(event.unescape(recordData));
+ }
+ _this.node.recordData = recordData;
+
+ if (_this.getNodeDom($div).checkbox()) {
+ var dataTypes = "", checkeds = "", initcheckeds = "";
+ _this.getNodeDom($div).checkbox().each(function(){
+ dataTypes += $(this).attr("data-type") + ",";
+ checkeds += $(this).attr("data-checked") + ",";
+ initcheckeds += $(this).attr("data-initchecked") + ",";
+ });
+ dataTypes = dataTypes.substring(0, dataTypes.length-1);
+ checkeds = checkeds.substring(0, checkeds.length-1);
+ initcheckeds = initcheckeds.substring(0, initcheckeds.length-1);
+
+ _this.node.dataType = dataTypes;
+ _this.node.checked = checkeds;
+ _this.node.initchecked = initcheckeds;
+ }
+ };
+
+ /**
+ * @Desc: 获取当前选中节点的全部参数
+ * @Param: $div: 当前选中的节点
+ */
+ DTree.prototype.getNodeParam = function($div) {
+ var _this = this;
+ if ($div) {
+ _this.setNodeParam($div);
+ } else {
+ if(_this.obj.find("div[data-id]").parent().find("."+NAV_THIS).length == 0){
+ _this.initNodeParam();
+ }
+ }
+ return this.node;
+ };
+
+ /**
+ * @Desc: 获取一个临时的node参数
+ * @Param: $div: 当前选中的节点
+ */
+ DTree.prototype.getTempNodeParam = function($div) {
+ var _this = this;
+ var temp_node = {};
+ temp_node.nodeId = $div.attr("data-id");
+ temp_node.parentId = _this.getNodeDom($div).parentLi().attr("data-pid");
+ temp_node.context = (typeof _this.formatter.title === 'function') ? _this.getNodeDom($div).cite().attr("data-title") : _this.getNodeDom($div).cite().text();
+ temp_node.leaf = _this.getNodeDom($div).cite().attr("data-leaf") == "leaf" ? true : false;
+ temp_node.level = _this.getNodeDom($div).parentLi().attr("data-index");
+ temp_node.spread = _this.getNodeDom($div).fnode().attr("data-spread") == "open" ? true : false;
+
+ var basicData = $div.attr("data-basic");
+ if(basicData) {
+ basicData = JSON.parse(event.unescape(basicData));
+ }
+ temp_node.basicData = basicData;
+ var recordData = $div.attr("data-record");
+ if(recordData) {
+ recordData = JSON.parse(event.unescape(recordData));
+ }
+ temp_node.recordData = recordData;
+
+ if (_this.getNodeDom($div).checkbox()) {
+ var dataTypes = "", checkeds = "", initcheckeds = "";
+ _this.getNodeDom($div).checkbox().each(function(){
+ dataTypes += $(this).attr("data-type") + ",";
+ checkeds += $(this).attr("data-checked") + ",";
+ initcheckeds += $(this).attr("data-initchecked") + ",";
+ });
+ dataTypes = dataTypes.substring(0, dataTypes.length-1);
+ checkeds = checkeds.substring(0, checkeds.length-1);
+ initcheckeds = initcheckeds.substring(0, initcheckeds.length-1);
+
+ temp_node.dataType = dataTypes;
+ temp_node.checked = checkeds;
+ temp_node.initchecked = initcheckeds;
+ }
+ return temp_node;
+ };
+
+ /**
+ * @Desc: 重置内置参数
+ */
+ DTree.prototype.initNodeParam = function(){
+ var _this = this;
+ _this.node.nodeId = "";
+ _this.node.parentId = "";
+ _this.node.context = "";
+ _this.node.leaf = "";
+ _this.node.level = "";
+ _this.node.spread = "";
+ _this.node.dataType = "";
+ _this.node.checked = "";
+ _this.node.initchecked = "";
+ _this.node.basicData = "";
+ _this.node.recordData = "";
+
+ if(_this.select) {
+ _this.selectResetVal();
+ }
+ };
+
+ /**
+ * @Desc: 获取传递出去的参数,根据defaultRequest、request和node拼出发出请求的参数
+ * @Param: nodes:需要传递出去的参数
+ */
+ DTree.prototype.getRequestParam = function(nodes){
+ var _this = this;
+ var request = _this.request,
+ defaultRequestNames = _this.defaultRequest,
+ node = nodes || _this.node,
+ requestParam = {};
+
+ // 先拼用户自定义的,在拼树生成的,这样的话用户可以自定义当树未生成时的节点的初始值
+ for ( var key in request) {
+ requestParam[key] = request[key];
+ }
+ for ( var key in defaultRequestNames) {
+ var paramName = defaultRequestNames[key];
+ var paramValue = node[key];
+ if(typeof paramValue === "boolean"){
+ requestParam[paramName] = paramValue;
+ }else {
+ if(paramValue){
+ requestParam[paramName] = paramValue;
+ }
+ }
+
+ }
+ return requestParam;
+ };
+
+ /**
+ * @Desc: 获取filterParam过滤后的requestParam
+ * @Param: requestParam:请求参数
+ */
+ DTree.prototype.getFilterRequestParam = function(requestParam){
+ var _this = this;
+ var filterRequest = _this.filterRequest;
+ return event.cloneObj(requestParam, filterRequest);
+ };
+
+ /**
+ * @Desc: 获取当前选中的请求参数
+ */
+ DTree.prototype.getNowParam = function(){
+ var _this = this;
+
+ return _this.getRequestParam(_this.getNodeParam());
+ };
+
+ /**
+ * @Desc: 根据id获取指定div节点选中参数
+ * @Param: id:节点的ID值
+ */
+ DTree.prototype.getParam = function(id){
+ var _this = this;
+
+ // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ if($div != null){ return _this.callbackData().node(_this.getTempNodeParam($div)); } else { return {}; }
+ };
+
+ /**
+ * @Desc: 根据id获取节点上级节点参数
+ * @Param: id:节点的ID值
+ */
+ DTree.prototype.getParentParam = function(id){
+ var _this = this;
+ // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ if($div != null){ return _this.callbackData().parentNode($div); } else { return {}; }
+ };
+
+ /**
+ * @Desc: 根据id获取节点的全部上级节点参数值
+ * @Param: id:节点的ID值
+ */
+ DTree.prototype.getAllParentParam = function(id){
+ var _this = this;
+ // 获取当前div,如果id就是一个dom,则就是这个,如果不是则进行选择。如果选不中则为null
+ var $div = (typeof id === 'object') ? id : (_this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']").length == 0) ? null : _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][data-id='"+id+"']");
+ var arr = [];
+ if($div != null){
+ var level = _this.getTempNodeParam($div).level;
+ for(var i=1; i 0){
+ $childDivs.each(function(){
+ var $cDiv = $(this);
+ childNode.push(_this.getRequestParam(_this.getTempNodeParam($cDiv)));
+ });
+ }
+ return childNode;
+ },
+ parentNode: function($div){ // 获取上级节点值
+ var pId = _this.getNodeDom($div).parentLi().attr("data-pid");
+ var $pdiv = _this.obj.find("div[data-id='"+pId+"']");
+ if($pdiv.length > 0) {return _this.getRequestParam(_this.getTempNodeParam($pdiv));} else {return {};}
+
+ }
+ }
+ };
+
+ /******************** 事件回调区域 ********************/
+ /**
+ * @Desc: 绑定浏览器事件
+ */
+ DTree.prototype.bindBrowserEvent = function(){
+ var _this = this;
+ var rootId = _this.obj[0].id;
+
+ // 绑定文件夹展开/收缩的图标的点击事件,点击时给当前节点的div添加选中class
+ _this.obj.on("click", "i[data-spread]", function(event) {
+ event.stopPropagation();
+ var $i = $(this),
+ $div = $i.parent("div"),
+ node = _this.getNodeParam($div);
+
+ _this.toolbarHide();
+ _this.navThis($div);
+ _this.clickSpread($div); // 展开或隐藏节点
+
+ // 树状态改变后,用户自定义想做的事情
+ layui.event.call(this, MOD_NAME, "changeTree("+$(_this.obj)[0].id+")", {
+ dom: _this.callbackData().dom($i),
+ param: _this.callbackData().node(node),
+ show: _this.callbackData().dom($i).attr("data-spread") == "open" ? true : false
+ });
+ });
+
+ // 绑定所有子节点div的单击事件,点击时触发加载iframe或用户自定义想做的事情
+ _this.obj.on("click", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event) {
+ event.stopPropagation();
+ var $div = $(this),
+ $cite = $div.find("cite"),
+ node = _this.getNodeParam($div);
+ _this.toolbarHide();
+ _this.navThis($div);
+
+ if(_this.select) {
+ _this.selectVal(node.nodeId);
+ $("div[dtree-id='" + rootId + "'][dtree-select='"+_this.selectDiv+"']").click();
+ }
+
+ if (_this.useIframe) {
+ var iframeParam = _this.getFilterRequestParam(_this.getIframeRequestParam(node));
+ var flag = _this.loadIframe($div, iframeParam); // 加载iframe
+ if (flag) {
+ // iframe加载完毕后,用户自定义想做的事情
+ _this.iframeFun.iframeDone(iframeParam);
+
+ layui.event.call(this, MOD_NAME, "iframeDone("+$(_this.obj)[0].id+")", {
+ "iframeParam": iframeParam,
+ dom: _this.callbackData().dom($div)
+ });
+ }
+ } else {
+ // 单击事件执行完毕后,用户自定义想做的事情
+ layui.event.call(this, MOD_NAME, "node("+$(_this.obj)[0].id+")", {
+ param: _this.callbackData().node(node),
+ childParams: _this.callbackData().childNode($div),
+ parentParam: _this.callbackData().parentNode($div),
+ dom: _this.callbackData().dom($div)
+ });
+ }
+ });
+
+ // 绑定所有子节点div的双击事件,暴露on给用户自定义
+ _this.obj.on("dblclick", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event) {
+ event.stopPropagation();
+ var $div = $(this),
+ $cite = $div.find("cite"),
+ node = _this.getNodeParam($div);
+ _this.toolbarHide();
+ _this.navThis($div);
+
+ if(_this.select) {
+ _this.selectVal(node.nodeId);
+ $("div[dtree-id='" + rootId + "'][dtree-select='"+_this.selectDiv+"']").click();
+ }
+
+ // 双击事件执行完毕后,用户自定义想做的事情
+ layui.event.call(this, MOD_NAME, "nodedblclick("+$(_this.obj)[0].id+")", {
+ param: _this.callbackData().node(node),
+ childParams: _this.callbackData().childNode($div),
+ parentParam: _this.callbackData().parentNode($div),
+ dom: _this.callbackData().dom($div)
+ });
+ });
+
+ if(_this.checkbar) {
+ // 绑定cheboxbar的节点复选框
+ _this.obj.on("click", "i[dtree-click='"+eventName.checkNodeClick+"'][dtree-disabled='false']", function(event) {
+ _this.toolbarHide();
+ var $i = $(this),
+ $div = $i.closest("div[dtree-click='"+eventName.itemNodeClick+"']"),
+ node = _this.getNodeParam($div);
+ // 复选框选中前的回调
+ var flag = _this.checkbarFun.chooseBefore($i, _this.getRequestParam(node));
+ _this.temp = [$i];
+ if(flag){_this.changeCheck();}
+
+ event.stopPropagation();
+ });
+ }
+
+ if(_this.menubar) {
+ // 绑定menubar的点击事件
+ _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).on("click", "button[d-menu]", function(event) {
+ event.stopPropagation();
+ _this.toolbarHide();
+ _this.menubarListener($(this).attr("d-menu"), "group");
+ });
+
+ // 绑定menubar的点击事件
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).on("click", "a[d-menu]", function(event) {
+ event.stopPropagation();
+ _this.toolbarHide();
+ _this.menubarListener($(this).attr("d-menu"), "toolbar");
+ });
+
+ // 绑定menubar的点击按钮事件
+ _this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").on("click", function(event) {
+ event.stopPropagation();
+ _this.toolbarHide();
+ _this.menubarListener($(this).attr("dtree-menu"), "freedom");
+ });
+ }
+
+ if(_this.toolbar) {
+ if(_this.toolbarWay == "contextmenu") {
+ //绑定所有子节点div的右键点击事件,用于显示toolbar
+ _this.obj.on("contextmenu", "div[dtree-click='"+eventName.itemNodeClick+"'][d-contextmenu='true'][dtree-disabled='false']", function(e){
+ var $div = $(this),
+ node = _this.getNodeParam($div);
+
+ _this.toolbarHide();
+ // toolbar加载前执行的方法,执行完毕之后创建按钮
+ _this.setToolbarDom().setToolbarPlace(_this.toolbarFun.loadToolbarBefore(event.cloneObj(_this.toolbarMenu), _this.getRequestParam(node), $div));
+
+ var e = e || window.event,
+ mx = e.pageX - $div.offset().left +45 ,
+ my = $div.offset().top - _this.obj.closest(_this.scroll).offset().top +15;
+
+ _this.navThis($div);
+ var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
+ $toolBarDiv.find(".layui-nav-child").addClass('layui-anim-fadein layui-show');
+ $toolBarDiv.css({'left':mx+'px','top':my+'px'});
+
+ e.stopPropagation();
+ return false;
+ });
+
+ // 绑定装载树的上层出现滚动条的容器,让toolbar隐藏
+ _this.obj.closest(_this.scroll).scroll(function() {
+ _this.toolbarHide();
+ });
+
+ // 绑定toolbar的点击事件
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).on("click", "a[dtree-tool]", function(event) {
+ event.stopPropagation();
+ var $div = _this.getNodeDom().nowOrRootDiv(),
+ node = _this.getNodeParam($div);
+ _this.toolbarHide();
+ var tool = $(this).attr("dtree-tool");
+ _this.toolbarListener(tool, $div);
+ });
+ } else if(_this.toolbarWay == "fixed") {
+ // 绑定toolbar的点击事件
+ _this.obj.on("click", "a[dtree-tool]", function(event) {
+ event.stopPropagation();
+ var $a = $(this),
+ $cite = $a.parent("em."+TOOLBAR_TOOL_EM).prev("cite"), //当前选中节点的text
+ $div = $cite.parent("div"),
+ node = _this.getNodeParam($div);
+ var tool = $a.attr("dtree-tool");
+
+ _this.toolbarHide();
+ _this.navThis($div);
+ _this.toolbarListener(tool, $div);
+ });
+ } else if(_this.toolbarWay == "follow") {
+ //绑定所有子节点div的mouseover mouseout事件,用于显示或隐藏toolbar
+ _this.obj.on("mouseover mouseout", "div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='false']", function(event){
+ var $div = $(this),
+ $toolBarEm = $div.children("em."+TOOLBAR_TOOL_EM);
+ if(event.type == "mouseover"){
+ $toolBarEm.removeClass(NAV_HIDE);
+ event.stopPropagation();
+ } else if(event.type == "mouseout"){
+ $toolBarEm.addClass(NAV_HIDE);
+ event.stopPropagation();
+ }
+ });
+
+ // 绑定toolbar的点击事件
+ _this.obj.on("click", "a[dtree-tool]", function(event) {
+ event.stopPropagation();
+ var $a = $(this),
+ $cite = $a.parent("em."+TOOLBAR_TOOL_EM).prev("cite"), //当前选中节点的text
+ $div = $cite.parent("div"),
+ node = _this.getNodeParam($div);
+ var tool = $a.attr("dtree-tool");
+
+ _this.toolbarHide();
+ _this.navThis($div);
+ _this.toolbarListener(tool, $div);
+ });
+ }
+ }
+
+ if(_this.select) {
+ // 绑定select的点击事件
+ $("div[dtree-id='" + rootId + "'][dtree-select='"+_this.selectDiv+"']").on("click", function(event){
+ event.stopPropagation();
+ var dl = $(this).find('dl');
+ //debugger;
+ $(this).toggleClass("layui-form-selected");
+
+ var $card = $("div[dtree-id='" + rootId + "'][dtree-card='"+_this.selectCardDiv+"']");
+
+ $card.toggleClass("dtree-select-show layui-anim layui-anim-upbit");
+ var top = $(this).offset().top + $(this).outerHeight() - $WIN.scrollTop() - 5,
+ cardHeight = $card.height(),
+ winHeight = $WIN.height();
+// console.log("top = $(this).offset().top: " + $(this).offset().top + " + $(this).outerHeight(): " + $(this).outerHeight() + " - $WIN.scrollTop(): " + $WIN.scrollTop() + " - 5 =" + top);
+// console.log("winHeight = " + winHeight);
+ if($card.hasClass('dtree-select-up')) {
+ $card.removeClass('dtree-select-up');
+ }
+
+ //上下定位识别
+ if(top + cardHeight > $WIN.height() && top >= cardHeight){
+ console.log(" top + cardHeight : "+ top + " + " + cardHeight + " > $WIN.height() :" + $WIN.height() + " && top >= cardHeight :" + top + " > " + cardHeight);
+ if($card.hasClass('dtree-select-up')) {
+ $card.removeClass('dtree-select-up');
+ } else {
+ $card.addClass('dtree-select-up');
+ }
+ } else {
+ $card.removeClass('dtree-select-up');
+ }
+
+ // 下拉树面板开闭状态改变后,用户自定义想做的事情
+ layui.event.call(this, MOD_NAME, "changeSelect("+$(_this.obj)[0].id+")", {
+ show: $(this).hasClass("layui-form-selected"),
+ param: _this.selectVal()
+ });
+ });
+
+ }
+ };
+
+ // 绑定body的单击,让本页面所有的toolbar隐藏
+ $BODY.on("click", function(event){
+ $("div."+LI_DIV_TOOLBAR).find(".layui-show").removeClass('layui-anim-fadein layui-show');
+ // $("div[dtree-id][dtree-select]").removeClass("layui-form-selected");
+ // $("div[dtree-id][dtree-card]").removeClass("dtree-select-show layui-anim layui-anim-upbit");
+
+ });
+
+ // 解绑浏览器事件
+ DTree.prototype.unbindBrowserEvent = function(){
+ var _this = this;
+
+ // 本身事件解绑
+ _this.obj.unbind();
+ // 菜单栏解绑
+ if(_this.menubar){
+ _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).unbind();
+ if(_this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").length > 0){
+ _this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").unbind();
+ }
+ }
+
+ // 工具栏解绑
+ if(_this.toolbar){
+ if(_this.toolbarWay == "contextmenu") {
+ _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).unbind();
+ if(_this.obj.closest(_this.scroll).length > 0){
+ _this.obj.closest(_this.scroll).unbind();
+ }
+ }
+ }
+
+ // 下拉树解绑
+ if(_this.select) {
+ // 解绑select的点击事件
+ $("div[dtree-id='" + _this.obj[0].id + "'][dtree-select='"+_this.selectDiv+"']").removeClass("layui-form-selected");
+ $("div[dtree-id='" + _this.obj[0].id + "'][dtree-card='"+_this.selectCardDiv+"']").removeClass("dtree-select-show layui-anim layui-anim-upbit");
+ $("div[dtree-id='" + _this.obj[0].id + "'][dtree-select='"+_this.selectDiv+"']").unbind();
+ }
+ };
+
+
+ /** 外部访问 **/
+ var dtree = {
+ set: function(options){ //设置全局属性
+ if(typeof options !== 'undefined') {
+ $.extend(OPTIONS, options);
+ }
+ },
+ render: function(options){ // 初始化树
+ var dTree = null;
+ var id = event.getElemId(options);
+ if(id == "") {
+ layer.msg("页面中未找到绑定id", {icon:5});
+ } else {
+ dTree = DTrees[id];
+ if(typeof dTree === 'object'){
+ dTree.unbindBrowserEvent();
+ }
+ // 创建树
+ dTree = new DTree(options);
+ // 添加到树数组中去
+ DTrees[id] = dTree;
+ dTree.initTreePlus();
+ dTree.openTreePlus();
+ dTree.loadTreeInit();
+ dTree.bindBrowserEvent();
+ }
+
+ return dTree;
+ },
+ renderSelect: function(options){ // 初始化下拉树
+ var dTree = null;
+ var id = event.getElemId(options);
+ if(id == "") {
+ layer.msg("页面中未找到绑定id", {icon:5});
+ } else {
+ dTree = DTrees[id];
+ if(typeof dTree === 'object'){
+ dTree.unbindBrowserEvent();
+ }
+ // 创建下拉树
+ dTree = new DTree(options);
+ dTree.selectSetting();
+ // 添加到树数组中去
+ DTrees[id] = dTree;
+ dTree.initTreePlus();
+ dTree.openTreePlus();
+ dTree.loadTreeInit();
+ dTree.bindBrowserEvent();
+ }
+
+ return dTree;
+ },
+ reload: function(dTree, options){ // 重新加载树
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ dTree.reloadSetting(options);
+ dTree.initTreePlus();
+ dTree.openTreePlus();
+ dTree.initNodeParam();
+ dTree.loadTreeInit();
+ dTree.unbindBrowserEvent();
+ dTree.bindBrowserEvent();
+ },
+ on: function(events, callback) { // 绑定事件
+ if(events.indexOf("'") > 0){
+ events = events.replace(/'/g,"");
+ }
+ if(events.indexOf('"') > 0) {
+ events = events.replace(/"/g,"");
+ }
+ return layui.onevent.call(this, MOD_NAME, events, callback);
+ },
+ click: function(dTree, id) { // 模拟单击事件
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ $("div[dtree-click='"+eventName.itemNodeClick+"'][dtree-id='"+dTree.obj[0].id+"'][data-id='"+id+"']").click();
+ },
+ getNowParam: function(dTree){ // 获取当前选中值
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.getNowParam(); // 获取当前选中值
+ },
+ getParam: function(dTree, id){ // 获取指定节点值
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.getParam(id); // 获取指定节点值
+ },
+ getParentParam: function(dTree, id){ // 获取参数的上级节点
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.getParentParam(id);
+ },
+ getAllParentParam: function(dTree, id){ // 获取参数的全部上级节点
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.getAllParentParam(id);
+ },
+ getChildParam: function(dTree, id){ // 获取参数的全部下级节点
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.getChildParam(id);
+ },
+ getCheckbarNodesParam: function(dTree){ // 获取复选框选中值
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return {};
+ }
+ return dTree.getCheckbarNodesParam(); // 获取复选框选中值
+ },
+ getCheckbarJsonArrParam: function(dTree){ // 获取复选框选中值
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return {};
+ }
+ return dTree.getCheckbarJsonArrParam(); // 获取复选框选中值
+ },
+ dataInit: function(dTree, chooseId){ // 初始化选中树,针对数据反选
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ if(chooseId){
+ return dTree.dataInit(chooseId);
+ }
+ },
+ chooseDataInit: function(dTree, chooseIds){ // 初始化复选框选中,针对数据反选
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ if(chooseIds){
+ return dTree.chooseDataInit(chooseIds);
+ }
+ },
+ changeCheckbarNodes: function(dTree){ //判断复选框是否发生变更
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.changeCheckbarNodes();
+ },
+ initNoAllCheck: function(dTree) { //复选框半选状态初始化设置
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.initNoAllCheck();
+ },
+ initAllCheck: function(dTree){ // 复选框选中状态初始化设置
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.initAllCheck();
+ },
+ selectVal: function(dTree, param){ // select模式设置输入框选中值
+ if(typeof dTree === "string"){
+ dTree = DTrees[dTree];
+ }
+ if(typeof dTree === "undefined"){
+ layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
+ return ;
+ }
+ return dTree.selectVal(param); // select模式设置输入框选中值
+ },
+ escape: function(html){ // 字符串格式化
+ return event.escape(html);
+ },
+ unescape: function(str){ // 字符串反格式化
+ return event.unescape(str);
+ },
+ serialize: function(first, param) { // 序列化JSON对象
+ return AjaxHelper.serialize(first, param);
+ },
+ version: function(){ //获取版本号
+ return VERSION;
+ }
+ };
+
+ exports('dtree', dtree);
+});
\ No newline at end of file
diff --git a/lib/layui-v2.9.18/layui/dtree/font/dtreefont.css b/lib/layui-v2.9.18/layui/dtree/font/dtreefont.css
new file mode 100644
index 0000000..df7af65
--- /dev/null
+++ b/lib/layui-v2.9.18/layui/dtree/font/dtreefont.css
@@ -0,0 +1,229 @@
+@font-face {
+ font-family: 'dtreefont';
+ src: url('dtreefont.eot?x3m8fp');
+ src: url('dtreefont.eot?x3m8fp#iefix') format('embedded-opentype'),
+ url('dtreefont.ttf?x3m8fp') format('truetype'),
+ url('dtreefont.woff?x3m8fp') format('woff'),
+ url('dtreefont.svg?x3m8fp#dtreefont') format('svg');
+ font-weight: normal;
+ font-style: normal;
+}
+
+[class^="dtree-icon-"], [class*=" dtree-icon-"] {
+ /* use !important to prevent issues with browser extensions that change font */
+ font-family: 'dtreefont' !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+}
+
+.dtree-icon-xiangxia1:before {
+ content: "\e771";
+}
+.dtree-icon-normal-file:before {
+ content: "\e60c";
+}
+.dtree-icon-xiangyou:before {
+ content: "\e78f";
+}
+.dtree-icon-ok-circle:before {
+ content: "\1005";
+}
+.dtree-icon-close1:before {
+ content: "\1006";
+}
+.dtree-icon-close-fill:before {
+ content: "\1007";
+}
+.dtree-icon-jian1:before {
+ content: "\e600";
+}
+.dtree-icon-jia1:before {
+ content: "\e601";
+}
+.dtree-icon-bianji:before {
+ content: "\e602";
+}
+.dtree-icon-yonghu:before {
+ content: "\e603";
+}
+.dtree-icon-shijian:before {
+ content: "\e606";
+}
+.dtree-icon-fuxuankuang-banxuan:before {
+ content: "\e607";
+}
+.dtree-icon-star:before {
+ content: "\e608";
+}
+.dtree-icon-wenjianjiazhankai:before {
+ content: "\e60e";
+}
+.dtree-icon-xiangmuxiaoxi:before {
+ content: "\e60f";
+}
+.dtree-icon-search2:before {
+ content: "\e615";
+}
+.dtree-icon-weibiaoti5:before {
+ content: "\e618";
+}
+.dtree-icon-layim-theme:before {
+ content: "\e61b";
+}
+.dtree-icon-shuye1:before {
+ content: "\e61e";
+}
+.dtree-icon-add-circle:before {
+ content: "\e61f";
+}
+.dtree-icon-xinxipilu:before {
+ content: "\e620";
+}
+.dtree-icon-set-sm:before {
+ content: "\e621";
+}
+.dtree-icon-about:before {
+ content: "\e623";
+}
+.dtree-icon-chart-screen:before {
+ content: "\e62a";
+}
+.dtree-icon-delete1:before {
+ content: "\e640";
+}
+.dtree-icon-share3:before {
+ content: "\e641";
+}
+.dtree-icon-youjian:before {
+ content: "\e642";
+}
+.dtree-icon-check:before {
+ content: "\e645";
+}
+.dtree-icon-close:before {
+ content: "\e646";
+}
+.dtree-icon-favorfill:before {
+ content: "\e64b";
+}
+.dtree-icon-favor:before {
+ content: "\e64c";
+}
+.dtree-icon-fuxuankuangxuanzhong:before {
+ content: "\e652";
+}
+.dtree-icon-fenguangbaobiao:before {
+ content: "\e655";
+}
+.dtree-icon-jian:before {
+ content: "\e656";
+}
+.dtree-icon-jia:before {
+ content: "\e657";
+}
+.dtree-icon-fenzhijigou:before {
+ content: "\e658";
+}
+.dtree-icon-roundcheckfill:before {
+ content: "\e659";
+}
+.dtree-icon-roundcheck:before {
+ content: "\e65a";
+}
+.dtree-icon-roundclosefill:before {
+ content: "\e65b";
+}
+.dtree-icon-roundclose:before {
+ content: "\e65c";
+}
+.dtree-icon-roundrightfill:before {
+ content: "\e65d";
+}
+.dtree-icon-roundright:before {
+ content: "\e65e";
+}
+.dtree-icon-like:before {
+ content: "\e66c";
+}
+.dtree-icon-samefill:before {
+ content: "\e671";
+}
+.dtree-icon-same:before {
+ content: "\e672";
+}
+.dtree-icon-evaluate:before {
+ content: "\e674";
+}
+.dtree-icon-circle1:before {
+ content: "\e687";
+}
+.dtree-icon-radio:before {
+ content: "\e688";
+}
+.dtree-icon-caidan_xunzhang:before {
+ content: "\e68e";
+}
+.dtree-icon-pulldown:before {
+ content: "\e6a0";
+}
+.dtree-icon-pullup:before {
+ content: "\e6a1";
+}
+.dtree-icon-refresh:before {
+ content: "\e6a4";
+}
+.dtree-icon-qrcode1:before {
+ content: "\e6b0";
+}
+.dtree-icon-profile1:before {
+ content: "\e6b7";
+}
+.dtree-icon-home1:before {
+ content: "\e6b8";
+}
+.dtree-icon-homefill:before {
+ content: "\e6bb";
+}
+.dtree-icon-roundaddfill:before {
+ content: "\e6d8";
+}
+.dtree-icon-roundadd:before {
+ content: "\e6d9";
+}
+.dtree-icon-fuxuankuang:before {
+ content: "\e6f2";
+}
+.dtree-icon-wefill:before {
+ content: "\e6f5";
+}
+.dtree-icon-sort:before {
+ content: "\e701";
+}
+.dtree-icon-repair:before {
+ content: "\e738";
+}
+.dtree-icon-shujudaping:before {
+ content: "\e742";
+}
+.dtree-icon-dian:before {
+ content: "\e7a5";
+}
+.dtree-icon-search_list_light:before {
+ content: "\e807";
+}
+.dtree-icon-round_list_light:before {
+ content: "\e82b";
+}
+.dtree-icon-star-fill:before {
+ content: "\e832";
+}
+.dtree-icon-rate:before {
+ content: "\e833";
+}
+.dtree-icon-move-up:before {
+ content: "\ea47";
+}
+.dtree-icon-move-down:before {
+ content: "\ea48";
+}
diff --git a/lib/layui-v2.9.18/layui/dtree/font/dtreefont.eot b/lib/layui-v2.9.18/layui/dtree/font/dtreefont.eot
new file mode 100644
index 0000000000000000000000000000000000000000..68bf5f2f2dd33daa67373cca102f8ad764d84c22
GIT binary patch
literal 19508
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
+
+
\ No newline at end of file
diff --git a/lib/layui-v2.9.18/layui/dtree/font/dtreefont.ttf b/lib/layui-v2.9.18/layui/dtree/font/dtreefont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..78bacd13a0a16b55e6b3be536b35e34e147a396a
GIT binary patch
literal 19344
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
literal 0
HcmV?d00001
diff --git a/lib/layui-v2.9.18/layui/dtree/font/icons.json b/lib/layui-v2.9.18/layui/dtree/font/icons.json
new file mode 100644
index 0000000..fca4788
--- /dev/null
+++ b/lib/layui-v2.9.18/layui/dtree/font/icons.json
@@ -0,0 +1,283 @@
+{
+ "data": [{
+ "cls": "dtree-icon-xiangxia1",
+ "uncode": "e771"
+ },
+ {
+ "cls": "dtree-icon-xiangyou",
+ "uncode": "e78f"
+ },
+ {
+ "cls": "dtree-icon-jian",
+ "uncode": "e656"
+ },
+ {
+ "cls": "dtree-icon-jia",
+ "uncode": "e657"
+ },
+ {
+ "cls": "dtree-icon-weibiaoti5",
+ "uncode": "e618"
+ },
+ {
+ "cls": "dtree-icon-wenjianjiazhankai",
+ "uncode": "e60e"
+ },
+ {
+ "cls": "dtree-icon-dian",
+ "uncode": "e7a5"
+ },
+ {
+ "cls": "dtree-icon-yonghu",
+ "uncode": "e603"
+ },
+ {
+ "cls": "dtree-icon-fenzhijigou",
+ "uncode": "e658"
+ },
+ {
+ "cls": "dtree-icon-fenguangbaobiao",
+ "uncode": "e655"
+ },
+ {
+ "cls": "dtree-icon-xinxipilu",
+ "uncode": "e620"
+ },
+ {
+ "cls": "dtree-icon-shuye1",
+ "uncode": "e61e"
+ },
+ {
+ "cls": "dtree-icon-caidan_xunzhang",
+ "uncode": "e68e"
+ },
+ {
+ "cls": "dtree-icon-normal-file",
+ "uncode": "e60c"
+ },
+ {
+ "cls": "dtree-icon-roundclose",
+ "uncode": "e65c"
+ },
+ {
+ "cls": "dtree-icon-bianji",
+ "uncode": "e602"
+ },
+ {
+ "cls": "dtree-icon-roundadd",
+ "uncode": "e6d9"
+ },
+ {
+ "cls": "dtree-icon-fuxuankuangxuanzhong",
+ "uncode": "e652"
+ },
+ {
+ "cls": "dtree-icon-fuxuankuang",
+ "uncode": "e6f2"
+ },
+ {
+ "cls": "dtree-icon-fuxuankuang-banxuan",
+ "uncode": "e607"
+ },
+ {
+ "cls": "dtree-icon-search_list_light",
+ "uncode": "e807"
+ },
+ {
+ "cls": "dtree-icon-move-up",
+ "uncode": "ea47"
+ },
+ {
+ "cls": "dtree-icon-move-down",
+ "uncode": "ea48"
+ },
+ {
+ "cls": "dtree-icon-delete1",
+ "uncode": "e640"
+ },
+ {
+ "cls": "dtree-icon-refresh",
+ "uncode": "e6a4"
+ },
+ {
+ "cls": "dtree-icon-roundcheckfill",
+ "uncode": "e659"
+ },
+ {
+ "cls": "dtree-icon-roundclosefill",
+ "uncode": "e65b"
+ },
+ {
+ "cls": "dtree-icon-roundcheck",
+ "uncode": "e65a"
+ },
+ {
+ "cls": "dtree-icon-pulldown",
+ "uncode": "e6a0"
+ },
+ {
+ "cls": "dtree-icon-pullup",
+ "uncode": "e6a1"
+ },
+ {
+ "cls": "dtree-icon-set-sm",
+ "uncode": "e621"
+ },
+ {
+ "cls": "dtree-icon-rate",
+ "uncode": "e833"
+ },
+ {
+ "cls": "dtree-icon-jian1",
+ "uncode": "e600"
+ },
+ {
+ "cls": "dtree-icon-jia1",
+ "uncode": "e601"
+ },
+ {
+ "cls": "dtree-icon-shijian",
+ "uncode": "e606"
+ },
+ {
+ "cls": "dtree-icon-check",
+ "uncode": "e645"
+ },
+ {
+ "cls": "dtree-icon-close",
+ "uncode": "e646"
+ },
+ {
+ "cls": "dtree-icon-favorfill",
+ "uncode": "e64b"
+ },
+ {
+ "cls": "dtree-icon-favor",
+ "uncode": "e64c"
+ },
+ {
+ "cls": "dtree-icon-roundrightfill",
+ "uncode": "e65d"
+ },
+ {
+ "cls": "dtree-icon-roundright",
+ "uncode": "e65e"
+ },
+ {
+ "cls": "dtree-icon-samefill",
+ "uncode": "e671"
+ },
+ {
+ "cls": "dtree-icon-same",
+ "uncode": "e672"
+ },
+ {
+ "cls": "dtree-icon-qrcode1",
+ "uncode": "e6b0"
+ },
+ {
+ "cls": "dtree-icon-profile1",
+ "uncode": "e6b7"
+ },
+ {
+ "cls": "dtree-icon-home1",
+ "uncode": "e6b8"
+ },
+ {
+ "cls": "dtree-icon-homefill",
+ "uncode": "e6bb"
+ },
+ {
+ "cls": "dtree-icon-roundaddfill",
+ "uncode": "e6d8"
+ },
+ {
+ "cls": "dtree-icon-wefill",
+ "uncode": "e6f5"
+ },
+ {
+ "cls": "dtree-icon-sort",
+ "uncode": "e701"
+ },
+ {
+ "cls": "dtree-icon-round_list_light",
+ "uncode": "e82b"
+ },
+ {
+ "cls": "dtree-icon-search2",
+ "uncode": "e615"
+ },
+ {
+ "cls": "dtree-icon-close1",
+ "uncode": "1006"
+ },
+ {
+ "cls": "dtree-icon-close-fill",
+ "uncode": "1007"
+ },
+ {
+ "cls": "dtree-icon-chart-screen",
+ "uncode": "e62a"
+ },
+ {
+ "cls": "dtree-icon-star",
+ "uncode": "e608"
+ },
+ {
+ "cls": "dtree-icon-ok-circle",
+ "uncode": "1005"
+ },
+ {
+ "cls": "dtree-icon-add-circle",
+ "uncode": "e61f"
+ },
+ {
+ "cls": "dtree-icon-about",
+ "uncode": "e623"
+ },
+ {
+ "cls": "dtree-icon-circle1",
+ "uncode": "e687"
+ },
+ {
+ "cls": "dtree-icon-radio",
+ "uncode": "e688"
+ },
+ {
+ "cls": "dtree-icon-star-fill",
+ "uncode": "e832"
+ },
+ {
+ "cls": "dtree-icon-shujudaping",
+ "uncode": "e742"
+ },
+ {
+ "cls": "dtree-icon-share3",
+ "uncode": "e641"
+ },
+ {
+ "cls": "dtree-icon-youjian",
+ "uncode": "e642"
+ },
+ {
+ "cls": "dtree-icon-repair",
+ "uncode": "e738"
+ },
+ {
+ "cls": "dtree-icon-evaluate",
+ "uncode": "e674"
+ },
+ {
+ "cls": "dtree-icon-like",
+ "uncode": "e66c"
+ },
+ {
+ "cls": "dtree-icon-layim-theme",
+ "uncode": "e61b"
+ },
+ {
+ "cls": "dtree-icon-xiangmuxiaoxi",
+ "uncode": "e60f"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/page/basic/fit_type_list.html b/page/basic/fit_type_list.html
index 41df474..fb9e3fb 100644
--- a/page/basic/fit_type_list.html
+++ b/page/basic/fit_type_list.html
@@ -8,12 +8,14 @@
+
+
+
-