/** *@Name dtree 树形组件 *@Author 智慧的小西瓜 *@DOCS http://www.wisdomelon.com/DTreeHelper/ *@License https://www.layui.com/ *@LASTTIME 2019/10/24 *@VERSION v2.5.6 */ 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.6", //版本 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}, 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(param){ //json序列化 key=value&key1=value1 var p = "?"; for (var key in param) { p += key + "=" + param[key] + "&"; } p = p.substring(0, p.length-1); return p; } }; // 树类 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 childSum: "childSum", //子级数量 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); }; /******************** 初始参数加载 ********************/ // 设置基本参数值 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.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.success = this.options.success || OPTIONS.success || function(data, obj){}; //树加载完毕后执行解析树之前的回调 this.done = this.options.done || OPTIONS.done || function(data, obj){}; //树加载完毕后的回调 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(); }; // 设置基本参数值 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.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.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(); }; // 设置下拉树的基本参数值 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.selectInputName = this.options.selectInputName || {nodeId: this.obj[0].id + "_select_nodeId"}; // select表单中的元素 // 调取下拉树的特殊处理页面元素标识 this.renderSelectDom(); } // 重新设置下拉树的基本参数值 DTree.prototype.reloadSelectSetting = function() { this.selectInitVal = this.obj.attr("data-value") || this.options.selectInitVal || this.selectInitVal; //输入框的值 this.selectTips = this.options.selectTips || this.selectTips; // 输入框的提示语 this.selectInputName = $.extend(this.selectInputName, this.options.selectInputName) || this.selectInputName; // select表单中的元素 // 调取下拉树的特殊处理页面元素标识 this.reloadSelectDom(); } /******************** 下拉树设置区域 ********************/ // 渲染下拉树的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('<input type="hidden" dtree-id="' + rootId + '" dtree-node="' + key + '" name="' + selectInputName[key] + '" value="" readonly>'); } // 设置html var prevHtml = ['<div class="layui-unselect layui-form-select" dtree-id="' + rootId + '" dtree-select="' + _this.selectDiv + '">', '<div class="layui-select-title">', selectInput.join(""), '<input type="text" dtree-id="' + rootId + '" id="' + _this.selectTipsName +'_id" name="' + _this.selectTipsName + '" placeholder="' + _this.selectTips + '" value="" readonly class="layui-input layui-unselect">', '<i class="layui-edge"></i>', '</div></div>'].join(''); _this.obj.before(prevHtml); _this.obj.wrap('<div class="layui-card dtree-select" dtree-id="' + rootId + '" dtree-card="' + _this.selectCardDiv + '"></div>').wrap('<div class="layui-card-body"></div>').wrap('<div id="' + _this.selectTreeDiv + '"></div>'); } // 重新渲染下拉树的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('<input type="hidden" dtree-id="' + rootId + '" dtree-node="' + key + '" name="' + selectInputName[key] + '" value="" readonly>'); } $("div[dtree-id='"+rootId+"'][dtree-select='"+_this.selectDiv+"']").find("div.layui-select-title").html(""); // 设置html var prevHtml = [selectInput.join(""), '<input type="text" dtree-id="' + rootId + '" id="' + _this.selectTipsName +'_id" name="' + _this.selectTipsName + '" placeholder="' + _this.selectTips + '" value="" readonly class="layui-input layui-unselect">', '<i class="layui-edge"></i>'].join(''); $("div[dtree-id='"+rootId+"'][dtree-select='"+_this.selectDiv+"']").find("div.layui-select-title").html(prevHtml); } // 设置输入框的值 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) { $("div[dtree-select='" + _this.selectDiv + "']").find("input[dtree-id='" + rootId + "']").each(function(){ var name = $(this).attr("name"); var val = $(this).val(); selectValues[name] = val; }); } else { 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; } // 设置复选框模式中的下拉树的值 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; } // 重置下拉树的值 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(); } } /******************** 字体及图标区域 ********************/ // 确认最终主题 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<iconfonts.length; i++){ var ifont = iconfonts[i]; var ifontStyle = iconfontStyles[i]; if(typeof ifontStyle !== 'undefined') { // 判断,赋值 this.useDefaultOrUserDefineFnodeStyle(ifont, ifontStyle.fnode); this.useDefaultOrUserDefineSnodeStyle(ifont, ifontStyle.snode); this.useDefaultOrUserDefineCheckboxStyle(ifont, ifontStyle.checkbox); this.useDefaultOrUserDefineMenubarStyle(ifont, ifontStyle.menubar); this.useDefaultOrUserDefineMenubarExtStyle(ifont, ifontStyle.menubarExt); this.useDefaultOrUserDefineToolbarStyle(ifont, ifontStyle.toolbar); this.useDefaultOrUserDefineToolbarExtStyle(ifont, ifontStyle.toolbarExt); } } }; // 赋值一级图标 DTree.prototype.useDefaultOrUserDefineFnodeStyle = function(ifont, fnode){ var _this = this; var tempOpen = this.usefontStyle.fnode.node.open; var tempClose = this.usefontStyle.fnode.node.close; var tempLeaf = this.usefontStyle.fnode.leaf; if(typeof fnode === 'undefined'){ this.usefontStyle.fnode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["open"]) : tempOpen; // 一级图标中的node节点open图标 this.usefontStyle.fnode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["close"]) : tempClose; // 一级图标中的node节点close图标 this.usefontStyle.fnode.leaf = (tempLeaf == "") ? (ifont + " " + this.leafIconArray[this.fleafIcon]) : tempLeaf; // 一级图标中的node节点的leaf图标 } else { var node = fnode.node; var leaf = fnode.leaf; if(typeof node === 'undefined'){ this.usefontStyle.fnode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["open"]) : tempOpen; // 一级图标中的node节点open图标 this.usefontStyle.fnode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["close"]) : tempClose; // 一级图标中的node节点close图标 } else { var open = node.open; var close = node.close; if(typeof open === 'undefined'){ this.usefontStyle.fnode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["open"]) : tempOpen; // 一级图标中的node节点open图标 } else { this.usefontStyle.fnode.node.open = ifont + " " + open; } if(typeof close === 'undefined') { this.usefontStyle.fnode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.fnodeIcon]["close"]) : tempClose; // 一级图标中的node节点close图标 } else { this.usefontStyle.fnode.node.close = ifont + " " + close; } } if(typeof leaf === 'undefined'){ this.usefontStyle.fnode.leaf = (tempLeaf == "") ? (ifont + " " + this.leafIconArray[this.fleafIcon]) : tempLeaf; // 一级图标中的node节点的leaf图标 } else { this.usefontStyle.fnode.leaf = ifont + " " + leaf; } } }; // 赋值二级图标 DTree.prototype.useDefaultOrUserDefineSnodeStyle = function(ifont, snode){ var _this = this; var tempOpen = this.usefontStyle.snode.node.open; var tempClose = this.usefontStyle.snode.node.close; var tempLeaf = this.usefontStyle.snode.leaf; if(typeof snode === 'undefined'){ this.usefontStyle.snode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["open"]) : tempOpen; // 二级图标中的node节点open图标 this.usefontStyle.snode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["close"]) : tempClose; // 二级图标中的node节点close图标 this.usefontStyle.snode.leaf = (tempLeaf == "") ? (ifont + " " + this.leafIconArray[this.leafIcon]) : tempLeaf; // 二级图标中的leaf节点图标 } else { var node = snode.node; var leaf = snode.leaf; if(typeof node === 'undefined') { this.usefontStyle.snode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["open"]) : tempOpen; // 二级图标中的node节点open图标 this.usefontStyle.snode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["close"]) : tempClose; // 二级图标中的node节点close图标 } else { var open = node.open; var close = node.close; if(typeof open === 'undefined'){ this.usefontStyle.snode.node.open = (tempOpen == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["open"]) : tempOpen; // 二级图标中的node节点open图标 } else { this.usefontStyle.snode.node.open = ifont + " " + open; } if(typeof close === 'undefined') { this.usefontStyle.snode.node.close = (tempClose == "") ? (ifont + " " + this.nodeIconArray[this.nodeIcon]["close"]) : tempClose; // 二级图标中的node节点close图标 } else { this.usefontStyle.snode.node.close = ifont + " " + close; } } if(typeof leaf === 'undefined') { this.usefontStyle.snode.leaf = (tempLeaf == "") ? (ifont + " " + this.leafIconArray[this.leafIcon]) : tempLeaf; // 二级图标中的leaf节点图标 } else { this.usefontStyle.snode.leaf = ifont + " " + leaf; } } }; // 赋值复选框图标 DTree.prototype.useDefaultOrUserDefineCheckboxStyle = function(ifont, checkbox){ var _this = this; var tempOn = this.usefontStyle.checkbox.on; var tempOut = this.usefontStyle.checkbox.out; var tempNoall = this.usefontStyle.checkbox.noall; if(typeof checkbox === 'undefined'){ this.usefontStyle.checkbox.on = (tempOn == "") ? (ifont + " " + LI_DIV_CHECKBAR_ON) : tempOn; this.usefontStyle.checkbox.out = (tempOut == "") ? (ifont + " " + LI_DIV_CHECKBAR_OUT) : tempOut; this.usefontStyle.checkbox.noall = (tempNoall == "") ? (ifont + " " + LI_DIV_CHECKBAR_NOALL) : tempNoall; } else { var on = checkbox.on; var out = checkbox.out; var noall = checkbox.noall; if(typeof on === 'undefined') { this.usefontStyle.checkbox.on = (tempOn == "") ? (ifont + " " + LI_DIV_CHECKBAR_ON) : tempOn; } else { this.usefontStyle.checkbox.on = ifont + " " + on; } if(typeof out === 'undefined') { this.usefontStyle.checkbox.out = (tempOut == "") ? (ifont + " " + LI_DIV_CHECKBAR_OUT) : tempOut; } else { this.usefontStyle.checkbox.out = ifont + " " + out; } if(typeof noall === 'undefined') { this.usefontStyle.checkbox.noall = (tempNoall == "") ? (ifont + " " + LI_DIV_CHECKBAR_NOALL) : tempNoall; } else { this.usefontStyle.checkbox.noall = ifont + " " + noall; } } }; // 赋值菜单栏图标 DTree.prototype.useDefaultOrUserDefineMenubarStyle = function(ifont, menubar){ var _this = this; var tempMovedown = this.usefontStyle.menubar.movedown; var tempMoveup = this.usefontStyle.menubar.moveup; var tempRefresh = this.usefontStyle.menubar.refresh; var tempCheckAll = this.usefontStyle.menubar.checkAll; var tempUncheckAll = this.usefontStyle.menubar.unCheckAll; var tempInvertAll = this.usefontStyle.menubar.invertAll; var tempRemove = this.usefontStyle.menubar.remove; var tempSearch = this.usefontStyle.menubar.search; if(typeof menubar === 'undefined'){ this.usefontStyle.menubar.movedown = (tempMovedown == "") ? (ifont + " " + LI_DIV_MENUBAR_DOWN) : tempMovedown; this.usefontStyle.menubar.moveup = (tempMoveup == "") ? (ifont + " " + LI_DIV_MENUBAR_UP) : tempMoveup; this.usefontStyle.menubar.refresh = (tempRefresh == "") ? (ifont + " " + LI_DIV_MENUBAR_REFRESH) : tempRefresh; this.usefontStyle.menubar.checkAll = (tempCheckAll == "") ? (ifont + " " + LI_DIV_MENUBAR_CHECKALL) : tempCheckAll; this.usefontStyle.menubar.unCheckAll = (tempUncheckAll == "") ? (ifont + " " + LI_DIV_MENUBAR_UNCHECKALL) : tempUncheckAll; this.usefontStyle.menubar.invertAll = (tempInvertAll == "") ? (ifont + " " + LI_DIV_MENUBAR_INVERTALL) : tempInvertAll; this.usefontStyle.menubar.remove = (tempRemove == "") ? (ifont + " " + LI_DIV_MENUBAR_DELETE) : tempRemove; this.usefontStyle.menubar.search = (tempSearch == "") ? (ifont + " " + LI_DIV_MENUBAR_SEARCH) : tempSearch; } else { var movedown = menubar.movedown; var moveup = menubar.moveup; var refresh = menubar.refresh; var checkAll = menubar.checkAll; var unCheckAll = menubar.unCheckAll; var invertAll = menubar.invertAll; var remove = menubar.remove; var search = menubar.search; if(typeof movedown === 'undefined') { this.usefontStyle.menubar.movedown = (tempMovedown == "") ? (ifont + " " + LI_DIV_MENUBAR_DOWN) : tempMovedown; } else { this.usefontStyle.menubar.movedown = ifont + " " + movedown; } if(typeof moveup === 'undefined') { this.usefontStyle.menubar.moveup = (tempMoveup == "") ? (ifont + " " + LI_DIV_MENUBAR_UP) : tempMoveup; } else { this.usefontStyle.menubar.moveup = ifont + " " + moveup; } if(typeof refresh === 'undefined') { this.usefontStyle.menubar.refresh = (tempRefresh == "") ? (ifont + " " + LI_DIV_MENUBAR_REFRESH) : tempRefresh; } else { this.usefontStyle.menubar.refresh = ifont + " " + refresh; } if(typeof checkAll === 'undefined') { this.usefontStyle.menubar.checkAll = (tempCheckAll == "") ? (ifont + " " + LI_DIV_MENUBAR_CHECKALL) : tempCheckAll; } else { this.usefontStyle.menubar.checkAll = ifont + " " + checkAll; } if(typeof unCheckAll === 'undefined') { this.usefontStyle.menubar.unCheckAll = (tempUncheckAll == "") ? (ifont + " " + LI_DIV_MENUBAR_UNCHECKALL) : tempUncheckAll; } else { this.usefontStyle.menubar.unCheckAll = ifont + " " + unCheckAll; } if(typeof invertAll === 'undefined') { this.usefontStyle.menubar.invertAll = (tempInvertAll == "") ? (ifont + " " + LI_DIV_MENUBAR_INVERTALL) : tempInvertAll; } else { this.usefontStyle.menubar.invertAll = ifont + " " + invertAll; } if(typeof remove === 'undefined') { this.usefontStyle.menubar.remove = (tempRemove == "") ? (ifont + " " + LI_DIV_MENUBAR_DELETE) : tempRemove; } else { this.usefontStyle.menubar.remove = ifont + " " + remove; } if(typeof search === 'undefined') { this.usefontStyle.menubar.search = (tempSearch == "") ? (ifont + " " + LI_DIV_MENUBAR_SEARCH) : tempSearch; } else { this.usefontStyle.menubar.search = ifont + " " + search; } } }; // 赋值扩展菜单栏图标 DTree.prototype.useDefaultOrUserDefineMenubarExtStyle = function(ifont, menubarExt){ var _this = this; var tempExt = this.usefontStyle.menubarExt; if(typeof menubarExt === 'undefined'){ this.usefontStyle.menubarExt = (tempExt == "") ? ifont : tempExt; } else { this.usefontStyle.menubarExt = menubarExt; } }; // 赋值工具栏图标 DTree.prototype.useDefaultOrUserDefineToolbarStyle = function(ifont, toolbar){ var _this = this; var tempMovedown = this.usefontStyle.toolbar.menubar.movedown; var tempMoveup = this.usefontStyle.toolbar.menubar.moveup; var tempRefresh = this.usefontStyle.toolbar.menubar.refresh; var tempCheckAll = this.usefontStyle.toolbar.menubar.checkAll; var tempUnCheckAll = this.usefontStyle.toolbar.menubar.unCheckAll; var tempInvertAll = this.usefontStyle.toolbar.menubar.invertAll; var tempRemove = this.usefontStyle.toolbar.menubar.remove; var tempSearch = this.usefontStyle.toolbar.menubar.search; var tempExt = this.usefontStyle.toolbar.menubarExt; var tempPulldown = this.usefontStyle.toolbar.pulldown; var tempPullup = this.usefontStyle.toolbar.pullup; var tempAdd = this.usefontStyle.toolbar.add; var tempEdit = this.usefontStyle.toolbar.edit; var tempDel = this.usefontStyle.toolbar.del; if(typeof toolbar === 'undefined'){ this.usefontStyle.toolbar.menubar.movedown = (tempMovedown == "") ? (ifont + " " + this.usefontStyle.menubar.movedown) : tempMovedown; this.usefontStyle.toolbar.menubar.moveup = (tempMoveup == "") ? (ifont + " " + this.usefontStyle.menubar.moveup) : tempMoveup; this.usefontStyle.toolbar.menubar.refresh = (tempRefresh == "") ? (ifont + " " + this.usefontStyle.menubar.refresh) : tempRefresh; this.usefontStyle.toolbar.menubar.checkAll = (tempCheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.checkAll) : tempCheckAll; this.usefontStyle.toolbar.menubar.unCheckAll = (tempUnCheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.unCheckAll) : tempUnCheckAll; this.usefontStyle.toolbar.menubar.invertAll = (tempInvertAll == "") ? (ifont + " " + this.usefontStyle.menubar.invertAll) : tempInvertAll; this.usefontStyle.toolbar.menubar.remove = (tempRemove == "") ? (ifont + " " + this.usefontStyle.menubar.remove) : tempRemove; this.usefontStyle.toolbar.menubar.search = (tempSearch == "") ? (ifont + " " + this.usefontStyle.menubar.search) : tempSearch; this.usefontStyle.toolbar.menubarExt = (tempExt == "") ? this.usefontStyle.menubarExt : tempExt; this.usefontStyle.toolbar.pulldown = (tempPulldown == "") ? (ifont + " " + LI_DIV_TOOLBAR_PULLDOWN) : tempPulldown; this.usefontStyle.toolbar.pullup = (tempPullup == "") ? (ifont + " " + LI_DIV_TOOLBAR_PULLUP) : tempPullup; this.usefontStyle.toolbar.add = (tempAdd == "") ? (ifont + " " + LI_DIV_TOOLBAR_ADD) : tempAdd; this.usefontStyle.toolbar.edit = (tempEdit == "") ? (ifont + " " + LI_DIV_TOOLBAR_EDIT) : tempEdit; this.usefontStyle.toolbar.del = (tempDel == "") ? (ifont + " " + LI_DIV_TOOLBAR_DEL) : tempDel; } else { var menubar = toolbar.menubar; var menubarExt = toolbar.menubarExt; var pulldown = toolbar.pulldown; var pullup = toolbar.pullup; var add = toolbar.add; var edit = toolbar.edit; var del = toolbar.del; if(typeof menubar === 'undefined'){ this.usefontStyle.toolbar.menubar.movedown = (tempMovedown == "") ? (ifont + " " + this.usefontStyle.menubar.movedown) : tempMovedown; this.usefontStyle.toolbar.menubar.moveup = (tempMoveup == "") ? (ifont + " " + this.usefontStyle.menubar.moveup) : tempMoveup; this.usefontStyle.toolbar.menubar.refresh = (tempRefresh == "") ? (ifont + " " + this.usefontStyle.menubar.refresh) : tempRefresh; this.usefontStyle.toolbar.menubar.checkAll = (tempCheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.checkAll) : tempCheckAll; this.usefontStyle.toolbar.menubar.unCheckAll = (tempUncheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.unCheckAll) : tempUncheckAll; this.usefontStyle.toolbar.menubar.invertAll = (tempInvertAll == "") ? (ifont + " " + this.usefontStyle.menubar.invertAll) : tempInvertAll; this.usefontStyle.toolbar.menubar.remove = (tempRemove == "") ? (ifont + " " + this.usefontStyle.menubar.remove) : tempRemove; this.usefontStyle.toolbar.menubar.search = (tempSearch == "") ? (ifont + " " + this.usefontStyle.menubar.search) : tempSearch; } else { var movedown = menubar.movedown; var moveup = menubar.moveup; var refresh = menubar.refresh; var checkAll = menubar.checkAll; var unCheckAll = menubar.unCheckAll; var invertAll = menubar.invertAll; var remove = menubar.remove; var search = menubar.search; if(typeof movedown === 'undefined') { this.usefontStyle.toolbar.menubar.movedown = (tempMovedown == "") ? (ifont + " " + this.usefontStyle.menubar.movedown) : tempMovedown; } else { this.usefontStyle.toolbar.menubar.movedown = ifont + " " + movedown; } if(typeof moveup === 'undefined') { this.usefontStyle.toolbar.menubar.moveup = (tempMoveup == "") ? (ifont + " " + this.usefontStyle.menubar.moveup) : tempMoveup; } else { this.usefontStyle.toolbar.menubar.moveup = ifont + " " + moveup; } if(typeof refresh === 'undefined') { this.usefontStyle.toolbar.menubar.refresh = (tempRefresh == "") ? (ifont + " " + this.usefontStyle.menubar.refresh) : tempRefresh; } else { this.usefontStyle.toolbar.menubar.refresh = ifont + " " + refresh; } if(typeof checkAll === 'undefined') { this.usefontStyle.toolbar.menubar.checkAll = (tempCheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.checkAll) : tempCheckAll; } else { this.usefontStyle.toolbar.menubar.checkAll = ifont + " " + checkAll; } if(typeof unCheckAll === 'undefined') { this.usefontStyle.toolbar.menubar.unCheckAll = (tempUncheckAll == "") ? (ifont + " " + this.usefontStyle.menubar.unCheckAll) : tempUncheckAll; } else { this.usefontStyle.toolbar.menubar.unCheckAll = ifont + " " + unCheckAll; } if(typeof invertAll === 'undefined') { this.usefontStyle.toolbar.menubar.invertAll = (tempInvertAll == "") ? (ifont + " " + this.usefontStyle.menubar.invertAll) : tempInvertAll; } else { this.usefontStyle.toolbar.menubar.invertAll = ifont + " " + invertAll; } if(typeof remove === 'undefined') { this.usefontStyle.toolbar.menubar.remove = (tempRemove == "") ? (ifont + " " + this.usefontStyle.menubar.remove) : tempRemove; } else { this.usefontStyle.toolbar.menubar.remove = ifont + " " + remove; } if(typeof search === 'undefined') { this.usefontStyle.toolbar.menubar.search = (tempSearch == "") ? (ifont + " " + this.usefontStyle.menubar.search) : tempSearch; } else { this.usefontStyle.toolbar.menubar.search = ifont + " " + search; } } if(typeof menubarExt === 'undefined'){ this.usefontStyle.toolbar.menubarExt = (tempExt == "") ? this.usefontStyle.menubarExt : tempExt; } else { this.usefontStyle.toolbar.menubarExt = menubarExt; } if(typeof pulldown === 'undefined'){ this.usefontStyle.toolbar.pulldown = (tempPulldown == "") ? (ifont + " " + LI_DIV_TOOLBAR_PULLDOWN) : tempPulldown; } else { this.usefontStyle.toolbar.pulldown = ifont + " " + pulldown; } if(typeof pullup === 'undefined'){ this.usefontStyle.toolbar.pullup = (tempPullup == "") ? (ifont + " " + LI_DIV_TOOLBAR_PULLUP) : tempPullup; } else { this.usefontStyle.toolbar.pullup = ifont + " " + pullup; } if(typeof add === 'undefined'){ this.usefontStyle.toolbar.add = (tempAdd == "") ? (ifont + " " + LI_DIV_TOOLBAR_ADD) : tempAdd; } else { this.usefontStyle.toolbar.add = ifont + " " + add; } if(typeof edit === 'undefined'){ this.usefontStyle.toolbar.edit = (tempEdit == "") ? (ifont + " " + LI_DIV_TOOLBAR_EDIT) : tempEdit; } else { this.usefontStyle.toolbar.edit = ifont + " " + edit; } if(typeof del === 'undefined'){ this.usefontStyle.toolbar.del = (tempDel == "") ? (ifont + " " + LI_DIV_TOOLBAR_DEL) : tempDel; } else { this.usefontStyle.toolbar.del = ifont + " " + del; } } }; // 赋值扩展工具栏图标 DTree.prototype.useDefaultOrUserDefineToolbarExtStyle = function(ifont, toolbarExt){ var _this = this; var tempExt = this.usefontStyle.toolbarExt; if(typeof toolbarExt === 'undefined'){ this.usefontStyle.toolbarExt = (tempExt == "") ? ifont : tempExt; } else { this.usefontStyle.toolbarExt = toolbarExt; } }; // 设置图标的展开关闭,以及展开时/关闭时是最后一级图标的处理 DTree.prototype.operateIcon = function($i_spread, $i_node){ var _this = this; var ficonClass = $i_spread.attr("data-iconClass"); var iconClass = $i_node.attr("data-iconClass"); return{ open: function(){ $i_spread.attr("data-spread","open"); $i_node.attr("data-spread","open"); if(!ficonClass) { $i_spread.removeClass(_this.usefontStyle.fnode.node.close); $i_spread.addClass(_this.usefontStyle.fnode.node.open); } if(!iconClass) { $i_node.removeClass(_this.usefontStyle.snode.node.close); $i_node.addClass(_this.usefontStyle.snode.node.open); } }, close: function(){ $i_spread.attr("data-spread","close"); $i_node.attr("data-spread","close"); if(!ficonClass) { $i_spread.removeClass(_this.usefontStyle.fnode.node.open); $i_spread.addClass(_this.usefontStyle.fnode.node.close); } if(!iconClass) { $i_node.removeClass(_this.usefontStyle.snode.node.open); $i_node.addClass(_this.usefontStyle.snode.node.close); } }, openWithLeaf: function(){ $i_spread.attr("data-spread","open"); $i_node.attr("data-spread","open"); if(!ficonClass) { $i_spread.removeClass(_this.usefontStyle.fnode.leaf); $i_spread.addClass(_this.usefontStyle.fnode.node.open); } if(!iconClass) { $i_node.removeClass(_this.usefontStyle.snode.leaf); $i_node.addClass(_this.usefontStyle.snode.node.open); } }, closeWithLeaf: function(){ $i_spread.attr("data-spread","last"); $i_node.attr("data-spread","last"); if(!ficonClass) { $i_spread.removeClass(_this.usefontStyle.fnode.node.open); $i_spread.removeClass(_this.usefontStyle.fnode.node.close); $i_spread.addClass(_this.usefontStyle.fnode.leaf); } if(!iconClass) { $i_node.removeClass(_this.usefontStyle.snode.node.open); $i_node.removeClass(_this.usefontStyle.snode.node.close); $i_node.addClass(_this.usefontStyle.snode.leaf); } } } }; // 显示树线 DTree.prototype.showLine = function($lis){ var _this = this; if(_this.line){ if($lis && $lis.length > 0) { $lis.each(function(){ _this.showLineLi($(this)); }); } else { _this.obj.find("li[data-id]").each(function(){ _this.showLineLi($(this)); }); } } } // 真正显示树线的方法 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); } } } } /******************** 初始化数据区域 ********************/ // 设置高度 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"); } } }; // 重载树 DTree.prototype.reload = function(options){ var _this = this; _this.reloadSetting(options); _this.init(); }; // 初始化树 DTree.prototype.init = function(){ var _this = this; if (typeof _this !== "object") { //_this.obj.html(_this.getNoneDom().errText("树组件未成功加载,请检查配置")); layer.msg("树组件未成功加载,请检查配置", {icon:5}); return ; } // 设置组件高度 _this.autoHeight(); if(_this.data) { if(typeof _this.data.length === 'undefined'){ //_this.obj.html(_this.getNoneDom().errText("数据解析异常,data数据格式不正确")); layer.msg("数据解析异常,data数据格式不正确", {icon:5}); return ; } if(_this.data.length == 0) { _this.obj.html(_this.getNoneDom().text()); return ; } //先将ul中的元素清空 _this.obj.html(""); setTimeout(function () { // 加载完毕后执行树解析前的回调 _this.success(_this.data, _this.obj); // 第一次解析树 if (_this.dataFormat == 'list'){ //1.识别根节点ul中的data-id标签,判断顶级父节点 var pid = _this.obj.attr("data-id"); //2.构建一个存放节点的树组 var rootListData = _this.queryListTreeByPid(pid, _this.data); _this.loadListTree(rootListData, _this.data, 1); } else { _this.loadTree(_this.data, 1); } // 显示树线 _this.showLine(); // 这种情况下需要一开始就将toolbar显示在页面上 if(_this.toolbar && _this.toolbarWay != 'contextmenu') { _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu); } // 判断是否存在错误数据,并是否打印错误数据 _this.msgErrData(); // 设置复选框的初始值 if(_this.select){ _this.selectVal(_this.selectInitVal); } // 保存树副本 _this.bak = _this.obj.html(); // 加载完毕后的回调 _this.done(_this.data, _this.obj); }, 100); } else { if (!_this.url) { //_this.obj.html(_this.getNoneDom().errText("数据请求异常,url参数未指定")); layer.msg("数据请求异常,url参数未指定", {icon:5}); return ; } //先将ul中的元素清空 _this.obj.html(""); var index = _this.load ? layer.load(1) : ""; 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()), success: function(result) { if (typeof result === 'string') { result = $.parseJSON(result); } // 加载完毕后执行树解析前的回调 _this.success(result, _this.obj); 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(typeof d.length === 'undefined'){ _this.obj.html(_this.getNoneDom().errText("数据解析异常,url回调后的数据格式不正确")); //layer.msg("数据解析异常,url回调后的数据格式不正确", {icon:5}); return ; } if(d.length == 0) { _this.obj.html(_this.getNoneDom().text()); return ; } // 第一次解析树 if (_this.dataFormat == 'list'){ //1.识别根节点ul中的data-id标签,判断顶级父节点 var pid = _this.obj.attr("data-id"); //2.构建一个存放节点的树组 var rootListData = _this.queryListTreeByPid(pid, d); _this.loadListTree(rootListData, d, 1); } else { _this.loadTree(d, 1); } // 显示树线 _this.showLine(); // 这种情况下需要一开始就将toolbar显示在页面上 if(_this.toolbar && _this.toolbarWay != 'contextmenu') { _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu); } // 判断是否存在错误数据,并是否打印错误数据 _this.msgErrData(); // 设置复选框的初始值 if(_this.select){ _this.selectVal(_this.selectInitVal); } // 保存树副本 _this.bak = _this.obj.html(); // 加载完毕后的回调 _this.done(result, _this.obj); } else { // 如果打印不出任何信息说明是在这里,用了错误的数据格式, 或返回码不正确 if (_this.dataStyle == 'layuiStyle'){ _this.obj.html(_this.getNoneDom().errText(result[_this.response.message])); _this.error(null, code, result[_this.response.message]); //layer.msg(result[_this.response.message], {icon:2}); } else { _this.obj.html(_this.getNoneDom().errText(result.status[_this.response.message])); _this.error(null, code, result.status[_this.response.message]); //layer.msg(result.status[_this.response.message], {icon:2}); } } }, 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); } }); } }; // 加载子节点 DTree.prototype.getChild = function($div, data) { var _this = this, $ul = $div.next("ul"); _this.setNodeParam($div); if(typeof data !== 'undefined') { if(typeof data.length === 'undefined'){ //_this.obj.html(_this.getNoneDom().errText("数据解析异常,data数据格式不正确")); layer.msg("数据解析异常,data数据格式不正确", {icon:5}); return ; } //先将ul中的元素清空 $ul.html(""); // 解析树 if (_this.dataFormat == 'list'){ var pid = _this.node.nodeId; var level = parseInt(_this.node.level)+1; var listData = _this.queryListTreeByPid(pid, data); _this.loadListTree(listData, _this.data, level); } else { _this.loadTree(data, level); } // 显示树线 _this.showLine(); // 这种情况下需要一开始就将toolbar显示在页面上 if(_this.toolbar && _this.toolbarWay != 'contextmenu') { _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu); } // 判断是否存在错误数据,并是否打印错误数据 _this.msgErrData(); // 保存树副本 _this.bak = _this.obj.html(); } else { if (!_this.url) { //_this.obj.html(_this.getNoneDom().errText("数据请求异常,url参数未指定")); layer.msg("数据请求异常,url参数未指定", {icon:5}); return ; } $ul.html(""); var index = _this.load ? layer.load(1) : ""; AjaxHelper.request({ async: _this.async, headers: _this.headers, type: _this.method, url: _this.url, dataType: _this.dataType, withCredentials: _this.withCredentials, data: _this.getFilterRequestParam(_this.getRequestParam()), success: function(result) { if (typeof result === 'string') { result = $.parseJSON(result); } var code = ""; if (_this.dataStyle == 'layuiStyle'){ code = result[_this.response.statusName]; } else { code = result.status[_this.response.statusName]; } if (code == _this.response.statusCode) { // 解析树 var pid = _this.node.nodeId; var level = parseInt(_this.node.level)+1; if (_this.dataFormat == 'list'){ var pListData = _this.queryListTreeByPid(pid, result[_this.response.rootName]); _this.loadListTree(pListData, result[_this.response.rootName], level, $ul); } else { _this.loadTree(result[_this.response.rootName], level, $ul); } // 显示树线 _this.showLine(); // 这种情况下需要一开始就将toolbar显示在页面上 if(_this.toolbar && _this.toolbarWay != 'contextmenu') { _this.setToolbarDom().setToolbarPlace(_this.toolbarMenu); } // 判断是否存在错误数据,并是否打印错误数据 _this.msgErrData(); $ul.addClass(NAV_SHOW); // 保存树副本 _this.bak = _this.obj.html(); } else { if (_this.dataStyle == 'layuiStyle'){ _this.obj.html(_this.getNoneDom().errText(result[_this.response.message])); _this.error(null, code, result[_this.response.message]); //layer.msg(result[_this.response.message], {icon:2}); } else { _this.obj.html(_this.getNoneDom().errText(result.status[_this.response.message])); _this.error(null, code, result.status[_this.response.message]); //layer.msg(result.status[_this.response.message], {icon:2}); } } }, 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); } }); } }; // 初始化树或者拼接树 DTree.prototype.loadListTree = function(pListData, listData, level, $ul){ var _this = this; $ul = $ul || _this.getNodeDom().nowOrRootUl(); //当前选中的节点或根节点 if (pListData.length > 0){ for (var i = 0; i < pListData.length; i++) { // 1.获取已知节点的全部数据 var data = pListData[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()+"']")); } } } }; // 根据父ID查找list数据中匹配的元素 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; }; // 初始化树或者拼接树 DTree.prototype.loadTree = function(root, level, $ul){ var _this = this; if (root) { $ul = $ul || _this.getNodeDom().nowOrRootUl(); //当前选中的节点或根节点 for (var i = 0; i < root.length; i++) { // 遍历跟节点或追加的跟节点 var data = root[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()+"']")); } } } }; // 判断在数据加载时是否存在错误数据,并是否打印错误数据 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 = []; }; // 解析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; } } }; //当无节点数据时显示dom DTree.prototype.getNoneDom = function(){ var _this = this, rootId = _this.obj[0].id, noneTitle = _this.none; return { text: function(){ return "<div class='"+NONETITLE+"' dtree-id='"+rootId+"'>"+noneTitle+"</div>"; }, errText: function(errInfo){ return "<div class='"+NONETITLE+"' dtree-id='"+rootId+"'>"+errInfo+"</div>"; } } }; //新增节点的dom值 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 ? "<i class='"+fleafIconLeaf+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : (spread ? "<i class='"+fnodeIconOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+fnodeIconClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>"); } if(fnodeIcon != "-1" && fleafIcon == "-1"){ // 加载node 隐藏leaf return last ? "<i class='"+fleafIconLeaf+" "+ICON_HIDE+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : (spread ? "<i class='"+fnodeIconOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+fnodeIconClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>"); } if(fnodeIcon == "-1" && fleafIcon != "-1"){ // 隐藏node 加载leaf return last ? "<i class='"+fleafIconLeaf+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : (spread ? "<i class='"+fnodeIconOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+fnodeIconClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>"); } if(fnodeIcon == "-1" && fleafIcon == "-1"){ // 都隐藏 return last ? "<i class='"+fleafIconLeaf+" "+ICON_HIDE+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' style='display:none;'></i>" : (spread ? "<i class='"+fnodeIconOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+fnodeIconClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>"); } }, 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 ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>"); } if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf return last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>"); } if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf return last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>"); } if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏 return last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>"); } }, checkbox: function() { // 复选框 var flag = false; if(_this.checkbarLoad == "node"){if (checkbar) {flag = true;}} else {if (last) {if (checkbar) {flag = true;}}} if(flag){ var result = "<div class='"+LI_DIV_CHECKBAR+"' data-id='"+treeId+"' dtree-id='"+rootId+"'>"; if(checkArr && checkArr.length > 0){ for (var i = 0; i < checkArr.length; i++) { var checkData = checkArr[i]; var checked = checkData.checked; 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 += "<i class='"+CHOOSE_CLASS+" "+_this.style.dfont+" "+_this.style.cbox+" "+disClass+"' data-id='"+treeId+"' dtree-id='"+rootId+"' data-checked='"+checkData.checked+"' data-initchecked='"+checkData.checked+"' data-type='"+checkData.type+"' dtree-click='"+eventName.checkNodeClick+"' data-par='."+LI_CLICK_CHECKBAR+"' dtree-disabled='"+disabled+"'></i>"; } } result += "</div>"; return result; } return ""; }, text: function() { // 文字显示 var disClass = ""; if(disabled){disClass = NAV_DIS;} return "<cite class='"+LI_DIV_TEXT_CLASS+" "+disClass+"' data-id='"+treeId+"' data-leaf='"+(last ? "leaf" : "node")+"' dtree-disabled='"+disabled+"' data-title='"+title+"' >"+fmtTitle+"</cite>"; }, ul: function() { //子节点ul return last ? "<ul class='"+LI_NAV_CHILD+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>" : (spread ? "<ul class='"+LI_NAV_CHILD+" "+NAV_SHOW+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>" : "<ul class='"+LI_NAV_CHILD+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>"); } }; }; //替换节点的dom值,或指定值 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 ? "<i class='"+fleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+fnodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+fnodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>"); }else if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf fnode = last ? "<i class='"+fleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+fnodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+fnodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>"); }else if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf fnode = last ? "<i class='"+fleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+fnodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+fnodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>"); }else if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏 fnode = last ? "<i class='"+fleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+fnodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+fnodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+ficonClass+"'></i>"); } 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 ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>"); }else if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf snode = last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>"); }else if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf snode = last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>"); }else if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏 snode = last ? "<i class='"+sleafIconLeaf+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : (spread ? "<i class='"+snodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>" : "<i class='"+snodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"' data-iconClass='"+iconClass+"'></i>"); } 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 = "<div class='"+LI_DIV_CHECKBAR+"' data-id='"+treeId+"' dtree-id='"+rootId+"'>"; if(checkArr && checkArr.length > 0){ for (var i = 0; i < checkArr.length; i++) { var checkData = checkArr[i]; var checked = checkData.checked; 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 += "<i class='"+CHOOSE_CLASS+" "+_this.style.dfont+" "+_this.style.cbox+" "+disClass+"' data-id='"+treeId+"' dtree-id='"+rootId+"' data-checked='"+checkData.checked+"' data-initchecked='"+checkData.checked+"' data-type='"+checkData.type+"' dtree-click='"+eventName.checkNodeClick+"' data-par='."+LI_CLICK_CHECKBAR+"' dtree-disabled='"+disabled+"'></i>"; } } result += "</div>"; _this.getNodeDom($div).snode().next("div").replaceWith($(result)); } }, text: function(title) { // 文字显示 var disClass = ""; if(disabled){disClass = NAV_DIS;} var cite = "<cite class='"+LI_DIV_TEXT_CLASS+" "+disClass+"' data-id='"+treeId+"' data-leaf='"+(last ? "leaf" : "node")+"' dtree-disabled='"+disabled+"' >"+title+"</cite>" _this.getNodeDom($div).cite().replaceWith($(cite)); }, ul: function() { //子节点ul var ul = last ? "<ul class='"+LI_NAV_CHILD+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>" : (spread ? "<ul class='"+LI_NAV_CHILD+" "+NAV_SHOW+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>" : "<ul class='"+LI_NAV_CHILD+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>"); _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; } }; }; // 获取拼接好的li DTree.prototype.getLiItemDom = function(treeId, parentId, title, fmtTitle, last, ficonClass, iconClass, checkArr, level, spread, disabled, hide, basicData, recordData, flag) { 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 = "<div class='"+LI_DIV_ITEM+" "+_this.style.item+"' data-id='"+treeId+"' dtree-id='"+rootId+"' dtree-click='"+eventName.itemNodeClick+"' data-basic='"+basicData+"' data-record='"+recordData+"' dtree-disabled='"+disabled+"' dtree-hide='"+hide+"' "; if(_this.toolbar){ if(_this.toolbarWay == "contextmenu") { if(_this.toolbarLoad == "node") { div += " d-contextmenu='true'>"; } 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 = ["<li " + "class='"+LI_CLICK_CHECKBAR+" "+LI_NAV_ITEM+" "+hideClass+" "+lineClass+"'" + "data-id='"+treeId+"'" + "data-pid='"+(flag == "root" ? ((typeof parentId !== undefined && parentId != "") ? parentId : "-1") : parentId)+"'" + "dtree-id='"+rootId+"'" + "data-index='"+level+"'" + "dtree-hide='"+hide+"'" +">" + div , dom.fnode(), dom.node(), dom.checkbox(), dom.text(), "</div>", dom.ul(), "</li>"].join(""); return li; }; // 初始化节点,用于数据回显 DTree.prototype.dataInit = function(chooseId){ var _this = this; var $div = _this.obj.find("div[data-id='"+chooseId+"']"); _this.getNodeDom($div).parentLi().find("."+NAV_THIS).removeClass(NAV_THIS); _this.getNodeDom($div).parentLi().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(); }; // 基于备份的Html数据回滚 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(); } }; /******************** 基础事件区域 ********************/ // 数据格式化 DTree.prototype.escape = function(html){ return event.escape(html); }; // 格式化数据转回正常数据 DTree.prototype.unescape = function(str){ return event.unescape(str); }; // 取消选中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); } // 选中div 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); } } // 手风琴模式操作其他节点 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_spread = _this.getNodeDom($div).fnode(), $i_node = _this.getNodeDom($div).snode(); if($i_spread.attr("data-spread") != 'last'){ _this.operateIcon($i_spread, $i_node).close(); } } } } }; // 展开或隐藏节点 作用点: div DTree.prototype.clickSpread = function($div) { var _this = this; var $i_spread = _this.getNodeDom($div).fnode(), $i_node = _this.getNodeDom($div).snode(), $cite = _this.getNodeDom($div).cite(), spread = $i_spread.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_spread, $i_node).open(); } else if (spread == "open") { $ul.removeClass(NAV_SHOW); _this.operateIcon($i_spread, $i_node).close(); } } }; // 设置节点为disabled DTree.prototype.setDisabledNodes = function(disabledIds){ var _this = this; var disabledId = disabledIds.split(","); for (var i=0; i<disabledId.length; i++) { var $div = _this.getNodeDom(disabledId[i]).div(); var $i = $div.children("div."+LI_DIV_CHECKBAR).children("i[data-par]"); var $cite = $div.children("cite[data-leaf]"); if($div != null && $div.attr("dtree-disabled") != "true") { $div.attr("dtree-disabled", "true"); $i.attr("dtree-disabled", "true"); $i.addClass(NAV_DIS); $cite.attr("dtree-disabled", "true"); $cite.addClass(NAV_DIS); } } }; // 设置全部节点为disabled DTree.prototype.setDisabledAllNodes = function(){ var _this = this; _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"']").each(function(){ var $div = $(this); var $i = $div.children("div."+LI_DIV_CHECKBAR).children("i[data-par]"); var $cite = $div.children("cite[data-leaf]"); if($div != null && $div.attr("dtree-disabled") != "true") { $div.attr("dtree-disabled", "true"); $i.attr("dtree-disabled", "true"); $i.addClass(NAV_DIS); $cite.attr("dtree-disabled", "true"); $cite.addClass(NAV_DIS); } }); }; // 将节点的disabled取消 DTree.prototype.cancelDisabledNodes = function(disabledIds){ var _this = this; var disabledId = disabledIds.split(","); for (var i=0; i<disabledId.length; i++) { var $div = _this.getNodeDom(disabledId[i]).div(); var $i = $div.children("div."+LI_DIV_CHECKBAR).children("i[data-par]"); var $cite = $div.children("cite[data-leaf]"); if($div != null && $div.attr("dtree-disabled") == "true") { $div.attr("dtree-disabled", "false"); $i.attr("dtree-disabled", "false"); $i.removeClass(NAV_DIS); $cite.attr("dtree-disabled", "false"); $cite.removeClass(NAV_DIS); } } }; // 获取指定disabled节点的值 DTree.prototype.getDisabledNodesParam = function(disabledIds){ var _this = this; var disabledId = disabledIds.split(","); var disabledNodes = []; for (var i=0; i<disabledId.length; i++) { var $div = _this.getNodeDom(disabledId[i]).div(); if($div != null && $div.attr("dtree-disabled") == "true") { disabledNodes.push(_this.getRequestParam(_this.getTempNodeParam($div))); } } return disabledNodes; }; // 获取全部disabled节点的值 DTree.prototype.getAllDisabledNodesParam = function(){ var _this = this; var disabledNodes = []; _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][dtree-disabled='true']").each(function(){ var $div = $(this); disabledNodes.push(_this.getRequestParam(_this.getTempNodeParam($div))); }); return disabledNodes; }; // 设置节点为hide DTree.prototype.setHideNodes = function(hideIds){ var _this = this; var hideId = hideIds.split(","); for (var i=0; i<hideId.length; i++) { var $div = _this.getNodeDom(hideId[i]).div(); var $li = $div.parent("li[dtree-hide]"); if($div != null && $div.attr("dtree-hide") != "true") { $div.attr("dtree-hide", "true"); $li.attr("dtree-hide", "true"); $li.addClass(NAV_HIDE); } } }; // 将节点的hide取消 DTree.prototype.cancelHideNodes = function(hideIds){ var _this = this; var hideId = hideIds.split(","); for (var i=0; i<hideId.length; i++) { var $div = _this.getNodeDom(hideId[i]).div(); var $li = $div.parent("li[dtree-hide]"); if($div != null && $div.attr("dtree-hide") == "true") { $div.attr("dtree-hide", "false"); $li.attr("dtree-hide", "false"); $li.removeClass(NAV_HIDE); } } }; // 获取指定hide节点的值 DTree.prototype.getHideNodesParam = function(hideIds){ var _this = this; var hideId = hideIds.split(","); var hideNodes = []; for (var i=0; i<hideId.length; i++) { var $div = _this.getNodeDom(hideId[i]).div(); if($div != null && $div.attr("dtree-hide") == "true") { hideNodes.push(_this.getRequestParam(_this.getTempNodeParam($div))); } } return hideNodes; }; // 获取全部hide节点的值 DTree.prototype.getAllHideNodesParam = function(){ var _this = this; var hideNodes = []; _this.obj.find("div[dtree-click='"+eventName.itemNodeClick+"'][dtree-hide='true']").each(function(){ var $div = $(this); hideNodes.push(_this.getRequestParam(_this.getTempNodeParam($div))); }); return hideNodes; }; // 刷新树 DTree.prototype.refreshTree = function(){ var _this = this; _this.obj.html(""); // 清空树结构 _this.initNodeParam(); // 清空参数 _this.init(); //执行初始化方法 } // 局部刷新树--新增子节点时 DTree.prototype.partialRefreshAdd = function($div, data){ var _this = this; $ul = $div.next("ul"); // 判断当前点击的节点是否是最后一级节点,如果是,则需要修改节点的样式 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(data) { if(data.length && data.length > 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")); } else { layer.msg("添加失败,节点ID为undefined!",{icon:5}); // 重新赋值 _this.setNodeParam($div); } } } else { _this.getChild($div); } } // 局部刷新树--编辑当前节点选中节点时 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); } } } // 局部刷新树--当前节点选中被删除时 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(); } /******************** 复选框区域 ********************/ // 初始化复选框的值 DTree.prototype.chooseDataInit = function(chooseIds){ var _this = this; var chooseId = chooseIds.split(","); for (var i=0; i<chooseId.length; i++) { _this.obj.find("i[dtree-click='"+eventName.checkNodeClick+"']").each(function(){ if ($(this).attr("data-id") == chooseId[i]) { _this.checkStatus($(this)).check(); } }); } // 展开选中节点的父节点 var $li_parents = _this.obj.find("i[dtree-click='"+eventName.checkNodeClick+"'][data-checked='1']").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.getCheckbarNodesParam(); }; //实现复选框点击,子集选中父级也选中 DTree.prototype.checkAllOrNot = function($i) { var _this = this; //$i 当前点击的checkbox var 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; 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(); } } }; //实现复选框点击, no-all 子集选中父级半选中,子集全选父级选中 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(); } } } }; //实现复选框点击,p-casc:父级选中子集全选,子集无法改变父级选中状态 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(); } }; //实现复选框点击,self:各自选中互不影响 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(); } }; //实现复选框点击,only:只能选中1个复选框 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(); } }; //实现复选框点击 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 = []; }; //复选框半选状态初始化设置 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(); } } } } }; //复选框选中状态初始化设置 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(); } } } }; // 设置复选框选中/未选中/半选 _this.checkStatus($i).check(); _this.checkStatus($i).noCheck(); _this.checkStatus($i).noallCheck(); 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"); } } }; // 设置树的复选框操作值的全部参数,并获取 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; }; // 获取树的复选框操作值的全部参数 DTree.prototype.getCheckbarNodesParam = function() { var _this = this; return _this.setAndGetCheckbarNodesParam(true); }; // 获取树的一个复选框的参数 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; }; // 获取基于返回参数的树的复选框参数 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<params.length; i++) { var param = params[i]; checkbarJsonArr["nodeId"].push(param["nodeId"]); checkbarJsonArr["parentId"].push(param["parentId"]); checkbarJsonArr["context"].push(param["context"]); checkbarJsonArr["leaf"].push(param["leaf"]); checkbarJsonArr["level"].push(param["level"]); checkbarJsonArr["spread"].push(param["spread"]); checkbarJsonArr["dataType"].push(param["dataType"]); checkbarJsonArr["checked"].push(param["checked"]); checkbarJsonArr["initchecked"].push(param["initchecked"]); checkbarJsonArr["basicData"].push(param["basicData"]); checkbarJsonArr["recordData"].push(param["recordData"]); } } checkbarJsonArr = _this.getRequestParam(checkbarJsonArr); return checkbarJsonArr; }; //判断复选框是否发生变更 DTree.prototype.changeCheckbarNodes = function(){ var flag = false; var _this = this; _this.obj.find("i[data-par]").each(function(){ var $i = $(this); $div = $i.closest("."+LI_DIV_ITEM); if ($i.attr("data-checked") != $i.attr("data-initchecked")) { flag = true; return true; } }); return flag; }; //点击节点选中/不选 复选框 DTree.prototype.clickNodeCheckbar = function(nodeId){ var _this = this; var $checkbar = _this.getNodeDom(nodeId).checkbox(); _this.temp = [$checkbar]; _this.changeCheck(); } //复选框全选 DTree.prototype.checkAllNode = function(nodeId){ var _this = this; var $i = _this.obj.find("i[data-par][data-checked!='1']"); if($i.length > 0) { _this.checkStatus($i).check(); } } //取消全部复选框选中 DTree.prototype.cancelCheckedNode = function(nodeId){ var _this = this; var $i = _this.obj.find("i[data-par][data-checked!='0']"); if($i.length > 0) { _this.checkStatus($i).noCheck(); } } //反选复选框 DTree.prototype.invertCheckedNode = function(nodeId){ var _this = this; if(_this.obj.find("i[data-par]").length > 0) { var b = false; _this.obj.find("i[data-par]").each(function(){ var $i = $(this); if($i.attr("data-checked") == '2'){ b = true; }else if($i.attr("data-checked") == '0') { _this.checkStatus($i).check(); }else if($i.attr("data-checked") == '1') { _this.checkStatus($i).noCheck(); } }); if(b) { _this.initNoAllCheck(); } else { _this.initAllCheck(); } } } //删除选中节点 DTree.prototype.removeCheckedNode = function(nodeId){ 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); }); } } /******************** 工具栏及菜单栏区域 ********************/ // 初始化菜单栏和工具栏的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("<div class='"+LI_DIV_MENUBAR+"' id='dtree_menubar_"+_this.obj[0].id+"'><div class='layui-btn-group'></div></div>"); if(_this.toolbar){ if(_this.toolbarWay == "contextmenu") { _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).remove(); _this.obj.before("<div class='"+LI_DIV_TOOLBAR+" layui-nav' id='dtree_toolbar_"+_this.obj[0].id+"'><div class='layui-nav-item'><dl class='layui-nav-child layui-anim'></dl></div></div>"); } } }; // 开启工具栏和菜单栏 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<mtbar.length; i++){ var mt = mtbar[i]; if(typeof mt === 'string'){ _this.getMenubarToolDom(mt); } if(typeof mt === 'object'){ _this.getExtMenubarToolDom(mt); } } } if(group && group.length > 0){ // 菜单栏吸附在上方的按钮组div中 for(var i=0; i<group.length; i++){ var gg = group[i]; if(typeof gg === 'string'){ ggMenu.push(_this.getMenubarDom(gg)); } if(typeof gg === 'object'){ ggMenu.push(_this.getExtMenubarDom(gg)); } } _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).children('div.layui-btn-group').append(ggMenu.join("")); } } }; /******************** 菜单栏区域 ********************/ // 获取菜单栏 DTree.prototype.getMenubarDom = function(menu){ var _this = this; var rootId = _this.obj[0].id; var gg = ""; switch (menu) { case defaultMenu.moveDown: gg = "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.moveDown+"' title='展开全部节点'><i class='"+_this.usefontStyle.menubar.movedown+"'></i></button>"; break; case defaultMenu.moveUp: gg = "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.moveUp+"' title='收缩全部节点'><i class='"+_this.usefontStyle.menubar.moveup+"'></i></button>"; break; case defaultMenu.refresh: gg = "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.refresh+"' title='刷新'><i class='"+_this.usefontStyle.menubar.refresh+"'></i></button>"; break; case defaultMenu.checkAll: gg = (_this.checkbar && _this.checkbarType != 'only') ? "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.checkAll+"' title='全选节点'><i class='"+_this.usefontStyle.menubar.checkAll+"'></i></button>" : ""; break; case defaultMenu.unCheckAll: gg = (_this.checkbar && _this.checkbarType != 'only') ? "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.unCheckAll+"' title='全不选节点'><i class='"+_this.usefontStyle.menubar.unCheckAll+"'></i></button>" : ""; break; case defaultMenu.invertAll: gg = (_this.checkbar && _this.checkbarType != 'only') ? "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.invertAll+"' title='反选节点'><i class='"+_this.usefontStyle.menubar.invertAll+"'></i></button>" : ""; break; case defaultMenu.remove: gg = (_this.checkbar) ? "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.remove+"' title='删除选中节点'><i class='"+_this.usefontStyle.menubar.remove+"'></i></button>" : ""; break; case defaultMenu.searchNode: gg = "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.searchNode+"' title='查询节点'><i class='"+_this.usefontStyle.menubar.search+"'></i></button>"; break; } return gg; }; // 获取扩展菜单栏 DTree.prototype.getExtMenubarDom = function(menu){ var _this = this; return "<button type='button' class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+_this.obj[0].id+"' d-menu='"+menu.menubarId+"' title='"+menu.title+"'><i class='"+_this.usefontStyle.menubarExt+" "+menu.icon+"'></i></button>"; }; // 获取依附在工具栏的菜单栏 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; } }; // 获取依附在工具栏的扩展菜单栏 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, ""); }; // 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_spread = _this.getNodeDom($div).fnode(), $i_node = _this.getNodeDom($div).snode(), $cite = _this.getNodeDom($div).cite(), spread = $i_spread.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_spread, $i_node).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_spread = _this.getNodeDom($div).fnode(), $i_node = _this.getNodeDom($div).snode(), $cite = _this.getNodeDom($div).cite(), spread = $i_spread.attr("data-spread"), leaf = $cite.attr("data-leaf"); $ul.removeClass(NAV_SHOW); _this.operateIcon($i_spread, $i_node).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; } } } } }; }; // menubar监听方法 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; } }; //模糊查询该值,展开该值节点 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; }; /******************** 工具栏区域 ********************/ // 获取工具栏 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<toolbarShow.length; i++){ var show = toolbarShow[i]; if(show == "pulldown"){ _this.toolbarMenu[defaultTool.pulldown] = _this.setToolbarDom().setToolbarOption(defaultTool.pulldown, _this.toolbarStyle.title, _this.usefontStyle.toolbar.pulldown, "展开"); } if(show == "pullup"){ _this.toolbarMenu[defaultTool.pullup] = _this.setToolbarDom().setToolbarOption(defaultTool.pullup, _this.toolbarStyle.title, _this.usefontStyle.toolbar.pullup, "收缩"); } if(show == "add"){ _this.toolbarMenu[defaultTool.addTool] = _this.setToolbarDom().setToolbarOption(defaultTool.addTool, _this.toolbarStyle.title, _this.usefontStyle.toolbar.add, "新增"); } if(show == "edit"){ _this.toolbarMenu[defaultTool.editTool] = _this.setToolbarDom().setToolbarOption(defaultTool.editTool, _this.toolbarStyle.title, _this.usefontStyle.toolbar.edit, "编辑"); } if(show == "delete"){ _this.toolbarMenu[defaultTool.delTool] = _this.setToolbarDom().setToolbarOption(defaultTool.delTool, _this.toolbarStyle.title, _this.usefontStyle.toolbar.del, "删除"); } } } if(toolbarExt.length > 0){ for(var i=0; i<toolbarExt.length; i++){ var ext = toolbarExt[i]; _this.toolbarMenu[ext.toolbarId] = _this.setToolbarDom().setToolbarOption(ext.toolbarId, ext.title, _this.usefontStyle.toolbarExt+" "+ext.icon, ""); } } }; // 设置工具栏按钮 DTree.prototype.setToolbarDom = function(){ var _this = this; var toolbarWay = _this.toolbarWay; return { setToolbarOption: function(toolbarId, title, classId, other){ if(toolbarWay == "contextmenu") { return "<dd><a dtree-tool='"+toolbarId+"'><i class='"+classId+"'></i> "+other +title+"</a></dd>"; } else if(toolbarWay == "fixed" || toolbarWay == "follow") { return "<a dtree-tool='"+toolbarId+"' title='"+other + title+"'><i class='"+classId+"'></i></a>"; } }, setMenuToolbarOption: function(menubarId, title, classId, other){ var rootId = _this.obj[0].id; if(toolbarWay == "contextmenu") { return "<dd><a dtree-id='"+rootId+"' d-menu='"+menubarId+"'><i class='"+classId+"'></i> "+other +title+"</a></dd>"; } else if(toolbarWay == "fixed" || toolbarWay == "follow") { return "<a dtree-id='"+rootId+"' d-menu='"+menubarId+"' title='"+other + title+"'><i class='"+classId+"'></i></a>"; } }, 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); }); } } } }; // 在节点后动态绑定fixed和follow条件的工具栏 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 = ["<em class='"+TOOLBAR_TOOL_EM+" "+hideCls+"'>"]; if(toolbarMenus){ for(var key in toolbarMenus){ em.push(toolbarMenus[key]); } } em.push("</em>"); $cite.after(em.join('')); } } // 隐藏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'); } } // 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_spread = _this.getNodeDom($div).fnode(), $i_node = _this.getNodeDom($div).snode(), $cite = _this.getNodeDom($div).cite(), spread = $i_spread.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_spread, $i_node).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_spread = _this.getNodeDom($div).fnode(), $i_node = _this.getNodeDom($div).snode(), $cite = _this.getNodeDom($div).cite(), spread = $i_spread.attr("data-spread"), leaf = $cite.attr("data-leaf"); $ul.removeClass(NAV_SHOW); _this.operateIcon($i_spread, $i_node).close(); }); } } }; // toolbar监听方法 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 = $cite.html(); 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_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; // 创建子节点的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; } } // 加载toolBar中的内容 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_form"}]; //2. 用户自定义的节点内容 var addNodeBar = ['<div class="'+TOOLBAR_TOOL+'"><form class="layui-form layui-form-pane" lay-filter="dtree_addNode_form">']; if(nodeBarContents != null && nodeBarContents.length > 0){ if(nodeBarContents[0] != null && nodeBarContents[0] != undefined && nodeBarContents[0].length > 0){ var addNodeBarContents = nodeBarContents[0]; // 1. 检查是否包含了now、newly、btn这三个默认项,将其他元素依次排列,将特殊元素至于栈顶 for(var i=0; i<addNodeBarContents.length; i++){ var defElem = addNodeBarContents[i].defElem; if(defElem == "nowChoose") { $.extend(addNodeBarDef[0], addNodeBarContents[i]); } else if(defElem == "nowChange") { $.extend(addNodeBarDef[1], addNodeBarContents[i]); } else if(defElem == "btn") { $.extend(addNodeBarDef[2], addNodeBarContents[i]); } else { addNodeBarDef.push(addNodeBarContents[i]); } } } } // 2. 遍历生成全部表单标签 for(var j=0; j<addNodeBarDef.length; j++){ var type = addNodeBarDef[j].type; if(!type){type = "text";} switch (type) { case "text": addNodeBar.push(_this.loadToolBarDetail(addNodeBarDef[j]).text()); break; case "textarea": addNodeBar.push(_this.loadToolBarDetail(addNodeBarDef[j]).textarea()); break; case "select": addNodeBar.push(_this.loadToolBarDetail(addNodeBarDef[j]).select()); break; case "hidden": addNodeBar.push(_this.loadToolBarDetail(addNodeBarDef[j]).hidden()); break; } } var addBtn = ['<div class="layui-form-item">', '<div class="layui-input-block" style="margin-left:0px;text-align:center;">']; // 3.遍历生成按钮 for(var j=0; j<addNodeBarDef.length; j++){ var type = addNodeBarDef[j].type; if(!type){type = "text";} switch (type) { case "submit": addBtn.push(_this.loadToolBarDetail(addNodeBarDef[j]).submit()); break; case "button": addBtn.push(_this.loadToolBarDetail(addNodeBarDef[j]).button()); break; case "reset": addBtn.push(_this.loadToolBarDetail(addNodeBarDef[j]).reset()); break; } } addBtn.push('</div></div>'); addNodeBar.push(addBtn.join('')); addNodeBar.push('</form></div>'); 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_form"}]; var editNodeBar = ['<div class="'+TOOLBAR_TOOL+'"><form class="layui-form layui-form-pane" lay-filter="dtree_editNode_form">']; //2. 用户自定义的节点内容 if(nodeBarContents != null && nodeBarContents.length > 0){ if(nodeBarContents[1] != null && nodeBarContents[1] != undefined && nodeBarContents[1].length > 0){ var editNodeBarContents = nodeBarContents[1]; // 1. 检查是否包含了now、newly、btn这三个默认项,将其他元素依次排列,将特殊元素至于栈顶 for(var i=0; i<editNodeBarContents.length; i++){ var defElem = editNodeBarContents[i].defElem; if(defElem == "nowChoose") { $.extend(editNodeBarDef[0], editNodeBarContents[i]); } else if(defElem == "nowChange") { $.extend(editNodeBarDef[1], editNodeBarContents[i]); } else if(defElem == "btn") { $.extend(editNodeBarDef[2], editNodeBarContents[i]); } else { editNodeBarDef.push(editNodeBarContents[i]); } } } } // 2. 遍历生成全部表单标签 for(var j=0; j<editNodeBarDef.length; j++){ var type = editNodeBarDef[j].type; if(!type){type = "text";} switch (type) { case "text": editNodeBar.push(_this.loadToolBarDetail(editNodeBarDef[j]).text()); break; case "textarea": editNodeBar.push(_this.loadToolBarDetail(editNodeBarDef[j]).textarea()); break; case "select": editNodeBar.push(_this.loadToolBarDetail(editNodeBarDef[j]).select()); break; case "hidden": editNodeBar.push(_this.loadToolBarDetail(editNodeBarDef[j]).hidden()); break; } } var editBtn = ['<div class="layui-form-item">', '<div class="layui-input-block" style="margin-left:0px;text-align:center;">']; // 3.遍历生成按钮 for(var j=0; j<editNodeBarDef.length; j++){ var type = editNodeBarDef[j].type; if(!type){type = "text";} switch (type) { case "submit": editBtn.push(_this.loadToolBarDetail(editNodeBarDef[j]).submit()); break; case "button": editBtn.push(_this.loadToolBarDetail(editNodeBarDef[j]).button()); break; case "reset": editBtn.push(_this.loadToolBarDetail(editNodeBarDef[j]).reset()); break; } } editBtn.push('</div></div>'); editNodeBar.push(editBtn.join('')); editNodeBar.push('</form></div>'); html = editNodeBar.join(''); break; } return html; }; // 获取toolbar详细的标签信息 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 ['<div class="layui-form-item">', '<label class="layui-form-label" title="'+nodeBarContents.label+'">'+nodeBarContents.label+':</label>', '<div class="layui-input-block f-input-par">', '<input type="text" class="layui-input f-input" value="'+val+'" placeholder="'+placeholder+'" lay-verify="'+verify+'" ', (id != "" ? 'id="'+id+'" ' : ''), (name != "" ? 'name="'+name+'" ' : ''), (readonly ? 'readonly ' : ''), (disabled ? 'disabled ' : ''), '/>', '</div>', '</div>'].join(''); }, textarea: function(){ return ['<div class="layui-form-item layui-form-text">', '<label class="layui-form-label" title="'+nodeBarContents.label+'">'+nodeBarContents.label+':</label>', '<div class="layui-input-block f-input-par">', '<textarea class="layui-textarea f-input" value="'+val+'" placeholder="'+placeholder+'" lay-verify="'+verify+'" ', (id != "" ? 'id="'+id+'" ' : ''), (name != "" ? 'name="'+name+'" ' : ''), (readonly ? 'readonly ' : ''), (disabled ? 'disabled ' : ''), '>'+val+'</textarea>', '</div>', '</div>'].join(''); }, hidden: function(){ return ['<input type="hidden" class="layui-input f-input" value="'+val+'" lay-verify="'+verify+'" ', (id != "" ? 'id="'+id+'" ' : ''), (name != "" ? 'name="'+name+'" ' : ''), (readonly ? 'readonly ' : ''), (disabled ? 'disabled ' : ''), '/>'].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 += "<option value='"+key+"' selected>"+optionsData[key]+"</option>"; } else { options += "<option value='"+key+"'>"+optionsData[key]+"</option>"; } } return ['<div class="layui-form-item">', '<label class="layui-form-label" title="'+nodeBarContents.label+'">'+nodeBarContents.label+':</label>', '<div class="layui-input-block f-input-par">', '<select lay-verify="'+verify+'" ', (id != "" ? 'id="'+id+'" ' : ''), (name != "" ? 'name="'+name+'" ' : ''), (readonly ? 'readonly ' : ''), (disabled ? 'disabled ' : ''), '>', options, '</select>', '</div>', '</div>'].join(''); }, submit: function(){ var filter = nodeBarContents.filter; return ['<button type="button" class="layui-btn layui-btn-normal btn-w100" lay-submit lay-filter="'+filter+'" ', (id != "" ? 'id="'+id+'" ' : ''), (name != "" ? 'name="'+name+'" ' : ''), '>'+val+'</button>'].join(''); }, button: function(){ return ['<button type="button" class="layui-btn layui-btn-normal btn-w100" ', (id != "" ? 'id="'+id+'" ' : ''), (name != "" ? 'name="'+name+'" ' : ''), ' >'+val+'</button>'].join(''); }, reset: function(){ return ['<button type="reset" class="layui-btn layui-btn-primary btn-w100" ', (id != "" ? 'id="'+id+'" ' : ''), (name != "" ? 'name="'+name+'" ' : ''), '>'+val+'</button>'].join(''); } } }; // 新增节点后改变节点内容 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'){ // 如果是设置为refresh参数,则向后台发送请求,获取新增节点下的真实参数,局部刷新树。 flag = true; } else if(typeof returnID === "string" || typeof returnID === 'number' || returnID == true){ $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 = []; // 临时变量制空 }; // 编辑页打开后显示编辑页内容 DTree.prototype.changeTreeNodeDone = function(param){ var _this = this; form.val('dtree_editNode_form', param); form.render(); }; // 修改节点后改变节点内容 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 = []; // 临时变量制空 }; // 删除节点后改变节点内容 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区域 ********************/ // 加载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; }; // 获取传递出去的参数,根据iframe.iframeDefaultRequest、iframe.iframeRequest和node拼出发出请求的参数 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; }; /******************** 数据回调区域 ********************/ // 根据具体的id获取基于当前id的div以及对应的其他dom元素 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"); } } }; // 获取当前选中节点下一个UL 或根节点。为了将新节点放入ul下 DTree.prototype.getNowNodeUl = function() { var _this = this; return _this.getNodeDom().nowOrRootUl(); }; // 获取当前选中节点 或第一个根节点。 DTree.prototype.getNowNode = function() { var _this = this; return _this.getNodeDom().nowOrRootDiv(); }; // 获取当前选中节点 无则返回null。 DTree.prototype.getNowNodeOrNull = function() { var _this = this; return _this.getNodeDom().nowDiv(); }; // 获取指定节点。 DTree.prototype.getNode = function(id) { var _this = this; return _this.getNodeDom(id).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; } }; // 获取当前选中节点的全部参数 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; }; // 获取一个临时的node参数 DTree.prototype.getTempNodeParam = function($div) { var _this = this; var temp_node = {}; var test = $div.next("ul").find("li."+LI_NAV_ITEM+" div."+LI_DIV_ITEM); 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; temp_node.childSum = test.length; 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; }; // 重置参数 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(); } }; // 获取传递出去的参数,根据defaultRequest、request和node拼出发出请求的参数 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; }; // 获取filterParam过滤后的requestParam DTree.prototype.getFilterRequestParam = function(requestParam){ var _this = this; var filterRequest = _this.filterRequest; return event.cloneObj(requestParam, filterRequest); }; // 获取当前选中值 DTree.prototype.getNowParam = function(){ var _this = this; return _this.getRequestParam(_this.getNodeParam()); }; // 获取指定节点选中值 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 {}; } }; // 获取参数的上级节点 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 {}; } }; // 获取参数的全部上级节点 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<level; i++){ // 从1开始遍历,如果level等于1说明是根节点 arr.unshift(_this.callbackData().parentNode($div)); $div = _this.getNodeDom($div).parentDiv(); } } return arr; }; // 获取参数的下级节点 DTree.prototype.getChildParam = 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().childNode($div); } else { return []; } }; // 获取回调数据 DTree.prototype.callbackData = function(){ var _this = this; return { dom: function($dom){ // 获取dom return $dom; }, node: function(node){ // 获取当前节点值 return _this.getRequestParam(node); }, childNode: function($div){ // 获取下级节点值 var $childDivs = $div.next("ul").find("li."+LI_NAV_ITEM+" div."+LI_DIV_ITEM); var childNode = []; if($childDivs && $childDivs.length > 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 {};} } } }; /******************** 事件回调区域 ********************/ // 绑定浏览器事件 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(); $(this).toggleClass("layui-form-selected"); $("div[dtree-id='" + rootId + "'][dtree-card='"+_this.selectCardDiv+"']").toggleClass("dtree-select-show layui-anim layui-anim-upbit"); // 下拉树面板开闭状态改变后,用户自定义想做的事情 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.init(); 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.init(); 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.init(); 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(); // 获取复选框选中值 }, 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); }, version: function(){ //获取版本号 return VERSION; } }; exports('dtree', dtree); });