/** @Name:dtree 树形组件 @Author:智慧的小西瓜 @Site:http://www.wisdomelon.com/DTreeHelper/ @License:LAYUI */ 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", DTREEFONT = "dtreefont", DTREEFONTSPECIAL = "dtreefont-special", LI_DIV_MENUBAR = "dtree-menubar", LI_DIV_MENUBAR_DOWN = "dtree-icon-move-down", LI_DIV_MENUBAR_UP = "dtree-icon-move-up", LI_DIV_MENUBAR_REFRESH = "dtree-icon-refresh", LI_DIV_MENUBAR_DELETE = "dtree-icon-delete1", LI_DIV_MENUBAR_SEARCH = "dtree-icon-search_list_light", LI_DIV_TOOLBAR = "dtree-toolbar", TOOLBAR_TOOL = "dtree-toolbar-tool", LI_DIV_TOOLBAR_ADD = "dtree-icon-roundadd", LI_DIV_TOOLBAR_EDIT = "dtree-icon-bianji", LI_DIV_TOOLBAR_DEL = "dtree-icon-roundclose", LI_DIV_SPREAD_LAST = "dtree-icon-dian", LI_DIV_CHECKBAR = "dtree-nav-checkbox-div", LI_DIV_CHECKBAR_ON = "dtree-icon-fuxuankuangxuanzhong", LI_DIV_CHECKBAR_OUT = "dtree-icon-fuxuankuang", LI_DIV_CHECKBAR_NOALL = "dtree-icon-fuxuankuang-banxuan", LI_CLICK_CHECKBAR = "d-click-checkbar", //绑定点击复选框时需要用到 LI_DIV_TEXT_CLASS = "t-click", UL_ROOT = "dtree"; // 树的自定义样式 var DTREE = "dtree-", //自定义样式前缀 ITEMTHIS = "-item-this", //自定义样式当前行选中后缀 ITEM = "-item", //自定义样式当前行后缀 DFONT = "-dtreefont", //自定义样式图标样式后缀 FICON = "-ficon", //自定义样式一级图标样式后缀 ICON = "-icon", //自定义样式二级图标样式后缀 CBOX = "-checkbox", //自定义样式复选框样式后缀 CHS = "-choose"; //自定义样式复选框选中样式后缀 // 树的公共指定 var NAV_THIS = "dtree-nav-this", //当前节点 NAV_SHOW = "dtree-nav-show", //显示子节点 ICON_HIDE = "dtree-icon-hide", //隐藏dot图标 $BODY = $("body"), //body选择器 MOD_NAME = "dtree", //模块名称 VERSION = "v2.4.5_finally_beta", //版本 DTrees = {}; //当前被实例化的树的集合 // 树的一级节点图标集合 var firstIconArray = { "-1": {"open": "dtree-icon-null-open", "close": "dtree-icon-null-close"}, //未指定 "0": {"open": "dtree-icon-jian", "close": "dtree-icon-jia"}, "1": {"open": "dtree-icon-xiangxia1", "close": "dtree-icon-xiangyou"} }; // 树的二级节点图标集合 var nodeIconArray = { "-1": {"open": "dtree-icon-null-open", "close": "dtree-icon-null-close"}, //未指定 "0": {"open": "dtree-icon-wenjianjiazhankai", "close": "dtree-icon-weibiaoti5"} }; 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" //文件 }; // 树自定义操作事件名称集合 绑定dtree-click的事件 var eventName = { checkNodeClick: "checkNodeClick", //点击复选框 itemNodeClick: "itemNodeClick" //点击子节点div }; // 树默认toolbar提供的功能集合 绑定dtree-tool的事件 var defaultTool = { addToolbar: "addToolbar", //点击toolbar新增 editToolbar: "editToolbar", //点击toolbar编辑 delToolbar: "delToolbar" //点击toolbar删除 }; // 树默认menubar提供的功能集合 绑定dtree-menu的事件 var defaultMenu = { moveDown: "moveDown", //menubar展开节点 moveUp: "moveUp", //menubar收缩节点 refresh: "refresh", //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; } }; // 特殊符号转义 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, success: config.success, error: function (XMLHttpRequest, textStatus, errorThrown) { if (typeof (config.error) === "function") { config.error(); } else { layer.msg('系统异常导致操作失败, 请联系管理员。', {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) { /** 默认赋值**/ this.response = { // 树返回的json格式 statusName: "code", //返回标识 statusCode: 200, //返回码 message: "message", //返回信息 rootName: "data", //根节点名称 treeId: "id", //节点ID parentId: "parentId", //父节点ID title: "title", //节点名称 iconClass: "iconClass", //自定义图标 childName: "children", //子节点名称 isLast: "isLast", //是否最后一级节点 // level: "level", //层级 spread: "spread", //展开 disabled: "disabled", //禁用 checkArr: "checkArr", //复选框列表 isChecked: "isChecked", //是否选中 type: "type", //复选框标记 basicData: "basicData" //表示用户自定义需要存储在树节点中的数据 }; this.defaultRequest = { // 树的默认发起请求参数格式,最后会将value作为参数名称传递 nodeId: "nodeId", //节点ID parentId: "parentId", //父节点ID context: "context", //节点内容 isLeaf: "isLeaf", //是否叶子节点 level: "level", //层级 spread: "spread", //节点展开状态 dataType: "dataType", //节点标记 ischecked: "ischecked", //节点复选框选中状态 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.remove, defaultMenu.searchNode], freedom: [] }; this.checkbarFun = { chooseBefore: function ($i, node) { // 复选框点击前回调 return true; }, chooseDone: function (checkbarNodesParam) { //复选框点击事件完毕后,返回该树关于复选框操作的全部信息,用于用户自定义,如未指定则树只是页面上做了修改 return; } }; this.iframe = { // 树点击节点时,打开iframe页面参数配置 iframeElem: "", //iframe的ID iframeUrl: "", //树关联的frame地址 iframeLoad: "leaf", //点击哪一层加载frame: node:所有节点, leaf:默认,最后一级 iframeDefaultRequest: { //iframe的默认参数,目的是与加载树的参数不一样 nodeId: "nodeId", //节点ID parentId: "parentId", //父节点ID context: "context", //节点内容 isLeaf: "isLeaf", //是否叶子节点 level: "level", //层级 spread: "spread", //节点展开状态 dataType: "dataType", //节点标记 ischecked: "ischecked", //节点复选框选中状态 initchecked: "initchecked", //节点复选框初始状态 basicData: "basicData", //用户自定义的记录节点数据 recordData: "recordData", //当前data数据(排除basicData和children字段) }, iframeRequest: {} //iframe的自定义参数 }; this.iframeFun = { iframeDone: function (iframeParam) { //iframe加载完毕后,用于用户自定义事件 return; } }; this.style = { item: "", itemThis: "", dfont: "", icon: "", cbox: "", chs: "" }; /** 数据绑定**/ this.node = { // 树节点选中时,包含当前节点的全部信息 nodeId: "", //节点ID parentId: "", //父节点ID context: "", //节点内容 isLeaf: "", //是否叶子节点 level: "", //层级 spread: "", //节点展开状态 dataType: "", //节点标记 ischecked: "", //节点复选框选中状态 initchecked: "", //节点复选框初始状态 basicData: "", //用户自定义的记录节点数据 recordData: "", //当前data数据(排除basicData和children字段) }; this.toolbarMenu = {}; // 工具栏右键菜单绑定的所有元素 this.checkbarNode = []; // 复选框标记的全部节点数据 this.checkArrLen = 0; //添加节点的时判断复选框个数 this.temp = []; // 临时变量 this.setting(options); }; /******************** 初始参数加载 ********************/ // 设置值 DTree.prototype.setting = function (options) { this.options = options || {}; /** 绑定元素参数(必填,2个参数项必填一个)**/ this.elem = this.options.elem || ""; //树绑定的元素ID:#elem this.obj = this.options.obj || $(this.elem); //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到 /** 基本参数**/ this.initLevel = this.options.initLevel || 2; //默认展开节点 2节 this.type = this.options.type || "load"; // 树的加载方式 all,全量树, load,增量树,默认load this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : true; //开启数据缓存 this.record = (typeof (this.options.record) === "boolean") ? this.options.record : false; //开启数据记录模式 this.load = (typeof (this.options.load) === "boolean") ? this.options.load : true; //开启加载动画 /** 样式相关参数**/ this.firstIconArray = $.extend(firstIconArray, this.options.firstIconArray) || firstIconArray; //用户自定义一级图标集合,node this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray) || nodeIconArray; //用户自定义二级图标集合,node this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray) || leafIconArray; //用户自定义二级图标集合,leaf this.skin = this.options.skin || "theme"; // 自定义样式 if (this.skin == "layui") { // layui主题 this.ficon = this.options.ficon || "1"; // 一级图标样式,0:+,- this.dot = (typeof (this.options.dot) === "boolean") ? this.options.dot : false; //是否显示一级图标的小圆点,默认不显示 this.icon = this.options.icon || "7"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章, -1:不显示二级图标。默认'1' this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; // 二级图标中的node节点图标 } else { // 默认主题 或者自定义主题 this.ficon = this.options.ficon || "0"; // 一级图标样式,0:+,- this.dot = (typeof (this.options.dot) === "boolean") ? this.options.dot : true; //是否显示一级图标的小圆点,默认显示 this.icon = this.options.icon || "5"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章, -1:不显示二级图标。默认'5' this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; // 二级图标中的node节点图标 } /** 内置样式属性*/ this.ficonOpen = this.firstIconArray[this.ficon]["open"]; // 一级图标中的node节点open图标 this.ficonClose = this.firstIconArray[this.ficon]["close"]; // 一级图标中的node节点close图标 this.nodeIconOpen = this.nodeIconArray[this.nodeIcon]["open"]; // 二级图标中的node节点open图标 this.nodeIconClose = this.nodeIconArray[this.nodeIcon]["close"]; // 二级图标中的node节点close图标 this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; // 二级图标中的leaf节点图标 this.leafIconShow = this.leafIconArray[this.leafIcon]; // 二级图标中的leaf节点图标 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; /** 数据加载参数**/ this.url = this.options.url || ""; //请求地址 this.async = (typeof (this.options.async) === "boolean") ? this.options.async : true; //异步同步加载,默认异步加载 this.headers = this.options.headers || {}; // ajax header属性 this.method = this.options.method || "post"; //请求类型 this.dataType = this.options.dataType || "json"; //参数类型 this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest) || this.defaultRequest; //默认请求参数 this.filterRequest = this.options.filterRequest || []; //过滤请求参数 this.request = this.options.request || {}; //用户自定义请求参数 this.response = $.extend(this.response, this.options.response) || this.response; //返回json格式 this.data = this.options.data || null; //初始化指定该参数,则不会访问异步接口 this.dataFormat = this.options.dataFormat || "levelRelationship"; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认 this.dataStyle = this.options.dataStyle || "defaultStyle"; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格 this.success = this.options.success || function (data, obj) { }; //树加载完毕后执行解析树之前的回调(仅限异步加载) this.done = this.options.done || function (data, obj) { }; //树加载完毕后的回调(仅限异步加载) /** 工具栏参数**/ this.toolbar = this.options.toolbar || false; //是否开启可编辑模式 this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小 this.toolbarScroll = this.options.toolbarScroll || this.elem; //树的上级div容器,让树可以显示滚动条的div容器 this.toolbarLoad = this.options.toolbarLoad || "node"; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级 this.toolbarShow = this.options.toolbarShow || ["add", "edit", "delete"]; // toolbar三个按钮自定义加载 this.toolbarBtn = this.options.toolbarBtn || null; // toolbar增删改中内容的自定义加载 this.toolbarExt = this.options.toolbarExt || []; // toolbar按钮扩展 this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun) || this.toolbarFun; // toolbar事件加载 /** 菜单栏参数**/ this.menubar = this.options.menubar || false; //是否打开菜单栏 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.checkbar = this.options.checkbar || false; //是否开启复选框模式 this.checkbarLoad = this.options.checkbarLoad || "node"; // 复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点 this.checkbarType = this.options.checkbarType || "all"; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all this.checkbarData = this.options.checkbarData || "choose"; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all,记录全部数据,默认choose this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun) || this.checkbarFun; // checkbar事件加载 /** iframe模式参数**/ this.useIframe = this.options.useIframe || false; // 是否加载iframe 默认false, this.iframe = $.extend(this.iframe, this.options.iframe) || this.iframe; //iframe配置 this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || this.iframeFun; //iframe事件加载 }; // 设置值 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.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.firstIconArray = $.extend(firstIconArray, this.options.firstIconArray) || this.firstIconArray; //用户自定义一级图标集合,node 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.ficon = this.options.ficon || this.ficon; // 一级图标样式,0:+,- this.dot = (typeof (this.options.dot) === "boolean") ? this.options.dot : false; //是否显示一级图标的小圆点,默认不显示 this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章, -1:不显示二级图标。默认'1' this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; // 二级图标中的node节点图标 } else { // 默认主题 或者自定义主题 this.ficon = this.options.ficon || this.ficon; // 一级图标样式,0:+,- this.dot = (typeof (this.options.dot) === "boolean") ? this.options.dot : true; //是否显示一级图标的小圆点,默认显示 this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章, -1:不显示二级图标。默认'5' this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; // 二级图标中的node节点图标 } /** 内置样式属性*/ this.ficonOpen = this.firstIconArray[this.ficon]["open"]; // 一级图标中的node节点open图标 this.ficonClose = this.firstIconArray[this.ficon]["close"]; // 一级图标中的node节点close图标 this.nodeIconOpen = this.nodeIconArray[this.nodeIcon]["open"]; // 二级图标中的node节点open图标 this.nodeIconClose = this.nodeIconArray[this.nodeIcon]["close"]; // 二级图标中的node节点close图标 this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; // 二级图标中的leaf节点图标 this.leafIconShow = this.leafIconArray[this.leafIcon]; // 二级图标中的leaf节点图标 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; /** 数据加载参数**/ 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.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.success = this.options.success || this.success; //树加载完毕后执行解析树之前的回调(仅限异步加载) this.done = this.options.done || this.done; //树加载完毕后的回调(仅限异步加载) /** 可编辑模式参数**/ this.toolbar = this.options.toolbar || this.toolbar; //是否开启可编辑模式 this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小 this.toolbarScroll = this.options.toolbarScroll || this.toolbarScroll; //树的上级div容器,让树可以显示滚动条的div容器 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事件加载 /** 菜单栏参数**/ 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.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,记录全部数据,默认choose this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun) || this.checkbarFun; // checkbar事件加载 /** iframe模式参数**/ this.useIframe = this.options.useIframe || this.useIframe; // 是否加载iframe 默认false, this.iframe = $.extend(this.iframe, this.options.iframe) || this.iframe; //iframe配置 this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || this.iframeFun; //iframe事件加载 }; /******************** 初始化数据区域 ********************/ // 重载树 DTree.prototype.reload = function (options) { var _this = this; _this.reloadSetting(options); _this.init(); }; // 初始化树 DTree.prototype.init = function () { var _this = this; if (typeof _this !== "object") { layer.msg("树组件未成功加载,请检查配置", {icon: 5}); return; } if (_this.data) { if (typeof _this.data.length === 'undefined') { layer.msg("数据解析异常,data数据格式不正确", {icon: 5}); return; } //先将ul中的元素清空 _this.obj.html(""); // 加载完毕后执行树解析前的回调 _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.done(_this.data, _this.obj); } else { if (!_this.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, 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) { // 加载完毕后执行树解析前的回调 _this.success(result, _this.obj); // 第一次解析树 if (_this.dataFormat == 'list') { //1.识别根节点ul中的data-id标签,判断顶级父节点 var pid = _this.obj.attr("data-id"); //2.构建一个存放节点的树组 var rootListData = _this.queryListTreeByPid(pid, result[_this.response.rootName]); _this.loadListTree(rootListData, result[_this.response.rootName], 1); } else { _this.loadTree(result[_this.response.rootName], 1); } // 加载完毕后的回调 _this.done(result, _this.obj); } else { if (_this.dataStyle == 'layuiStyle') { layer.msg(result[_this.response.message], {icon: 2}); } else { layer.msg(result.status[_this.response.message], {icon: 2}); } } }, complete: function () { if (_this.load) { layer.close(index); } } }); } }; // 加载子节点 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') { 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); } } else { if (!_this.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, 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); } $ul.addClass(NAV_SHOW); } else { if (_this.dataStyle == 'layuiStyle') { layer.msg(result[_this.response.message], {icon: 2}); } else { layer.msg(result.status[_this.response.message], {icon: 2}); } } }, complete: function () { if (_this.load) { layer.close(index); } } }); } }; // 初始化树或者拼接树 DTree.prototype.loadListTree = function (pListData, listData, level, $ul) { var _this = this; $ul = $ul || _this.getNowNodeUl(); //当前选中的节点或根节点 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.isLast(childListData.length), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(level), parseData.disabled(), 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) { rootListData.push(data); } } } } return rootListData; }; // 初始化树或者拼接树 DTree.prototype.loadTree = function (root, level, $ul) { var _this = this; if (root) { $ul = $ul || _this.getNowNodeUl(); //当前选中的节点或根节点 for (var i = 0; i < root.length; i++) { // 遍历跟节点或追加的跟节点 var data = root[i]; if (typeof data !== "object") continue; var parseData = _this.parseData(data); var children = parseData.children(); $ul.append(_this.getLiItemDom(parseData.treeId(), parseData.parentId(), parseData.title(), parseData.isLast(children.length), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(level), parseData.disabled(), 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() + "']")); } } } }; // 解析data数据 DTree.prototype.parseData = function (data) { var _this = this; return { treeId: function () { return data[_this.response.treeId]; }, parentId: function () { return data[_this.response.parentId]; }, title: function () { return data[_this.response.title] || ""; }, level: function () { return data[_this.response.level] || ""; }, iconClass: function () { return data[_this.response.iconClass] || ""; }, isLast: function (len) { return ((len == 0) ? ((typeof (data[_this.response.isLast]) === "boolean") ? data[_this.response.isLast] : true) : ((typeof (data[_this.response.isLast]) === "boolean") ? data[_this.response.isLast] : 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; }, 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", "isChecked": 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.basicData, _this.response.childName]) : {}; return event.escape(JSON.stringify(recordData)); }, data: function () { return event.escape(JSON.stringify(data)); } } }; //新增节点的dom值 DTree.prototype.getDom = function (treeId, parentId, title, isLast, iconClass, checkArr, level, spread, disabled) { var _this = this, rootId = _this.obj[0].id, toolbar = _this.toolbar, checkbar = _this.checkbar; return { fnode: function () { // + - 图标 // 获取图标的变量 var ficon = _this.ficon, ficonOpen = _this.ficonOpen, ficonClose = _this.ficonClose, dot = _this.dot; if (ficon != "-1" && dot) { // 都加载 return isLast ? "" : (spread ? "" : ""); } if (ficon != "-1" && !dot) { // 加载node 隐藏leaf return isLast ? "" : (spread ? "" : ""); } if (ficon == "-1" && dot) { // 隐藏node 加载leaf return isLast ? "" : (spread ? "" : ""); } if (ficon == "-1" && !dot) { // 都隐藏 return isLast ? "" : (spread ? "" : ""); } }, node: function () { // 二级图标样式 // 获取图标的变量 var nodeIcon = _this.nodeIcon, leafIcon = _this.leafIcon; var leafIconShow = _this.leafIconShow, nodeIconOpen = _this.nodeIconOpen, nodeIconClose = _this.nodeIconClose; if (iconClass) { leafIconShow = iconClass; nodeIconOpen = iconClass; nodeIconClose = iconClass; } if (nodeIcon != "-1" && leafIcon != "-1") { // 都加载 return isLast ? "" : (spread ? "" : ""); } if (nodeIcon != "-1" && leafIcon == "-1") { // 加载node 隐藏leaf return isLast ? "" : (spread ? "" : ""); } if (nodeIcon == "-1" && leafIcon != "-1") { // 隐藏node 加载leaf return isLast ? "" : (spread ? "" : ""); } if (nodeIcon == "-1" && leafIcon == "-1") { // 都隐藏 return isLast ? "" : (spread ? "" : ""); } }, checkbox: function () { // 复选框 var flag = false; if (_this.checkbarLoad == "node") { if (checkbar) { flag = true; } } else { if (isLast) { if (checkbar) { flag = true; } } } if (flag) { var result = "
"; if (checkArr && checkArr.length > 0) { for (var i = 0; i < checkArr.length; i++) { var checkData = checkArr[i]; var isChecked = checkData.isChecked; var CHOOSE_CLASS = LI_DIV_CHECKBAR_OUT; if (isChecked == "2") { //半选择 CHOOSE_CLASS = LI_DIV_CHECKBAR_NOALL + " " + _this.style.chs; } else if (isChecked == "1") { //选择 CHOOSE_CLASS = LI_DIV_CHECKBAR_ON + " " + _this.style.chs; } else { //未选择或者无值 CHOOSE_CLASS = LI_DIV_CHECKBAR_OUT; } result += ""; } } result += "
"; return result; } return ""; }, text: function () { // 文字显示 return "" + title + ""; }, ul: function () { //子节点ul return isLast ? "" : (spread ? "" : ""); } }; }; // 获取拼接好的li DTree.prototype.getLiItemDom = function (treeId, parentId, title, isLast, iconClass, checkArr, level, spread, disabled, basicData, recordData, flag) { var _this = this, rootId = _this.obj[0].id; var dom = _this.getDom(treeId, parentId, title, isLast, iconClass, checkArr, level, spread, disabled); basicData = (basicData == "{}") ? "" : basicData; recordData = (recordData == "{}") ? "" : recordData; var div = "
" + div, dom.fnode(), dom.node(), dom.checkbox(), dom.text(), "
", dom.ul(), ""].join(""); return li; }; // 初始化节点,用于数据回显 DTree.prototype.dataInit = function (chooseId) { var _this = this; var $div = _this.obj.find("div[data-id='" + chooseId + "']"); $div.parent().find("." + NAV_THIS).removeClass(NAV_THIS); $div.parent().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]." + _this.ficonClose).addClass(_this.ficonOpen); $li_parents.children("." + LI_DIV_ITEM).children("i[data-spread]." + _this.ficonClose).removeClass(_this.ficonClose); $li_parents.children("." + LI_DIV_ITEM).children("i[data-spread]." + _this.nodeIconClose).addClass(_this.nodeIconOpen); $li_parents.children("." + LI_DIV_ITEM).children("i[data-spread]." + _this.nodeIconClose).removeClass(_this.nodeIconClose); return _this.getNowParam(); }; /******************** 基础事件区域 ********************/ // 展开或隐藏节点 作用点: div DTree.prototype.clickSpread = function ($div) { var $i_spread = $div.find("i[data-spread]").eq(0), $i_node = $div.find("i[data-spread]").eq(1), i_node_class = $i_node.attr("class"), $cite = $div.find("cite[data-leaf]").eq(0), spread = $i_spread.attr("data-spread"), $ul = $div.next("ul"); var _this = this; if ($ul.length > 0) { if (spread == "close") { 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); } $div.find("i[data-spread]").attr("data-spread", "open"); $i_spread.removeClass(_this.ficonClose); $i_spread.addClass(_this.ficonOpen); var node_class = _this.nodeIconClose; if (i_node_class.indexOf(node_class) > 0) { $i_node.removeClass(_this.nodeIconClose); $i_node.addClass(_this.nodeIconOpen); } } else if (spread == "open") { $ul.removeClass(NAV_SHOW); $div.find("i[data-spread]").attr("data-spread", "close"); $i_spread.removeClass(_this.ficonOpen); $i_spread.addClass(_this.ficonClose); var node_class = _this.nodeIconOpen; if (i_node_class.indexOf(node_class) > 0) { $i_node.removeClass(_this.nodeIconOpen); $i_node.addClass(_this.nodeIconClose); } } } }; // 数据格式化 DTree.prototype.escape = function (html) { return event.escape(html); }; // 格式化数据转回正常数据 DTree.prototype.unescape = function (str) { return event.unescape(str); }; /******************** 工具栏及菜单栏区域 ********************/ // 初始化菜单栏和工具栏的div DTree.prototype.initTreePlus = function () { var _this = this; // 初始化菜单栏和工具栏的div _this.obj.prevAll('div#dtree_menubar_' + _this.obj[0].id).remove(); _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id).remove(); _this.toolbarMenu = {}; if (_this.menubar && _this.menubarTips.group && _this.menubarTips.group.length > 0) _this.obj.before("
"); if (_this.toolbar) _this.obj.before("
"); }; // 开启工具栏和菜单栏 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 = ""; break; case defaultMenu.moveUp: gg = ""; break; case defaultMenu.refresh: gg = ""; break; case defaultMenu.remove: gg = (_this.checkbar) ? "" : ""; break; case defaultMenu.searchNode: gg = ""; break; } return gg; }; // 获取扩展菜单栏 DTree.prototype.getExtMenubarDom = function (menu) { var _this = this; return ""; }; // 获取依附在工具栏的菜单栏 DTree.prototype.getMenubarToolDom = function (menu) { var _this = this; var rootId = _this.obj[0].id; switch (menu) { case defaultMenu.moveDown: _this.toolbarMenu[defaultMenu.moveDown] = "
 展开" + _this.toolbarStyle.title + "
"; break; case defaultMenu.moveUp: _this.toolbarMenu[defaultMenu.moveUp] = "
 收缩" + _this.toolbarStyle.title + "
"; break; case defaultMenu.refresh: _this.toolbarMenu[defaultMenu.refresh] = "
 刷新
"; break; case defaultMenu.remove: if (_this.checkbar) _this.toolbarMenu[defaultMenu.remove] = "
 删除选中" + _this.toolbarStyle.title + "
"; break; case defaultMenu.searchNode: _this.toolbarMenu[defaultMenu.searchNode] = "
 查询" + _this.toolbarStyle.title + "
"; break; } }; // 获取依附在工具栏的扩展菜单栏 DTree.prototype.getExtMenubarToolDom = function (menu) { var _this = this; _this.toolbarMenu[menu.menubarId] = "
 " + menu.title + "
"; }; // 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 = $div.find("i[data-spread]").eq(0), $i_node = $div.find("i[data-spread]").eq(1), i_node_class = $i_node.attr("class"), $cite = $div.find("cite[data-leaf]").eq(0), 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); } $div.find("i[data-spread]").attr("data-spread", "open"); $i_spread.removeClass(_this.ficonClose); $i_spread.addClass(_this.ficonOpen); var node_class = _this.nodeIconClose; if (i_node_class.indexOf(node_class) > 0) { $i_node.removeClass(_this.nodeIconClose); $i_node.addClass(_this.nodeIconOpen); } } 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 = $div.find("i[data-spread]").eq(0), $i_node = $div.find("i[data-spread]").eq(1), i_node_class = $i_node.attr("class"), $cite = $div.find("cite[data-leaf]").eq(0), spread = $i_spread.attr("data-spread"), leaf = $cite.attr("data-leaf"); $ul.removeClass(NAV_SHOW); $div.find("i[data-spread]").attr("data-spread", "close"); $i_spread.removeClass(_this.ficonOpen); $i_spread.addClass(_this.ficonClose); var node_class = _this.nodeIconOpen; if (i_node_class.indexOf(node_class) > 0) { $i_node.removeClass(_this.nodeIconOpen); $i_node.addClass(_this.nodeIconClose); } }); }, refreshTree: function () {// 刷新树 _this.obj.html(""); // 清空树结构 _this.initNodeParam(); // 清空参数 _this.init(); //执行初始化方法 }, remove: function () {// 删除选中节点 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); }); } }, 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.getNowNode(); 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.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; var toolbarExt = _this.toolbarExt; if (toolbarShow.length > 0) { for (var i = 0; i < toolbarShow.length; i++) { var show = toolbarShow[i]; if (show == "add") { _this.toolbarMenu[defaultTool.addToolbar] = "
 新增" + _this.toolbarStyle.title + "
"; } if (show == "edit") { _this.toolbarMenu[defaultTool.editToolbar] = "
 编辑" + _this.toolbarStyle.title + "
"; } if (show == "delete") { _this.toolbarMenu[defaultTool.delToolbar] = "
 删除" + _this.toolbarStyle.title + "
"; } } } if (toolbarExt.length > 0) { for (var i = 0; i < toolbarExt.length; i++) { var ext = toolbarExt[i]; _this.toolbarMenu[ext.toolbarId] = "
 " + ext.title + "
"; } } }; // 设置工具栏按钮 DTree.prototype.setToolbarDom = function (toolbarMenu) { var _this = this; 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]); } } } // 加载toolBar中的内容 DTree.prototype.loadToolBar = function (title, name) { var _this = this; var toolbarShow = _this.toolbarShow; var nodeBarContents = _this.toolbarBtn; var html = ""; switch (name) { case defaultTool.addToolbar: //1. 必须加载的节点内容 var nowNode = ['
', '', '
', '', '
', '
'].join(''); var addNodeName = ['
', '', '
', '', '
', '
'].join(''); var addNodeBtn = ['
', '
', '', '
', '
'].join(''); //2. 用户自定义的节点内容 var addNodeBar = ['
', nowNode, addNodeName]; if (nodeBarContents != null && nodeBarContents.length > 0) { if (nodeBarContents[0] != null && nodeBarContents[0] != undefined && nodeBarContents[0].length > 0) { var addNodeBarContents = nodeBarContents[0]; for (var j = 0; j < addNodeBarContents.length; j++) { var type = addNodeBarContents[j].type; if (!type) { type = "text"; } switch (type) { case "text": addNodeBar.push(_this.loadToolBarDetail().text(addNodeBarContents[j])); break; case "textarea": addNodeBar.push(_this.loadToolBarDetail().textarea(addNodeBarContents[j])); break; case "select": addNodeBar.push(_this.loadToolBarDetail().select(addNodeBarContents[j])); break; case "hidden": addNodeBar.push(_this.loadToolBarDetail().hidden(addNodeBarContents[j])); break; } } } } addNodeBar.push(addNodeBtn); addNodeBar.push('
'); html = addNodeBar.join(''); break; case defaultTool.editToolbar: //1. 必须加载的节点内容 var nowNode = ['
', '', '
', '', '
', '
'].join(''); var editNodeName = ['
', '', '
', '', '
', '
'].join(''); var editNodeBtn = ['
', '
', '', '
', '
'].join(''); var editNodeBar = ['
', nowNode, editNodeName]; //2. 用户自定义的节点内容 if (nodeBarContents != null && nodeBarContents.length > 0) { if (nodeBarContents[1] != null && nodeBarContents[1] != undefined && nodeBarContents[1].length > 0) { var editNodeBarContents = nodeBarContents[1]; for (var j = 0; j < editNodeBarContents.length; j++) { var type = editNodeBarContents[j].type; if (!type) { type = "text"; } switch (type) { case "text": editNodeBar.push(_this.loadToolBarDetail().text(editNodeBarContents[j])); break; case "textarea": editNodeBar.push(_this.loadToolBarDetail().textarea(editNodeBarContents[j])); break; case "select": editNodeBar.push(_this.loadToolBarDetail().select(editNodeBarContents[j])); break; case "hidden": editNodeBar.push(_this.loadToolBarDetail().hidden(editNodeBarContents[j])); break; } } } } editNodeBar.push(editNodeBtn); editNodeBar.push('
'); html = editNodeBar.join(''); break; } return html; }; // 获取toolbar详细的标签信息 DTree.prototype.loadToolBarDetail = function () { var _this = this; return { text: function (nodeBarContents) { return ['
', '', '
', '', '
', '
'].join(''); }, textarea: function (nodeBarContents) { return ['
', '', '
', '', '
', '
'].join(''); }, hidden: function (nodeBarContents) { return [''].join(''); }, select: function (nodeBarContents) { var optionsData = nodeBarContents.optionsData; var options = ""; var defaultValue = nodeBarContents.value ? nodeBarContents.value : ""; for (var key in optionsData) { if (defaultValue == optionsData[key]) { options += ""; } else { options += ""; } } return ['
', '', '
', '', '
', '
'].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]; 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.isLast(0), parseData.iconClass(), parseData.checkArr(), level, parseData.spread(), parseData.disabled(), parseData.basicData(), parseData.recordData(), "item")); // 建造完毕后,选中该DIV var $addDiv = $ul.find("div[data-id='" + returnID.id + "']"); _this.setNodeParam($addDiv) } else { layer.msg("添加失败,节点ID为undefined!", {icon: 5}); // 将li节点删除 $ul.find("li[data-id='" + id + "']").remove(); // 重新赋值 _this.setNodeParam($div); // 临时变量制空 _this.temp = []; return; } } else if (typeof returnID === "string" || typeof this.icon === 'number') { $thisDiv.attr("data-id", returnID); // 将li节点展示 $ul.find("li[data-id='" + returnID + "']").show(); var $addDiv = $ul.find("div[data-id='" + returnID + "']"); _this.setNodeParam($addDiv) } // 判断当前点击的节点是否是最后一级节点,如果是,则需要修改节点的样式 var $icon_i = $div.find("i[data-spread]"); if ($icon_i.eq(0).attr("data-spread") == "last") { $icon_i.attr("data-spread", "open"); $icon_i.eq(0).removeClass(LI_DIV_SPREAD_LAST); $icon_i.eq(0).removeClass(ICON_HIDE); $icon_i.eq(0).addClass(_this.ficonOpen); $icon_i.eq(1).removeClass(leafIconArray[_this.leafIcon]); $icon_i.eq(1).addClass(_this.nodeIconOpen); } else { //如果不是,也要修改节点样式 $icon_i.attr("data-spread", "open"); $icon_i.eq(0).removeClass(_this.ficonClose); $icon_i.eq(0).addClass(_this.ficonOpen); $icon_i.eq(1).removeClass(_this.nodeIconClose); $icon_i.eq(1).addClass(_this.nodeIconOpen); // _this.clickSpread($div); } $ul.addClass(NAV_SHOW); //展开UL } else { // 将li节点删除 $ul.find("li[data-id='" + id + "']").remove(); // 重新赋值 _this.setNodeParam($div); } _this.temp = []; // 临时变量制空 }; // 修改节点后改变节点内容 DTree.prototype.changeTreeNodeEdit = function (flag) { var _this = this; var temp = _this.temp; var $cite = temp[0], $div = temp[1]; if (!flag) { $cite.html(title); node = _this.getNodeParam($div); } _this.temp = []; // 临时变量制空 }; // 编辑页打开后显示编辑页内容 DTree.prototype.changeTreeNodeDone = function (param) { var _this = this; form.val('dtree_editNode_form', param); form.render(); }; // 删除节点后改变节点内容 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(); // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式 if ($p_ul.children("li").length == 0) { var $icon_i = $p_div.find("i[data-spread]"); $icon_i.attr("data-spread", "last"); $icon_i.eq(0).removeClass(_this.ficonOpen); $icon_i.eq(0).removeClass(_this.ficonClose); if (!_this.dot) { $icon_i.eq(0).addClass(ICON_HIDE); } $icon_i.eq(0).addClass(LI_DIV_SPREAD_LAST); $icon_i.eq(1).removeClass(_this.nodeIconOpen); $icon_i.eq(1).removeClass(_this.nodeIconClose); $icon_i.eq(1).addClass(leafIconArray[_this.leafIcon]); } _this.initNodeParam(); } _this.temp = []; // 临时变量制空 }; /******************** 复选框区域 ********************/ // 初始化复选框的值 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]." + _this.ficonClose).addClass(_this.ficonOpen); $li_parents.children("." + LI_DIV_ITEM).children("i[data-spread]." + _this.ficonClose).removeClass(_this.ficonClose); $li_parents.children("." + LI_DIV_ITEM).children("i[data-spread]." + _this.nodeIconClose).addClass(_this.nodeIconOpen); $li_parents.children("." + LI_DIV_ITEM).children("i[data-spread]." + _this.nodeIconClose).removeClass(_this.nodeIconClose); 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 () { var _this = this; var temp = _this.temp; var $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); } // 获取复选框选中节点的内容 var checkbarNodes = _this.setAndGetCheckbarNodesParam(); // 用户自定义想做的事情 _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(LI_DIV_CHECKBAR_OUT); $i.removeClass(LI_DIV_CHECKBAR_NOALL); $i.addClass(LI_DIV_CHECKBAR_ON); $i.addClass(_this.style.chs); $i.attr("data-checked", "1"); }, noCheck: function () { $i.removeClass(LI_DIV_CHECKBAR_NOALL); $i.removeClass(LI_DIV_CHECKBAR_ON); $i.removeClass(_this.style.chs); $i.addClass(LI_DIV_CHECKBAR_OUT); $i.attr("data-checked", "0"); }, noallCheck: function () { $i.removeClass(LI_DIV_CHECKBAR_OUT); $i.removeClass(LI_DIV_CHECKBAR_ON); $i.addClass(LI_DIV_CHECKBAR_NOALL); $i.addClass(_this.style.chs); $i.attr("data-checked", "2"); } } }; // 设置树的复选框操作值的全部参数,并获取 DTree.prototype.setAndGetCheckbarNodesParam = function () { var _this = this; //操作前先清空 _this.checkbarNode = []; // 选择所有复选框节点 if (_this.checkbarData == "change") { //记录变更数据 _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")) { _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); } }); } else if (_this.checkbarData == "all") { //记录全部数据 _this.obj.find("i[data-par][data-checked]").each(function () { var $i = $(this), $div = $i.closest("." + LI_DIV_ITEM); _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i))); }); } else { //记录选中数据 _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))); }); } return _this.checkbarNode; }; // 获取树的复选框操作值的全部参数 DTree.prototype.getCheckbarNodesParam = function () { var _this = this; return _this.setAndGetCheckbarNodesParam(); }; // 获取树的一个复选框的参数 DTree.prototype.getCheckbarNodeParam = function ($div, $i) { var _this = this; var temp_node = {}; temp_node.nodeId = $div.attr("data-id"); temp_node.parentId = $div.parent().attr("data-pid"); temp_node.context = $div.find("cite[data-leaf]").eq(0).text(); temp_node.isLeaf = $div.find("cite[data-leaf]").eq(0).attr("data-leaf") == "leaf" ? true : false; temp_node.level = $div.parent().attr("data-index"); temp_node.spread = $div.find("i[data-spread]").eq(0).attr("data-spread") == "open" ? true : false; temp_node.basicData = $div.attr("data-basic"); temp_node.recordData = $div.attr("data-record"); temp_node.dataType = $i.attr("data-type"); temp_node.ischecked = $i.attr("data-checked"); temp_node.initchecked = $i.attr("data-initchecked"); return temp_node; }; //判断复选框是否发生变更 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; }; /******************** iframe区域 ********************/ // 加载iframe DTree.prototype.loadIframe = function ($div, iframeParam) { var _this = this; var $cite = $div.find("cite[data-leaf]").eq(0); if (!_this.useIframe) { // 启用iframe return false; } var iframeElem = _this.iframe.iframeElem, iframeUrl = _this.iframe.iframeUrl, iframeLoad = _this.iframe.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.iframe.iframeRequest, defaultRequestNames = _this.iframe.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; }; /******************** 数据回调区域 ********************/ // 获取当前选中节点下一个UL 或根节点。为了将新节点放入ul下 DTree.prototype.getNowNodeUl = function () { var _this = this; return (_this.obj.find("div[data-id]").parent().find("." + NAV_THIS).length == 0) ? _this.obj : _this.obj.find("div[data-id]").parent().find("." + NAV_THIS).next("ul"); }; // 获取当前选中节点 或根节点。 DTree.prototype.getNowNode = function () { var _this = this; return (_this.obj.find("div[data-id]").parent().find("." + NAV_THIS).length == 0) ? _this.obj.children("li").eq(0).children("div").eq(0) : _this.obj.find("div[data-id]").parent().find("." + NAV_THIS); }; // 设置当前选中节点的全部参数 DTree.prototype.setNodeParam = function ($div) { var _this = this; _this.node.nodeId = $div.attr("data-id"); _this.node.parentId = $div.parent().attr("data-pid"); _this.node.context = $div.find("cite[data-leaf]").eq(0).text(); _this.node.isLeaf = $div.find("cite[data-leaf]").eq(0).attr("data-leaf") == "leaf" ? true : false; _this.node.level = $div.parent().attr("data-index"); _this.node.spread = $div.find("i[data-spread]").eq(0).attr("data-spread") == "open" ? true : false; _this.node.basicData = $div.attr("data-basic"); _this.node.recordData = $div.attr("data-record"); if ($div.find("i[data-par]")) { var dataTypes = "", ischeckeds = "", initcheckeds = ""; $div.find("i[data-par]").each(function () { dataTypes += $(this).attr("data-type") + ","; ischeckeds += $(this).attr("data-checked") + ","; initcheckeds += $(this).attr("data-initchecked") + ","; }); dataTypes = dataTypes.substring(0, dataTypes.length - 1); ischeckeds = ischeckeds.substring(0, ischeckeds.length - 1); initcheckeds = initcheckeds.substring(0, initcheckeds.length - 1); _this.node.dataType = dataTypes; _this.node.ischecked = ischeckeds; _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 = {}; temp_node.nodeId = $div.attr("data-id"); temp_node.parentId = $div.parent().attr("data-pid"); temp_node.context = $div.find("cite[data-leaf]").eq(0).text(); temp_node.isLeaf = $div.find("cite[data-leaf]").eq(0).attr("data-leaf") == "leaf" ? true : false; temp_node.level = $div.parent().attr("data-index"); temp_node.spread = $div.find("i[data-spread]").eq(0).attr("data-spread") == "open" ? true : false; temp_node.basicData = $div.attr("data-basic"); temp_node.recordData = $div.attr("data-record"); if ($div.find("i[data-par]")) { var dataTypes = "", ischeckeds = "", initcheckeds = ""; $div.find("i[data-par]").each(function () { dataTypes += $(this).attr("data-type") + ","; ischeckeds += $(this).attr("data-checked") + ","; initcheckeds += $(this).attr("data-initchecked") + ","; }); dataTypes = dataTypes.substring(0, dataTypes.length - 1); ischeckeds = ischeckeds.substring(0, ischeckeds.length - 1); initcheckeds = initcheckeds.substring(0, initcheckeds.length - 1); temp_node.dataType = dataTypes; temp_node.ischecked = ischeckeds; 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.isLeaf = ""; _this.node.level = ""; _this.node.spread = ""; _this.node.dataType = ""; _this.node.ischecked = ""; _this.node.initchecked = ""; _this.node.basicData = ""; }; // 获取传递出去的参数,根据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.getParentParam = function (id) { var _this = this; var $div = _this.obj.find("div[data-id='" + id + "']"); if ($div.length > 0) { return _this.callbackData().parentNode($div); } else { return {}; } }; // 获取参数的下级节点 DTree.prototype.getChildParam = function (id) { var _this = this; var $div = _this.obj.find("div[data-id='" + id + "']"); if ($div.length > 0) { 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 = $div.parent().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; // 绑定文件夹展开/收缩的图标的点击事件,点击时给当前节点的div添加选中class _this.obj.on("click", "i[data-spread]", function (event) { event.stopPropagation(); var $i = $(this), $div = $i.parent("div"), $cite = $div.find("cite"), node = _this.getNodeParam($div), $ul = $div.next("ul"), $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点 $p_ul = $p_li.parent("ul"); var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id); $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); _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.addClass(NAV_THIS); $div.addClass(_this.style.itemThis); _this.clickSpread($div); // 展开或隐藏节点 // 树状态改变后,用户自定义想做的事情 layui.event.call(this, MOD_NAME, "changeTree(" + $(_this.obj)[0].id + ")", { param: _this.callbackData().node(node), dom: _this.callbackData().dom($i), show: _this.callbackData().dom($i).attr("data-spread") == "open" ? true : false }); }); // 绑定所有子节点div的单击事件,点击时触发加载iframe或用户自定义想做的事情 _this.obj.on("click", "div[dtree-click='" + eventName.itemNodeClick + "']", function (event) { event.stopPropagation(); var $div = $(this), $cite = $div.find("cite"), node = _this.getNodeParam($div), $ul = $div.next("ul"), $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点 $p_ul = $p_li.parent("ul"); var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id); $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); _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.addClass(NAV_THIS); $div.addClass(_this.style.itemThis); 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 + "']", function (event) { event.stopPropagation(); var $div = $(this), $cite = $div.find("cite"), node = _this.getNodeParam($div), $ul = $div.next("ul"), $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点 $p_ul = $p_li.parent("ul"); var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id); $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); _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.addClass(NAV_THIS); $div.addClass(_this.style.itemThis); // 双击事件执行完毕后,用户自定义想做的事情 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) }); }); //绑定所有子节点div的右键点击事件,用于显示toolbar _this.obj.on("contextmenu", "div[dtree-click='" + eventName.itemNodeClick + "'][d-contextmenu]", function (e) { var $div = $(this), node = _this.getNodeParam($div), contextmenu = $div.attr("d-contextmenu"); if (_this.toolbar) { var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id); $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); // toolbar加载前执行的方法,执行完毕之后创建按钮 _this.setToolbarDom(_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.toolbarScroll).offset().top + 15; if (contextmenu == "true") { _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.addClass(NAV_THIS); $div.addClass(_this.style.itemThis); $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.toolbarScroll).scroll(function () { var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id); $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); }); // 绑定toolbar的点击事件 _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id).on("click", "a[dtree-tool]", function (event) { event.stopPropagation(); var $div = _this.getNowNode(), node = _this.getNodeParam($div), $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 $cite = $div.children("cite"), //当前选中节点的text title = $cite.html(); var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id); $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); var tool = $(this).attr("dtree-tool"); switch (tool) { case defaultTool.addToolbar: var content = _this.loadToolBar(title, defaultTool.addToolbar); 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, isLeaf = true, isChecked = "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, "isChecked": "0"}); } } $ul.append(_this.getLiItemDom(id, parentId, data.addNodeName, true, "", checkArr, level, 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.editToolbar: var content = _this.loadToolBar(title, defaultTool.editToolbar); layer.open({ title: "编辑" + _this.toolbarStyle.title, type: 1, area: _this.toolbarStyle.area, content: content, success: function (layero, index) { _this.toolbarFun.editTreeLoad(_this.getRequestParam(node)); 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]; _this.toolbarFun.editTreeNode(requestNode, $div); layer.close(index); }); } }); break; case defaultTool.delToolbar: 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(node), $div); layer.close(index); }); break; default: var toolbarId = $(this).attr("dtree-tool"); if (_this.toolbarExt.length > 0) { for (var i = 0; i < _this.toolbarExt.length; i++) { var ext = _this.toolbarExt[i]; if (toolbarId == ext.toolbarId) { ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div)); break; } } } break; } }); // 绑定menubar的点击事件 _this.obj.prevAll('div#dtree_menubar_' + _this.obj[0].id).on("click", "button[d-menu]", function (event) { event.stopPropagation(); var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id); $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); _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(); var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id); $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); _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(); var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id); $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); _this.menubarListener($(this).attr("dtree-menu"), "freedom"); }); // 绑定cheboxbar的节点复选框 _this.obj.on("click", "i[dtree-click='" + eventName.checkNodeClick + "']", function (event) { var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id); $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show'); 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(); }); }; // 绑定body的单击,让本页面所有的toolbar隐藏 $BODY.on("click", function (event) { $("div." + LI_DIV_TOOLBAR).find(".layui-show").removeClass('layui-anim-fadein layui-show'); }); // 解绑浏览器事件 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) { _this.obj.prevAll('div#dtree_toolbar_' + _this.obj[0].id).unbind(); if (_this.obj.closest(_this.toolbarScroll).length > 0) { _this.obj.closest(_this.toolbarScroll).unbind(); } } }; /** 外部访问 **/ var dtree = { 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.reloadSetting(options); dTree.initTreePlus(); dTree.openTreePlus(); dTree.init(); dTree.unbindBrowserEvent(); dTree.bindBrowserEvent(); } else { // 创建树 dTree = new DTree(options); // 添加到树数组中去 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.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); }, getNowParam: function (dTree) { if (typeof dTree === "string") { dTree = DTrees[dTree]; } if (typeof dTree === "undefined") { layer.msg("方法获取失败,请检查ID或对象传递是否正确", {icon: 2}); return; } return dTree.getNowParam(); // 获取当前选中值 }, 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); }, 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(); }, refreshTree: function (dTree) { //刷新树,并具有数据回显的功能,自动识别复选框or单选(未完成) if (typeof dTree === "string") { dTree = DTrees[dTree]; } if (typeof dTree === "undefined") { layer.msg("方法获取失败,请检查ID或对象传递是否正确", {icon: 2}); return; } }, escape: function (html) { return event.escape(html); }, unescape: function (str) { return event.unescape(str); }, version: function () { return VERSION; } }; exports('dtree', dtree); });