dtree.js 113 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808
  1. /**
  2. @Name:dtree 树形组件
  3. @Author:智慧的小西瓜
  4. @Site:http://www.wisdomelon.com/DTreeHelper/
  5. @License:LAYUI
  6. */
  7. layui.define(['jquery','layer','form'], function(exports) {
  8. var $ = layui.$,
  9. layer = layui.layer,
  10. form = layui.form;
  11. // 树的公共定义样式汇总
  12. var LI_NAV_CHILD = "dtree-nav-ul-sid", LI_NAV_ITEM = "dtree-nav-item",
  13. LI_DIV_ITEM = "dtree-nav-div", DTREEFONT = "dtreefont", DTREEFONTSPECIAL="dtreefont-special",
  14. 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",
  15. 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",
  16. LI_DIV_SPREAD_LAST = "dtree-icon-dian",
  17. 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",
  18. LI_CLICK_CHECKBAR = "d-click-checkbar", //绑定点击复选框时需要用到
  19. LI_DIV_TEXT_CLASS = "t-click", UL_ROOT="dtree";
  20. // 树的自定义样式
  21. var DTREE = "dtree-", //自定义样式前缀
  22. ITEMTHIS = "-item-this", //自定义样式当前行选中后缀
  23. ITEM = "-item", //自定义样式当前行后缀
  24. DFONT = "-dtreefont", //自定义样式图标样式后缀
  25. FICON = "-ficon", //自定义样式一级图标样式后缀
  26. ICON = "-icon", //自定义样式二级图标样式后缀
  27. CBOX = "-checkbox", //自定义样式复选框样式后缀
  28. CHS = "-choose"; //自定义样式复选框选中样式后缀
  29. // 树的公共指定
  30. var NAV_THIS = "dtree-nav-this", //当前节点
  31. NAV_SHOW = "dtree-nav-show", //显示子节点
  32. ICON_HIDE = "dtree-icon-hide", //隐藏dot图标
  33. $BODY = $("body"), //body选择器
  34. MOD_NAME = "dtree", //模块名称
  35. VERSION = "v2.4.5_finally_beta", //版本
  36. DTrees = {}; //当前被实例化的树的集合
  37. // 树的一级节点图标集合
  38. var firstIconArray = {
  39. "-1": {"open": "dtree-icon-null-open", "close": "dtree-icon-null-close"}, //未指定
  40. "0" : {"open": "dtree-icon-jian", "close": "dtree-icon-jia"},
  41. "1" : {"open": "dtree-icon-xiangxia1", "close": "dtree-icon-xiangyou"}
  42. };
  43. // 树的二级节点图标集合
  44. var nodeIconArray = {
  45. "-1": {"open": "dtree-icon-null-open", "close": "dtree-icon-null-close"}, //未指定
  46. "0" : {"open": "dtree-icon-wenjianjiazhankai", "close": "dtree-icon-weibiaoti5"}
  47. };
  48. var leafIconArray = {
  49. "-1": "dtree-icon-null", //未指定
  50. "0" : "dtree-icon-weibiaoti5", //文件夹
  51. "1" : "dtree-icon-yonghu", //人员
  52. "2" : "dtree-icon-fenzhijigou", //机构
  53. "3" : "dtree-icon-fenguangbaobiao", //报表
  54. "4" : "dtree-icon-xinxipilu", //信息
  55. "5" : "dtree-icon-shuye1", //叶子
  56. "6" : "dtree-icon-caidan_xunzhang", //勋章
  57. "7" : "dtree-icon-normal-file" //文件
  58. };
  59. // 树自定义操作事件名称集合 绑定dtree-click的事件
  60. var eventName = {
  61. checkNodeClick: "checkNodeClick", //点击复选框
  62. itemNodeClick: "itemNodeClick" //点击子节点div
  63. };
  64. // 树默认toolbar提供的功能集合 绑定dtree-tool的事件
  65. var defaultTool = {
  66. addToolbar: "addToolbar", //点击toolbar新增
  67. editToolbar: "editToolbar", //点击toolbar编辑
  68. delToolbar: "delToolbar" //点击toolbar删除
  69. };
  70. // 树默认menubar提供的功能集合 绑定dtree-menu的事件
  71. var defaultMenu = {
  72. moveDown: "moveDown", //menubar展开节点
  73. moveUp: "moveUp", //menubar收缩节点
  74. refresh: "refresh", //menubar刷新树
  75. remove: "remove", //menubar删除选中节点
  76. searchNode: "searchNode" //menubar查询节点
  77. };
  78. // 树的公共事件
  79. var event = {
  80. getElemId: function(options){ // 根据传入的参数获取ID
  81. var elem = options.elem || "";
  82. var obj = options.obj || $(elem);
  83. if (obj.length == 0) { //页面中未找到绑定id
  84. return "";
  85. } else {
  86. return $(obj)[0].id;
  87. }
  88. },
  89. escape: function(html){
  90. if(typeof html !== 'string') return '';
  91. return html.replace(entityReg.escape, function(match){return entityMap.escape[match];});
  92. },
  93. unescape: function(str){
  94. if(typeof str !== 'string') return '';
  95. return str.replace(entityReg.unescape, function(match){return entityMap.unescape[match];});
  96. },
  97. cloneObj: function (obj, filter) { //深复制对象方法
  98. var newObj = {};
  99. if (obj instanceof Array) {
  100. newObj = [];
  101. }
  102. var str = "";
  103. if(typeof filter !== 'undefined') {str = filter.join(",");}
  104. for (var key in obj) {
  105. if(str.indexOf(key) == -1){
  106. var val = obj[key];
  107. newObj[key] = typeof val === 'object' ? event.cloneObj(val, typeof filter !== undefined ? filter : []): val;
  108. }
  109. }
  110. return newObj;
  111. }
  112. };
  113. // 特殊符号转义
  114. var keys = Object.keys || function(obj) {
  115. obj = Object(obj);
  116. var arr = [];
  117. for(var a in obj) arr.push(a);
  118. return arr;
  119. };
  120. var invert = function(obj){
  121. obj = Object(obj);
  122. var result = {};
  123. for(var a in obj) result[obj[a]] = a;
  124. return result;
  125. };
  126. var entityMap = {
  127. escape: {
  128. "&" : "&",
  129. "<" : "&lt;",
  130. ">" : "&gt;",
  131. "'" : "&quo;"
  132. }
  133. };
  134. entityMap.unescape = invert(entityMap.escape);
  135. var entityReg = {
  136. escape: RegExp('[' + keys(entityMap.escape).join('') + ']', 'g'),
  137. unescape: RegExp('(' + keys(entityMap.unescape).join('|') + ')', 'g')
  138. };
  139. //异步加载接口
  140. var AjaxHelper = {
  141. request : function(config) {
  142. var data = config.data ? config.data : {};
  143. var async = (typeof (config.async) === "boolean") ? config.async : true;
  144. $.ajax({
  145. type : config.type ? config.type : "POST",
  146. headers : config.headers,
  147. url : config.url,
  148. dataType : config.dataType ? config.dataType : "json",
  149. data : data,
  150. async : async,
  151. success : config.success,
  152. error : function(XMLHttpRequest, textStatus, errorThrown) {
  153. if (typeof (config.error) === "function") {
  154. config.error();
  155. } else {
  156. layer.msg('系统异常导致操作失败, 请联系管理员。',{icon:5, shift:6});
  157. }
  158. },
  159. statusCode : {
  160. 404 : function() {
  161. layer.msg('未找到指定请求,请检查访问路径!',{icon:5, shift:6});
  162. },
  163. 500 : function() {
  164. layer.msg('系统错误,请联系管理员。',{icon:5, shift:6});
  165. }
  166. },
  167. complete : function(XMLHttpRequest, textStatus) {
  168. if (typeof (config.complete) === "function") {
  169. config.complete(XMLHttpRequest, textStatus);
  170. }
  171. }
  172. });
  173. },
  174. serialize: function(param){ //json序列化 key=value&key1=value1
  175. var p = "?";
  176. for (var key in param) {
  177. p += key + "=" + param[key] + "&";
  178. }
  179. p = p.substring(0, p.length-1);
  180. return p;
  181. }
  182. };
  183. // 树类
  184. var DTree = function(options){
  185. /** 默认赋值**/
  186. this.response = { // 树返回的json格式
  187. statusName: "code", //返回标识
  188. statusCode: 200, //返回码
  189. message: "message", //返回信息
  190. rootName: "data", //根节点名称
  191. treeId: "id", //节点ID
  192. parentId: "parentId", //父节点ID
  193. title: "title", //节点名称
  194. iconClass: "iconClass", //自定义图标
  195. childName: "children", //子节点名称
  196. isLast: "isLast", //是否最后一级节点
  197. // level: "level", //层级
  198. spread: "spread", //展开
  199. disabled: "disabled", //禁用
  200. checkArr: "checkArr", //复选框列表
  201. isChecked: "isChecked", //是否选中
  202. type: "type", //复选框标记
  203. basicData: "basicData" //表示用户自定义需要存储在树节点中的数据
  204. };
  205. this.defaultRequest = { // 树的默认发起请求参数格式,最后会将value作为参数名称传递
  206. nodeId: "nodeId", //节点ID
  207. parentId: "parentId", //父节点ID
  208. context: "context", //节点内容
  209. isLeaf: "isLeaf", //是否叶子节点
  210. level: "level", //层级
  211. spread: "spread", //节点展开状态
  212. dataType: "dataType", //节点标记
  213. ischecked: "ischecked", //节点复选框选中状态
  214. initchecked: "initchecked", //节点复选框初始状态
  215. basicData: "basicData", //用户自定义的记录节点数据
  216. recordData: "recordData", //当前data数据(排除basicData和children字段)
  217. };
  218. this.toolbarFun = {
  219. addTreeNode: function(param, $div) { //添加树节点后调用的函数,用于用户自定义,如未指定则树不会发生变化
  220. return ;
  221. },
  222. editTreeNode: function(param, $div) { //编辑树节点后调用的函数,用于用户自定义,如未指定则树不会发生变化
  223. return ;
  224. },
  225. editTreeLoad: function(param){ // 编辑树的数据回显,用于打开编辑时,回填数据
  226. return ;
  227. },
  228. delTreeNode: function(param, $div){ //删除树后调用的函数,用于用户自定义,如未指定则树不会发生变化
  229. return ;
  230. },
  231. loadToolbarBefore: function(buttons, param, $div){ // 右键菜单加载前的函数
  232. return buttons;
  233. }
  234. };
  235. this.toolbarStyle = {
  236. title: "节点",
  237. area: ["60%","80%"]
  238. };
  239. this.menubarFun = {
  240. remove: function(checkbarNodes){ //删除复选框选中节点,需要用户自定义,如未指定则树只是页面上做了修改
  241. return true;
  242. }
  243. };
  244. this.menubarTips = {
  245. toolbar: [],
  246. group: [defaultMenu.moveDown, defaultMenu.moveUp, defaultMenu.refresh, defaultMenu.remove, defaultMenu.searchNode],
  247. freedom: []
  248. };
  249. this.checkbarFun = {
  250. chooseBefore: function($i, node){ // 复选框点击前回调
  251. return true;
  252. },
  253. chooseDone: function(checkbarNodesParam) { //复选框点击事件完毕后,返回该树关于复选框操作的全部信息,用于用户自定义,如未指定则树只是页面上做了修改
  254. return ;
  255. }
  256. };
  257. this.iframe = { // 树点击节点时,打开iframe页面参数配置
  258. iframeElem: "", //iframe的ID
  259. iframeUrl: "", //树关联的frame地址
  260. iframeLoad: "leaf", //点击哪一层加载frame: node:所有节点, leaf:默认,最后一级
  261. iframeDefaultRequest: { //iframe的默认参数,目的是与加载树的参数不一样
  262. nodeId: "nodeId", //节点ID
  263. parentId: "parentId", //父节点ID
  264. context: "context", //节点内容
  265. isLeaf: "isLeaf", //是否叶子节点
  266. level: "level", //层级
  267. spread: "spread", //节点展开状态
  268. dataType: "dataType", //节点标记
  269. ischecked: "ischecked", //节点复选框选中状态
  270. initchecked: "initchecked", //节点复选框初始状态
  271. basicData: "basicData", //用户自定义的记录节点数据
  272. recordData: "recordData", //当前data数据(排除basicData和children字段)
  273. },
  274. iframeRequest: {} //iframe的自定义参数
  275. };
  276. this.iframeFun = {
  277. iframeDone: function(iframeParam){ //iframe加载完毕后,用于用户自定义事件
  278. return ;
  279. }
  280. };
  281. this.style = {
  282. item: "",
  283. itemThis: "",
  284. dfont: "",
  285. icon: "",
  286. cbox: "",
  287. chs: ""
  288. };
  289. /** 数据绑定**/
  290. this.node = { // 树节点选中时,包含当前节点的全部信息
  291. nodeId: "", //节点ID
  292. parentId: "", //父节点ID
  293. context: "", //节点内容
  294. isLeaf: "", //是否叶子节点
  295. level: "", //层级
  296. spread: "", //节点展开状态
  297. dataType: "", //节点标记
  298. ischecked: "", //节点复选框选中状态
  299. initchecked: "", //节点复选框初始状态
  300. basicData: "", //用户自定义的记录节点数据
  301. recordData: "", //当前data数据(排除basicData和children字段)
  302. };
  303. this.toolbarMenu = {}; // 工具栏右键菜单绑定的所有元素
  304. this.checkbarNode = []; // 复选框标记的全部节点数据
  305. this.checkArrLen = 0; //添加节点的时判断复选框个数
  306. this.temp = []; // 临时变量
  307. this.setting(options);
  308. };
  309. /******************** 初始参数加载 ********************/
  310. // 设置值
  311. DTree.prototype.setting = function(options) {
  312. this.options = options || {};
  313. /** 绑定元素参数(必填,2个参数项必填一个)**/
  314. this.elem = this.options.elem || ""; //树绑定的元素ID:#elem
  315. this.obj = this.options.obj || $(this.elem); //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到
  316. /** 基本参数**/
  317. this.initLevel = this.options.initLevel || 2; //默认展开节点 2节
  318. this.type = this.options.type || "load"; // 树的加载方式 all,全量树, load,增量树,默认load
  319. this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : true; //开启数据缓存
  320. this.record = (typeof (this.options.record) === "boolean") ? this.options.record : false; //开启数据记录模式
  321. this.load = (typeof (this.options.load) === "boolean") ? this.options.load : true; //开启加载动画
  322. /** 样式相关参数**/
  323. this.firstIconArray = $.extend(firstIconArray, this.options.firstIconArray) || firstIconArray; //用户自定义一级图标集合,node
  324. this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray) || nodeIconArray; //用户自定义二级图标集合,node
  325. this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray) || leafIconArray; //用户自定义二级图标集合,leaf
  326. this.skin = this.options.skin || "theme"; // 自定义样式
  327. if(this.skin == "layui"){ // layui主题
  328. this.ficon = this.options.ficon || "1"; // 一级图标样式,0:+,-
  329. this.dot = (typeof (this.options.dot) === "boolean") ? this.options.dot : false; //是否显示一级图标的小圆点,默认不显示
  330. this.icon = this.options.icon || "7"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章, -1:不显示二级图标。默认'1'
  331. this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; // 二级图标中的node节点图标
  332. } else { // 默认主题 或者自定义主题
  333. this.ficon = this.options.ficon || "0"; // 一级图标样式,0:+,-
  334. this.dot = (typeof (this.options.dot) === "boolean") ? this.options.dot : true; //是否显示一级图标的小圆点,默认显示
  335. this.icon = this.options.icon || "5"; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章, -1:不显示二级图标。默认'5'
  336. this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; // 二级图标中的node节点图标
  337. }
  338. /** 内置样式属性*/
  339. this.ficonOpen = this.firstIconArray[this.ficon]["open"]; // 一级图标中的node节点open图标
  340. this.ficonClose = this.firstIconArray[this.ficon]["close"]; // 一级图标中的node节点close图标
  341. this.nodeIconOpen = this.nodeIconArray[this.nodeIcon]["open"]; // 二级图标中的node节点open图标
  342. this.nodeIconClose = this.nodeIconArray[this.nodeIcon]["close"]; // 二级图标中的node节点close图标
  343. this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; // 二级图标中的leaf节点图标
  344. this.leafIconShow = this.leafIconArray[this.leafIcon]; // 二级图标中的leaf节点图标
  345. this.style.item = DTREE + this.skin + ITEM;
  346. this.style.itemThis = DTREE + this.skin + ITEMTHIS;
  347. this.style.dfont = DTREE + this.skin + DFONT;
  348. this.style.ficon = DTREE + this.skin + FICON;
  349. this.style.icon = DTREE + this.skin + ICON;
  350. this.style.cbox = DTREE + this.skin + CBOX;
  351. this.style.chs = DTREE + this.skin + CHS;
  352. /** 数据加载参数**/
  353. this.url = this.options.url || ""; //请求地址
  354. this.async = (typeof (this.options.async) === "boolean") ? this.options.async : true; //异步同步加载,默认异步加载
  355. this.headers = this.options.headers || {}; // ajax header属性
  356. this.method = this.options.method || "post"; //请求类型
  357. this.dataType = this.options.dataType || "json"; //参数类型
  358. this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest) || this.defaultRequest; //默认请求参数
  359. this.filterRequest = this.options.filterRequest || []; //过滤请求参数
  360. this.request = this.options.request || {}; //用户自定义请求参数
  361. this.response = $.extend(this.response, this.options.response) || this.response; //返回json格式
  362. this.data = this.options.data || null; //初始化指定该参数,则不会访问异步接口
  363. this.dataFormat = this.options.dataFormat || "levelRelationship"; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认
  364. this.dataStyle = this.options.dataStyle || "defaultStyle"; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格
  365. this.success = this.options.success || function(data, obj){}; //树加载完毕后执行解析树之前的回调(仅限异步加载)
  366. this.done = this.options.done || function(data, obj){}; //树加载完毕后的回调(仅限异步加载)
  367. /** 工具栏参数**/
  368. this.toolbar = this.options.toolbar || false; //是否开启可编辑模式
  369. this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小
  370. this.toolbarScroll = this.options.toolbarScroll || this.elem; //树的上级div容器,让树可以显示滚动条的div容器
  371. this.toolbarLoad = this.options.toolbarLoad || "node"; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级
  372. this.toolbarShow = this.options.toolbarShow || ["add","edit","delete"]; // toolbar三个按钮自定义加载
  373. this.toolbarBtn = this.options.toolbarBtn || null; // toolbar增删改中内容的自定义加载
  374. this.toolbarExt = this.options.toolbarExt || []; // toolbar按钮扩展
  375. this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun) || this.toolbarFun; // toolbar事件加载
  376. /** 菜单栏参数**/
  377. this.menubar = this.options.menubar || false; //是否打开菜单栏
  378. this.menubarTips = $.extend(this.menubarTips, this.options.menubarTips) || this.menubarTips; // 菜单栏吸附, toolbar:依附在工具栏,group:依附在按钮组,freedom,自由
  379. this.menubarFun = $.extend(this.menubarFun, this.options.menubarFun) || this.menubarFun; //menubar事件加载
  380. /** 复选框参数**/
  381. this.checkbar = this.options.checkbar || false; //是否开启复选框模式
  382. this.checkbarLoad = this.options.checkbarLoad || "node"; // 复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点
  383. this.checkbarType = this.options.checkbarType || "all" ; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all
  384. this.checkbarData = this.options.checkbarData || "choose" ; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all,记录全部数据,默认choose
  385. this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun) || this.checkbarFun; // checkbar事件加载
  386. /** iframe模式参数**/
  387. this.useIframe = this.options.useIframe || false; // 是否加载iframe 默认false,
  388. this.iframe = $.extend(this.iframe, this.options.iframe) || this.iframe; //iframe配置
  389. this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || this.iframeFun; //iframe事件加载
  390. };
  391. // 设置值
  392. DTree.prototype.reloadSetting = function(options) {
  393. this.options = $.extend(this.options, options) || this.options;
  394. /** 绑定元素参数**/
  395. this.elem = this.options.elem || this.elem; //树绑定的元素ID:#elem
  396. if(typeof this.options.obj === 'undefined'){
  397. if(this.elem) {
  398. if($(this.elem).length > 0) {
  399. this.obj = $(this.elem);
  400. }
  401. }
  402. } else {
  403. this.obj = this.options.obj || this.obj; //树绑定的jquery元素,用于当元素是延迟加载出来的话,可以用这个找到
  404. }
  405. /** 基本参数**/
  406. this.initLevel = this.options.initLevel || this.initLevel; //默认展开节点 2节
  407. this.type = this.options.type || this.type; // 树的加载方式 all,全量树, load,增量树,默认load
  408. this.cache = (typeof (this.options.cache) === "boolean") ? this.options.cache : this.cache; //开启数据缓存
  409. this.record = (typeof (this.options.record) === "boolean") ? this.options.record : this.record; //开启数据记录模式
  410. this.load = (typeof (this.options.load) === "boolean") ? this.options.load : this.load; //开启加载动画
  411. /** 样式相关参数**/
  412. this.firstIconArray = $.extend(firstIconArray, this.options.firstIconArray) || this.firstIconArray; //用户自定义一级图标集合,node
  413. this.nodeIconArray = $.extend(nodeIconArray, this.options.nodeIconArray) || this.nodeIconArray; //用户自定义二级图标集合,node
  414. this.leafIconArray = $.extend(leafIconArray, this.options.leafIconArray) || this.leafIconArray; //用户自定义二级图标集合,leaf
  415. this.skin = this.options.skin || this.skin; // 自定义样式
  416. if(this.skin == "layui"){ // layui主题
  417. this.ficon = this.options.ficon || this.ficon; // 一级图标样式,0:+,-
  418. this.dot = (typeof (this.options.dot) === "boolean") ? this.options.dot : false; //是否显示一级图标的小圆点,默认不显示
  419. this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章, -1:不显示二级图标。默认'1'
  420. this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "-1") : this.icon[0]; // 二级图标中的node节点图标
  421. } else { // 默认主题 或者自定义主题
  422. this.ficon = this.options.ficon || this.ficon; // 一级图标样式,0:+,-
  423. this.dot = (typeof (this.options.dot) === "boolean") ? this.options.dot : true; //是否显示一级图标的小圆点,默认显示
  424. this.icon = this.options.icon || this.icon; //二级图标样式,0:文件夹,1:人员,2:机构,3:报表,4:信息,5:叶子,6:勋章, -1:不显示二级图标。默认'5'
  425. this.nodeIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? (this.icon == "-1" ? "-1" : "0") : this.icon[0]; // 二级图标中的node节点图标
  426. }
  427. /** 内置样式属性*/
  428. this.ficonOpen = this.firstIconArray[this.ficon]["open"]; // 一级图标中的node节点open图标
  429. this.ficonClose = this.firstIconArray[this.ficon]["close"]; // 一级图标中的node节点close图标
  430. this.nodeIconOpen = this.nodeIconArray[this.nodeIcon]["open"]; // 二级图标中的node节点open图标
  431. this.nodeIconClose = this.nodeIconArray[this.nodeIcon]["close"]; // 二级图标中的node节点close图标
  432. this.leafIcon = (typeof this.icon === 'string' || typeof this.icon === 'number') ? this.icon : this.icon[1]; // 二级图标中的leaf节点图标
  433. this.leafIconShow = this.leafIconArray[this.leafIcon]; // 二级图标中的leaf节点图标
  434. this.style.item = DTREE + this.skin + ITEM;
  435. this.style.itemThis = DTREE + this.skin + ITEMTHIS;
  436. this.style.dfont = DTREE + this.skin + DFONT;
  437. this.style.ficon = DTREE + this.skin + FICON;
  438. this.style.icon = DTREE + this.skin + ICON;
  439. this.style.cbox = DTREE + this.skin + CBOX;
  440. this.style.chs = DTREE + this.skin + CHS;
  441. /** 数据加载参数**/
  442. this.url = this.options.url || this.url; //请求地址
  443. this.async = (typeof (this.options.async) === "boolean") ? this.options.async : this.async; //异步同步加载,默认异步加载
  444. this.headers = this.options.headers || this.headers; // ajax header属性
  445. this.method = this.options.method || this.method; //请求类型
  446. this.dataType = this.options.dataType || this.dataType; //参数类型
  447. this.defaultRequest = $.extend(this.defaultRequest, this.options.defaultRequest) || this.defaultRequest; //默认请求参数
  448. this.filterRequest = this.options.filterRequest || this.filterRequest; //过滤请求参数
  449. this.request = this.options.request || this.request; //用户自定义请求参数
  450. this.response = $.extend(this.response, this.options.response) || this.response; //返回json格式
  451. this.data = this.options.data || this.data; //初始化指定该参数,则不会访问异步接口
  452. this.dataFormat = this.options.dataFormat || this.dataFormat; //用于用户配置的data数据格式,list:列表, levelRelationship:层级关系,默认
  453. this.dataStyle = this.options.dataStyle || this.dataStyle; //用于用户配置layui通用的json数据风格,layuiStyle:layui风格,defaultStyle:默认风格
  454. this.success = this.options.success || this.success; //树加载完毕后执行解析树之前的回调(仅限异步加载)
  455. this.done = this.options.done || this.done; //树加载完毕后的回调(仅限异步加载)
  456. /** 可编辑模式参数**/
  457. this.toolbar = this.options.toolbar || this.toolbar; //是否开启可编辑模式
  458. this.toolbarStyle = $.extend(this.toolbarStyle, this.options.toolbarStyle) || this.toolbarStyle; //toolbar的自定义风格,标题,弹框大小
  459. this.toolbarScroll = this.options.toolbarScroll || this.toolbarScroll; //树的上级div容器,让树可以显示滚动条的div容器
  460. this.toolbarLoad = this.options.toolbarLoad || this.toolbarLoad; //toolbar作用范围:node:所有节点,noleaf:非最后一级节点,leaf:最后一级
  461. this.toolbarShow = this.options.toolbarShow || this.toolbarShow; // toolbar三个按钮
  462. this.toolbarBtn = this.options.toolbarBtn || this.toolbarBtn; // toolbar增删改中内容的自定义加载
  463. this.toolbarExt = this.options.toolbarExt || this.toolbarExt; // toolbar按钮扩展
  464. this.toolbarFun = $.extend(this.toolbarFun, this.options.toolbarFun) || this.toolbarFun; // toolbar事件加载
  465. /** 菜单栏参数**/
  466. this.menubar = this.options.menubar || this.menubar; //是否打开菜单栏
  467. this.menubarTips = $.extend(this.menubarTips, this.options.menubarTips) || this.menubarTips; // 菜单栏吸附, toolbar:依附在工具栏,group:依附在按钮组,freedom,自由
  468. this.menubarFun = $.extend(this.menubarFun, this.options.menubarFun) || this.menubarFun; //menubar事件加载
  469. /** 复选框参数**/
  470. this.checkbar = this.options.checkbar || this.checkbar; //是否开启复选框模式
  471. this.checkbarLoad = this.options.checkbarLoad || this.checkbarLoad; // 复选框作用范围,node:所有节点, leaf:最后一级;默认所有节点
  472. this.checkbarType = this.options.checkbarType || this.checkbarType ; //复选框选中形式 all:子集选中父级也选中, no-all:子集选中父级半选中,子集全选父级选中,p-casc:父级选中子集全选,子集无法改变父级选中状态, self:没有任何级联关系,only:只能选中一个复选框。 默认all
  473. this.checkbarData = this.options.checkbarData || this.checkbarData ; //复选框记录数据类型形式, change表示记录变更数据,choose表示记录选中数据,all,记录全部数据,默认choose
  474. this.checkbarFun = $.extend(this.checkbarFun, this.options.checkbarFun)|| this.checkbarFun ; // checkbar事件加载
  475. /** iframe模式参数**/
  476. this.useIframe = this.options.useIframe || this.useIframe; // 是否加载iframe 默认false,
  477. this.iframe = $.extend(this.iframe, this.options.iframe) || this.iframe; //iframe配置
  478. this.iframeFun = $.extend(this.iframeFun, this.options.iframeFun) || this.iframeFun; //iframe事件加载
  479. };
  480. /******************** 初始化数据区域 ********************/
  481. // 重载树
  482. DTree.prototype.reload = function(options){
  483. var _this = this;
  484. _this.reloadSetting(options);
  485. _this.init();
  486. };
  487. // 初始化树
  488. DTree.prototype.init = function(){
  489. var _this = this;
  490. if (typeof _this !== "object") {
  491. layer.msg("树组件未成功加载,请检查配置", {icon:5});
  492. return ;
  493. }
  494. if(_this.data) {
  495. if(typeof _this.data.length === 'undefined'){
  496. layer.msg("数据解析异常,data数据格式不正确", {icon:5});
  497. return ;
  498. }
  499. //先将ul中的元素清空
  500. _this.obj.html("");
  501. // 加载完毕后执行树解析前的回调
  502. _this.success(_this.data, _this.obj);
  503. // 第一次解析树
  504. if (_this.dataFormat == 'list'){
  505. //1.识别根节点ul中的data-id标签,判断顶级父节点
  506. var pid = _this.obj.attr("data-id");
  507. //2.构建一个存放节点的树组
  508. var rootListData = _this.queryListTreeByPid(pid, _this.data);
  509. _this.loadListTree(rootListData, _this.data, 1);
  510. } else {
  511. _this.loadTree(_this.data, 1);
  512. }
  513. // 加载完毕后的回调
  514. _this.done(_this.data, _this.obj);
  515. } else {
  516. if (!_this.url) {
  517. layer.msg("数据请求异常,url参数未指定", {icon:5});
  518. return ;
  519. }
  520. //先将ul中的元素清空
  521. _this.obj.html("");
  522. var index = _this.load ? layer.load(1) : "";
  523. AjaxHelper.request({
  524. async: _this.async,
  525. headers: _this.headers,
  526. type: _this.method,
  527. url: _this.url,
  528. dataType: _this.dataType,
  529. data: _this.getFilterRequestParam(_this.getRequestParam()),
  530. success: function(result) {
  531. if (typeof result === 'string') {
  532. result = $.parseJSON(result);
  533. }
  534. var code = "";
  535. if (_this.dataStyle == 'layuiStyle'){
  536. code = result[_this.response.statusName];
  537. } else {
  538. code = result.status[_this.response.statusName];
  539. }
  540. if (code == _this.response.statusCode) {
  541. // 加载完毕后执行树解析前的回调
  542. _this.success(result, _this.obj);
  543. // 第一次解析树
  544. if (_this.dataFormat == 'list'){
  545. //1.识别根节点ul中的data-id标签,判断顶级父节点
  546. var pid = _this.obj.attr("data-id");
  547. //2.构建一个存放节点的树组
  548. var rootListData = _this.queryListTreeByPid(pid, result[_this.response.rootName]);
  549. _this.loadListTree(rootListData, result[_this.response.rootName], 1);
  550. } else {
  551. _this.loadTree(result[_this.response.rootName], 1);
  552. }
  553. // 加载完毕后的回调
  554. _this.done(result, _this.obj);
  555. } else {
  556. if (_this.dataStyle == 'layuiStyle'){
  557. layer.msg(result[_this.response.message], {icon:2});
  558. } else {
  559. layer.msg(result.status[_this.response.message], {icon:2});
  560. }
  561. }
  562. },
  563. complete: function(){if(_this.load){layer.close(index);}}
  564. });
  565. }
  566. };
  567. // 加载子节点
  568. DTree.prototype.getChild = function($div, data) {
  569. var _this = this,
  570. $ul = $div.next("ul");
  571. _this.setNodeParam($div);
  572. if(typeof data !== 'undefined') {
  573. if(typeof data.length === 'undefined'){
  574. layer.msg("数据解析异常,data数据格式不正确", {icon:5});
  575. return ;
  576. }
  577. //先将ul中的元素清空
  578. $ul.html("");
  579. // 解析树
  580. if (_this.dataFormat == 'list'){
  581. var pid = _this.node.nodeId;
  582. var level = parseInt(_this.node.level)+1;
  583. var listData = _this.queryListTreeByPid(pid, data);
  584. _this.loadListTree(listData, _this.data, level);
  585. } else {
  586. _this.loadTree(data, level);
  587. }
  588. } else {
  589. if (!_this.url) {
  590. layer.msg("数据请求异常,url参数未指定", {icon:5});
  591. return ;
  592. }
  593. $ul.html("");
  594. var index = _this.load ? layer.load(1) : "";
  595. AjaxHelper.request({
  596. async: _this.async,
  597. headers: _this.headers,
  598. type: _this.method,
  599. url: _this.url,
  600. dataType: _this.dataType,
  601. data: _this.getFilterRequestParam(_this.getRequestParam()),
  602. success: function(result) {
  603. if (typeof result === 'string') {
  604. result = $.parseJSON(result);
  605. }
  606. var code = "";
  607. if (_this.dataStyle == 'layuiStyle'){
  608. code = result[_this.response.statusName];
  609. } else {
  610. code = result.status[_this.response.statusName];
  611. }
  612. if (code == _this.response.statusCode) {
  613. // 解析树
  614. var pid = _this.node.nodeId;
  615. var level = parseInt(_this.node.level)+1;
  616. if (_this.dataFormat == 'list'){
  617. var pListData = _this.queryListTreeByPid(pid, result[_this.response.rootName]);
  618. _this.loadListTree(pListData, result[_this.response.rootName], level, $ul);
  619. } else {
  620. _this.loadTree(result[_this.response.rootName], level, $ul);
  621. }
  622. $ul.addClass(NAV_SHOW);
  623. } else {
  624. if (_this.dataStyle == 'layuiStyle'){
  625. layer.msg(result[_this.response.message], {icon:2});
  626. } else {
  627. layer.msg(result.status[_this.response.message], {icon:2});
  628. }
  629. }
  630. },
  631. complete: function(){if(_this.load){layer.close(index);}}
  632. });
  633. }
  634. };
  635. // 初始化树或者拼接树
  636. DTree.prototype.loadListTree = function(pListData, listData, level, $ul){
  637. var _this = this;
  638. $ul = $ul || _this.getNowNodeUl(); //当前选中的节点或根节点
  639. if (pListData.length > 0){
  640. for (var i = 0; i < pListData.length; i++) {
  641. // 1.获取已知节点的全部数据
  642. var data = pListData[i];
  643. if(typeof data !== "object") continue;
  644. var parseData = _this.parseData(data);
  645. var childListData = _this.queryListTreeByPid(parseData.treeId(), listData); // 根据已知数据的id判断该条数据是否还有子数据
  646. // 3. 页面元素加载数据
  647. $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")));
  648. // 4.有子数据的元素加载子节点
  649. if(childListData.length > 0){
  650. var cLevel = parseInt(level)+1;
  651. _this.loadListTree(childListData, listData, cLevel, _this.obj.find("ul[data-id='"+parseData.treeId()+"']"));
  652. }
  653. }
  654. }
  655. };
  656. // 根据父ID查找list数据中匹配的元素
  657. DTree.prototype.queryListTreeByPid = function(pid, listData){
  658. var _this = this;
  659. var rootListData = [];
  660. if (listData) {
  661. for (var i = 0; i < listData.length; i++) {
  662. var data = listData[i];
  663. if(typeof data !== "object") continue;
  664. if(pid == "null" || pid == null){
  665. if(data[_this.response.parentId] == null) {
  666. rootListData.push(data);
  667. }
  668. } else {
  669. if (data[_this.response.parentId] == pid){
  670. rootListData.push(data);
  671. }
  672. }
  673. }
  674. }
  675. return rootListData;
  676. };
  677. // 初始化树或者拼接树
  678. DTree.prototype.loadTree = function(root, level, $ul){
  679. var _this = this;
  680. if (root) {
  681. $ul = $ul || _this.getNowNodeUl(); //当前选中的节点或根节点
  682. for (var i = 0; i < root.length; i++) { // 遍历跟节点或追加的跟节点
  683. var data = root[i];
  684. if(typeof data !== "object") continue;
  685. var parseData = _this.parseData(data);
  686. var children = parseData.children();
  687. $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")));
  688. if (children.length != 0) {
  689. var cLevel = parseInt(level)+1;
  690. _this.loadTree(children, cLevel, _this.obj.find("ul[data-id='"+parseData.treeId()+"']"));
  691. }
  692. }
  693. }
  694. };
  695. // 解析data数据
  696. DTree.prototype.parseData = function(data) {
  697. var _this = this;
  698. return {
  699. treeId: function(){
  700. return data[_this.response.treeId];
  701. },
  702. parentId: function(){
  703. return data[_this.response.parentId];
  704. },
  705. title: function(){
  706. return data[_this.response.title] || "";
  707. },
  708. level: function(){
  709. return data[_this.response.level] || "";
  710. },
  711. iconClass: function(){
  712. return data[_this.response.iconClass] || "";
  713. },
  714. isLast: function(len){
  715. return ((len == 0) ?
  716. ((typeof (data[_this.response.isLast]) === "boolean") ? data[_this.response.isLast] : true) :
  717. ((typeof (data[_this.response.isLast]) === "boolean") ? data[_this.response.isLast] : false));
  718. },
  719. spread: function(level){
  720. return ((level < _this.initLevel) ?
  721. ((typeof (data[_this.response.spread]) === "boolean") ? data[_this.response.spread] : true) :
  722. ((typeof (data[_this.response.spread]) === "boolean") ? data[_this.response.spread] : false));
  723. },
  724. disabled: function(){
  725. return (typeof (data[_this.response.disabled]) === "boolean") ? data[_this.response.disabled] : false;
  726. },
  727. checkArr: function(){
  728. var checkArr = [];
  729. var checkArrData = data[_this.response.checkArr];
  730. if(typeof checkArrData === 'string'){
  731. if(checkArrData.indexOf("{") > -1 && checkArrData.indexOf("}") > -1){
  732. checkArrData = JSON.parse(checkArrData);
  733. } else {
  734. checkArrData = {"type":"0","isChecked":checkArrData};
  735. }
  736. }
  737. if(typeof checkArrData === 'object'){
  738. if(typeof checkArrData.length === 'undefined'){
  739. checkArr.push(checkArrData);
  740. } else {
  741. checkArr = checkArrData;
  742. }
  743. }
  744. if(checkArr.length > 0 && checkArr.length > _this.checkArrLen){
  745. _this.checkArrLen = checkArr.length; // 获取复选框个数
  746. }
  747. return checkArr;
  748. },
  749. children: function(){
  750. return data[_this.response.childName] || [];
  751. },
  752. basicData: function(){
  753. return event.escape(JSON.stringify(data[_this.response.basicData])) || JSON.stringify({});
  754. },
  755. recordData: function(){
  756. var recordData = _this.record ? event.cloneObj(data, [_this.response.basicData, _this.response.childName]) : {};
  757. return event.escape(JSON.stringify(recordData));
  758. },
  759. data: function(){
  760. return event.escape(JSON.stringify(data));
  761. }
  762. }
  763. };
  764. //新增节点的dom值
  765. DTree.prototype.getDom = function(treeId, parentId, title, isLast, iconClass, checkArr, level, spread, disabled) {
  766. var _this = this,
  767. rootId = _this.obj[0].id,
  768. toolbar = _this.toolbar,
  769. checkbar = _this.checkbar;
  770. return {
  771. fnode: function() { // + - 图标
  772. // 获取图标的变量
  773. var ficon = _this.ficon,
  774. ficonOpen = _this.ficonOpen,
  775. ficonClose = _this.ficonClose,
  776. dot = _this.dot;
  777. if(ficon != "-1" && dot){ // 都加载
  778. return isLast ? "<i class='"+DTREEFONT+" "+LI_DIV_SPREAD_LAST+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" :
  779. (spread ? "<i class='"+DTREEFONT+" "+ficonOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+DTREEFONT+" "+ficonClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>");
  780. }
  781. if(ficon != "-1" && !dot){ // 加载node 隐藏leaf
  782. return isLast ? "<i class='"+DTREEFONT+" "+LI_DIV_SPREAD_LAST+" "+ICON_HIDE+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" :
  783. (spread ? "<i class='"+DTREEFONT+" "+ficonOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+DTREEFONT+" "+ficonClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>");
  784. }
  785. if(ficon == "-1" && dot){ // 隐藏node 加载leaf
  786. return isLast ? "<i class='"+DTREEFONT+" "+LI_DIV_SPREAD_LAST+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" :
  787. (spread ? "<i class='"+DTREEFONT+" "+ficonOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+DTREEFONT+" "+ficonClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>");
  788. }
  789. if(ficon == "-1" && !dot){ // 都隐藏
  790. return isLast ? "<i class='"+DTREEFONT+" "+LI_DIV_SPREAD_LAST+" "+ICON_HIDE+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"' style='display:none;'></i>" :
  791. (spread ? "<i class='"+DTREEFONT+" "+ficonOpen+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+DTREEFONT+" "+ficonClose+" "+_this.style.dfont+" "+_this.style.ficon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>");
  792. }
  793. },
  794. node: function() { // 二级图标样式
  795. // 获取图标的变量
  796. var nodeIcon = _this.nodeIcon,
  797. leafIcon = _this.leafIcon;
  798. var leafIconShow = _this.leafIconShow,
  799. nodeIconOpen = _this.nodeIconOpen,
  800. nodeIconClose = _this.nodeIconClose;
  801. if(iconClass){
  802. leafIconShow = iconClass;
  803. nodeIconOpen = iconClass;
  804. nodeIconClose = iconClass;
  805. }
  806. if(nodeIcon != "-1" && leafIcon != "-1"){ // 都加载
  807. return isLast ? "<i class='"+DTREEFONT+" "+leafIconShow+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" :
  808. (spread ? "<i class='"+DTREEFONT+" "+nodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+DTREEFONT+" "+nodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>");
  809. }
  810. if(nodeIcon != "-1" && leafIcon == "-1"){ // 加载node 隐藏leaf
  811. return isLast ? "<i class='"+DTREEFONT+" "+leafIconShow+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" :
  812. (spread ? "<i class='"+DTREEFONT+" "+nodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+DTREEFONT+" "+nodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>");
  813. }
  814. if(nodeIcon == "-1" && leafIcon != "-1"){ // 隐藏node 加载leaf
  815. return isLast ? "<i class='"+DTREEFONT+" "+leafIconShow+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" :
  816. (spread ? "<i class='"+DTREEFONT+" "+nodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+DTREEFONT+" "+nodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>");
  817. }
  818. if(nodeIcon == "-1" && leafIcon == "-1"){ // 都隐藏
  819. return isLast ? "<i class='"+DTREEFONT+" "+leafIconShow+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='last' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" :
  820. (spread ? "<i class='"+DTREEFONT+" "+nodeIconOpen+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='open' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>" : "<i class='"+DTREEFONT+" "+nodeIconClose+" "+DTREEFONTSPECIAL+" "+_this.style.dfont+" "+_this.style.icon+"' data-spread='close' data-id='"+treeId+"' dtree-id='"+rootId+"'></i>");
  821. }
  822. },
  823. checkbox: function() { // 复选框
  824. var flag = false;
  825. if(_this.checkbarLoad == "node"){if (checkbar) {flag = true;}} else {if (isLast) {if (checkbar) {flag = true;}}}
  826. if(flag){
  827. var result = "<div class='"+LI_DIV_CHECKBAR+"' data-id='"+treeId+"' dtree-id='"+rootId+"'>";
  828. if(checkArr && checkArr.length > 0){
  829. for (var i = 0; i < checkArr.length; i++) {
  830. var checkData = checkArr[i];
  831. var isChecked = checkData.isChecked;
  832. var CHOOSE_CLASS = LI_DIV_CHECKBAR_OUT;
  833. if (isChecked == "2") { //半选择
  834. CHOOSE_CLASS = LI_DIV_CHECKBAR_NOALL + " " + _this.style.chs;
  835. } else if (isChecked == "1") { //选择
  836. CHOOSE_CLASS = LI_DIV_CHECKBAR_ON + " " + _this.style.chs;
  837. } else { //未选择或者无值
  838. CHOOSE_CLASS = LI_DIV_CHECKBAR_OUT;
  839. }
  840. result += "<i class='"+DTREEFONT+" "+_this.style.dfont+" "+_this.style.cbox+" "+CHOOSE_CLASS+"' data-id='"+treeId+"' dtree-id='"+rootId+"' data-checked='"+checkData.isChecked+"' data-initchecked='"+checkData.isChecked+"' data-type='"+checkData.type+"' dtree-click='"+eventName.checkNodeClick+"' data-par='."+LI_CLICK_CHECKBAR+"'></i>";
  841. }
  842. }
  843. result += "</div>";
  844. return result;
  845. }
  846. return "";
  847. },
  848. text: function() { // 文字显示
  849. return "<cite class='"+LI_DIV_TEXT_CLASS+"' data-id='"+treeId+"' data-leaf='"+(isLast ? "leaf" : "node")+"'>"+title+"</cite>";
  850. },
  851. ul: function() { //子节点ul
  852. return isLast ? "<ul class='"+LI_NAV_CHILD+"' data-id='"+treeId+"' dtree-id='"+rootId+"'></ul>" :
  853. (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>");
  854. }
  855. };
  856. };
  857. // 获取拼接好的li
  858. DTree.prototype.getLiItemDom = function(treeId, parentId, title, isLast, iconClass, checkArr, level, spread, disabled, basicData, recordData, flag) {
  859. var _this = this,
  860. rootId = _this.obj[0].id;
  861. var dom = _this.getDom(treeId, parentId, title, isLast, iconClass, checkArr, level, spread, disabled);
  862. basicData = (basicData == "{}") ? "" : basicData;
  863. recordData = (recordData == "{}") ? "" : recordData;
  864. 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+"' ";
  865. if(_this.toolbar){
  866. if(_this.toolbarLoad == "node") { div += " d-contextmenu='true'>"; }
  867. if(_this.toolbarLoad == "noleaf") { if(!isLast){ div += " d-contextmenu='true'>"; } else { div += " d-contextmenu='false'>";} }
  868. if(_this.toolbarLoad == "leaf") { if(isLast){ div += " d-contextmenu='true'>"; } else { div += " d-contextmenu='false'>";} }
  869. } else { div += " d-contextmenu='false'>"; }
  870. var li = ["<li " + "class='"+LI_CLICK_CHECKBAR+" "+ LI_NAV_ITEM +"'" + "data-id='"+treeId+"'" + "data-pid='"+(flag == "root" ? (parentId ? parentId : "-1") : parentId)+"'" + "dtree-id='"+rootId+"'" + "data-index='"+level+"'" + ">" +
  871. div ,
  872. dom.fnode(),
  873. dom.node(),
  874. dom.checkbox(),
  875. dom.text(),
  876. "</div>", dom.ul(), "</li>"].join("");
  877. return li;
  878. };
  879. // 初始化节点,用于数据回显
  880. DTree.prototype.dataInit = function(chooseId){
  881. var _this = this;
  882. var $div = _this.obj.find("div[data-id='"+chooseId+"']");
  883. $div.parent().find("."+NAV_THIS).removeClass(NAV_THIS);
  884. $div.parent().find("."+_this.style.itemThis).removeClass(_this.style.itemThis);
  885. $div.addClass(NAV_THIS);
  886. $div.addClass(_this.style.itemThis);
  887. _this.setNodeParam($div);
  888. // 将该节点的父节点全部展开
  889. var $li_parents = $div.parents("."+LI_NAV_ITEM);
  890. $li_parents.children("ul").addClass(NAV_SHOW);
  891. $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+_this.ficonClose).addClass(_this.ficonOpen);
  892. $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+_this.ficonClose).removeClass(_this.ficonClose);
  893. $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+_this.nodeIconClose).addClass(_this.nodeIconOpen);
  894. $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+_this.nodeIconClose).removeClass(_this.nodeIconClose);
  895. return _this.getNowParam();
  896. };
  897. /******************** 基础事件区域 ********************/
  898. // 展开或隐藏节点 作用点: div
  899. DTree.prototype.clickSpread = function($div) {
  900. var $i_spread = $div.find("i[data-spread]").eq(0),
  901. $i_node = $div.find("i[data-spread]").eq(1),
  902. i_node_class = $i_node.attr("class"),
  903. $cite = $div.find("cite[data-leaf]").eq(0),
  904. spread = $i_spread.attr("data-spread"),
  905. $ul = $div.next("ul");
  906. var _this = this;
  907. if ($ul.length > 0) {
  908. if (spread == "close") {
  909. if (_this.type=="load") { //增加加载
  910. if (_this.cache) { //开启缓存
  911. if ($ul.html()) {
  912. $ul.addClass(NAV_SHOW);
  913. } else { //加载节点
  914. _this.getChild($div);
  915. }
  916. }else { //每次取新的数据
  917. $ul.html("");
  918. _this.getChild($div);
  919. }
  920. } else { // 全量加载
  921. $ul.addClass(NAV_SHOW);
  922. }
  923. $div.find("i[data-spread]").attr("data-spread","open");
  924. $i_spread.removeClass(_this.ficonClose);
  925. $i_spread.addClass(_this.ficonOpen);
  926. var node_class = _this.nodeIconClose;
  927. if(i_node_class.indexOf(node_class) > 0){
  928. $i_node.removeClass(_this.nodeIconClose);
  929. $i_node.addClass(_this.nodeIconOpen);
  930. }
  931. } else if (spread == "open") {
  932. $ul.removeClass(NAV_SHOW);
  933. $div.find("i[data-spread]").attr("data-spread","close");
  934. $i_spread.removeClass(_this.ficonOpen);
  935. $i_spread.addClass(_this.ficonClose);
  936. var node_class = _this.nodeIconOpen;
  937. if(i_node_class.indexOf(node_class) > 0){
  938. $i_node.removeClass(_this.nodeIconOpen);
  939. $i_node.addClass(_this.nodeIconClose);
  940. }
  941. }
  942. }
  943. };
  944. // 数据格式化
  945. DTree.prototype.escape = function(html){
  946. return event.escape(html);
  947. };
  948. // 格式化数据转回正常数据
  949. DTree.prototype.unescape = function(str){
  950. return event.unescape(str);
  951. };
  952. /******************** 工具栏及菜单栏区域 ********************/
  953. // 初始化菜单栏和工具栏的div
  954. DTree.prototype.initTreePlus = function(){
  955. var _this = this;
  956. // 初始化菜单栏和工具栏的div
  957. _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).remove();
  958. _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).remove();
  959. _this.toolbarMenu = {};
  960. 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>");
  961. if(_this.toolbar) _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>");
  962. };
  963. // 开启工具栏和菜单栏
  964. DTree.prototype.openTreePlus = function(){
  965. var _this = this;
  966. // 先对工具栏做处理,因为菜单栏可能会与工具栏产生关联。
  967. var ggMenu = [];
  968. if(_this.toolbar) _this.getToolbarDom();
  969. if(_this.menubar) {
  970. var menubarTips = _this.menubarTips,
  971. mtbar = menubarTips.toolbar,
  972. group = menubarTips.group,
  973. freedom = menubarTips.freedom;
  974. if(mtbar && mtbar.length > 0){
  975. // 菜单栏吸附工具栏上
  976. for(var i=0; i<mtbar.length; i++){
  977. var mt = mtbar[i];
  978. if(typeof mt === 'string'){
  979. _this.getMenubarToolDom(mt);
  980. }
  981. if(typeof mt === 'object'){
  982. _this.getExtMenubarToolDom(mt);
  983. }
  984. }
  985. }
  986. if(group && group.length > 0){
  987. // 菜单栏吸附在上方的按钮组div中
  988. for(var i=0; i<group.length; i++){
  989. var gg = group[i];
  990. if(typeof gg === 'string'){
  991. ggMenu.push(_this.getMenubarDom(gg));
  992. }
  993. if(typeof gg === 'object'){
  994. ggMenu.push(_this.getExtMenubarDom(gg));
  995. }
  996. }
  997. _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).children('div.layui-btn-group').append(ggMenu.join(""));
  998. }
  999. }
  1000. };
  1001. /******************** 菜单栏区域 ********************/
  1002. // 获取菜单栏
  1003. DTree.prototype.getMenubarDom = function(menu){
  1004. var _this = this;
  1005. var rootId = _this.obj[0].id;
  1006. var gg = "";
  1007. switch (menu) {
  1008. case defaultMenu.moveDown:
  1009. gg = "<button class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.moveDown+"' title='展开节点'><i class='"+DTREEFONT+" "+LI_DIV_MENUBAR_DOWN+"'></i></button>";
  1010. break;
  1011. case defaultMenu.moveUp:
  1012. gg = "<button class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.moveUp+"' title='收缩节点'><i class='"+DTREEFONT+" "+LI_DIV_MENUBAR_UP+"'></i></button>";
  1013. break;
  1014. case defaultMenu.refresh:
  1015. gg = "<button class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.refresh+"' title='刷新'><i class='"+DTREEFONT+" "+LI_DIV_MENUBAR_REFRESH+"'></i></button>";
  1016. break;
  1017. case defaultMenu.remove:
  1018. gg = (_this.checkbar) ? "<button class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.remove+"' title='删除选中节点'><i class='"+DTREEFONT+" "+LI_DIV_MENUBAR_DELETE+"'></i></button>" : "";
  1019. break;
  1020. case defaultMenu.searchNode:
  1021. gg = "<button class='layui-btn layui-btn-sm layui-btn-primary' dtree-id='"+rootId+"' d-menu='"+defaultMenu.searchNode+"' title='查询节点'><i class='"+DTREEFONT+" "+LI_DIV_MENUBAR_SEARCH+"'></i></button>";
  1022. break;
  1023. }
  1024. return gg;
  1025. };
  1026. // 获取扩展菜单栏
  1027. DTree.prototype.getExtMenubarDom = function(menu){
  1028. var _this = this;
  1029. return "<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='"+DTREEFONT+" "+menu.icon+"'></i></button>";
  1030. };
  1031. // 获取依附在工具栏的菜单栏
  1032. DTree.prototype.getMenubarToolDom = function(menu){
  1033. var _this = this;
  1034. var rootId = _this.obj[0].id;
  1035. switch (menu) {
  1036. case defaultMenu.moveDown:
  1037. _this.toolbarMenu[defaultMenu.moveDown] = "<dd><a dtree-id='"+rootId+"' d-menu='"+defaultMenu.moveDown+"'><i class='"+DTREEFONT+" "+LI_DIV_MENUBAR_DOWN+"'></i>&nbsp;展开"+_this.toolbarStyle.title+"</a></dd>";
  1038. break;
  1039. case defaultMenu.moveUp:
  1040. _this.toolbarMenu[defaultMenu.moveUp] = "<dd><a dtree-id='"+rootId+"' d-menu='"+defaultMenu.moveUp+"'><i class='"+DTREEFONT+" "+LI_DIV_MENUBAR_UP+"'></i>&nbsp;收缩"+_this.toolbarStyle.title+"</a></dd>";
  1041. break;
  1042. case defaultMenu.refresh:
  1043. _this.toolbarMenu[defaultMenu.refresh] = "<dd><a dtree-id='"+rootId+"' d-menu='"+defaultMenu.refresh+"'><i class='"+DTREEFONT+" "+LI_DIV_MENUBAR_REFRESH+"'></i>&nbsp;刷新</a></dd>";
  1044. break;
  1045. case defaultMenu.remove:
  1046. if(_this.checkbar)
  1047. _this.toolbarMenu[defaultMenu.remove] = "<dd><a dtree-id='"+rootId+"' d-menu='"+defaultMenu.remove+"'><i class='"+DTREEFONT+" "+LI_DIV_MENUBAR_DELETE+"'></i>&nbsp;删除选中"+_this.toolbarStyle.title+"</a></dd>";
  1048. break;
  1049. case defaultMenu.searchNode:
  1050. _this.toolbarMenu[defaultMenu.searchNode] = "<dd><a dtree-id='"+rootId+"' d-menu='"+defaultMenu.searchNode+"'><i class='"+DTREEFONT+" "+LI_DIV_MENUBAR_SEARCH+"'></i>&nbsp;查询"+_this.toolbarStyle.title+"</a></dd>";
  1051. break;
  1052. }
  1053. };
  1054. // 获取依附在工具栏的扩展菜单栏
  1055. DTree.prototype.getExtMenubarToolDom = function(menu){
  1056. var _this = this;
  1057. _this.toolbarMenu[menu.menubarId] = "<dd><a dtree-id='"+_this.obj[0].id+"' d-menu='"+menu.menubarId+"'><i class='"+DTREEFONT+" "+menu.icon+"'></i>&nbsp;"+menu.title+"</a></dd>";
  1058. };
  1059. // menubar内置方法
  1060. DTree.prototype.menubarMethod = function(){
  1061. var _this = this;
  1062. return {
  1063. openAllNode: function(obj){ // 展开所有节点
  1064. var $ulNode = obj || _this.obj.children("li").children("ul");
  1065. // 遍历所有ul子节点
  1066. for (var i = 0; i < $ulNode.length; i++) {
  1067. // 获取当前节点的信息
  1068. var $ul = $($ulNode[i]),
  1069. $div = $ul.prev("div"),
  1070. $i_spread = $div.find("i[data-spread]").eq(0),
  1071. $i_node = $div.find("i[data-spread]").eq(1),
  1072. i_node_class = $i_node.attr("class"),
  1073. $cite = $div.find("cite[data-leaf]").eq(0),
  1074. spread = $i_spread.attr("data-spread"),
  1075. leaf = $cite.attr("data-leaf");
  1076. if (leaf == "leaf") { continue; } // 说明是叶子了,则继续循环下一个
  1077. if (spread == "open") {
  1078. // 说明该节点已经展开了,则进行子节点循环
  1079. } else {
  1080. if (_this.type=="load") { //是否全量加载
  1081. if (_this.cache) { //是否开启缓存
  1082. if ($ul.html()) {
  1083. $ul.addClass(NAV_SHOW);
  1084. } else { //加载节点
  1085. _this.getChild($div);
  1086. }
  1087. }else { //每次取新的数据
  1088. $ul.html("");
  1089. _this.getChild($div);
  1090. }
  1091. } else { // 全量加载
  1092. $ul.addClass(NAV_SHOW);
  1093. }
  1094. $div.find("i[data-spread]").attr("data-spread","open");
  1095. $i_spread.removeClass(_this.ficonClose);
  1096. $i_spread.addClass(_this.ficonOpen);
  1097. var node_class = _this.nodeIconClose;
  1098. if(i_node_class.indexOf(node_class) > 0){
  1099. $i_node.removeClass(_this.nodeIconClose);
  1100. $i_node.addClass(_this.nodeIconOpen);
  1101. }
  1102. }
  1103. var $childUl = $ul.children("li").children("ul");
  1104. _this.menubarMethod().openAllNode($childUl);
  1105. }
  1106. },
  1107. closeAllNode: function(){ //收缩所有节点
  1108. _this.obj.find("."+LI_NAV_CHILD).each(function(){
  1109. // 获取当前节点的信息
  1110. var $ul = $(this),
  1111. $div = $ul.prev("div"),
  1112. $i_spread = $div.find("i[data-spread]").eq(0),
  1113. $i_node = $div.find("i[data-spread]").eq(1),
  1114. i_node_class = $i_node.attr("class"),
  1115. $cite = $div.find("cite[data-leaf]").eq(0),
  1116. spread = $i_spread.attr("data-spread"),
  1117. leaf = $cite.attr("data-leaf");
  1118. $ul.removeClass(NAV_SHOW);
  1119. $div.find("i[data-spread]").attr("data-spread","close");
  1120. $i_spread.removeClass(_this.ficonOpen);
  1121. $i_spread.addClass(_this.ficonClose);
  1122. var node_class = _this.nodeIconOpen;
  1123. if(i_node_class.indexOf(node_class) > 0){
  1124. $i_node.removeClass(_this.nodeIconOpen);
  1125. $i_node.addClass(_this.nodeIconClose);
  1126. }
  1127. });
  1128. },
  1129. refreshTree: function(){// 刷新树
  1130. _this.obj.html(""); // 清空树结构
  1131. _this.initNodeParam(); // 清空参数
  1132. _this.init(); //执行初始化方法
  1133. },
  1134. remove: function(){// 删除选中节点
  1135. var len = _this.obj.find("i[data-par][data-checked='1']").length;
  1136. if(len == 0){
  1137. layer.msg("请至少选中一个节点",{icon:2});
  1138. }else{
  1139. //操作前先清空
  1140. _this.checkbarNode = [];
  1141. // 选择所有复选框节点
  1142. var i_node = {};
  1143. _this.obj.find("i[data-par][data-checked='1']").each(function(){
  1144. var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
  1145. _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
  1146. });
  1147. layer.confirm('确定要删除选中节点?', {icon: 3, title:'删除选中节点'}, function(index1){
  1148. var flag = _this.menubarFun.remove(_this.checkbarNode);
  1149. if(flag){
  1150. _this.obj.find("i[data-par][data-checked='1']").closest("."+LI_DIV_ITEM).next("ul").remove();
  1151. _this.obj.find("i[data-par][data-checked='1']").closest("."+LI_DIV_ITEM).remove();
  1152. _this.checkbarNode=[];
  1153. }
  1154. layer.close(index1);
  1155. });
  1156. }
  1157. },
  1158. searchNode: function(){//模糊查询该值,展开该值节点
  1159. layer.prompt({
  1160. formType: 0,
  1161. value: "",
  1162. title: '查询节点'
  1163. }, function(value, index1, elem){
  1164. if (value) {
  1165. var flag = _this.searchNode(value);
  1166. if (!flag) {
  1167. layer.msg("该名称节点不存在!", {icon:5});
  1168. }
  1169. } else {
  1170. layer.msg("未指定查询节点名称", {icon:5});
  1171. }
  1172. layer.close(index1);
  1173. });
  1174. },
  1175. extMethod: function(menuId, $div, flag){
  1176. if(_this.menubar && _this.menubarTips.group && _this.menubarTips.group.length > 0 && flag == "group"){
  1177. for(var i=0; i<_this.menubarTips.group.length; i++){
  1178. var ext = _this.menubarTips.group[i];
  1179. if (menuId == ext.menubarId){
  1180. ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div));
  1181. break;
  1182. }
  1183. }
  1184. }
  1185. if(_this.menubar && _this.menubarTips.toolbar && _this.menubarTips.toolbar.length > 0 && flag == "toolbar"){
  1186. for(var i=0; i<_this.menubarTips.toolbar.length; i++){
  1187. var ext = _this.menubarTips.toolbar[i];
  1188. if (menuId == ext.menubarId){
  1189. ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div));
  1190. break;
  1191. }
  1192. }
  1193. }
  1194. if(_this.menubar && _this.menubarTips.freedom && _this.menubarTips.freedom.length > 0 && flag == "freedom"){
  1195. for(var i=0; i<_this.menubarTips.freedom.length; i++){
  1196. var ext = _this.menubarTips.freedom[i];
  1197. if (menuId == ext.menubarId){
  1198. ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div));
  1199. break;
  1200. }
  1201. }
  1202. }
  1203. }
  1204. };
  1205. };
  1206. // menubar监听方法
  1207. DTree.prototype.menubarListener = function(menuId, flag){
  1208. var _this = this;
  1209. var $div = _this.getNowNode();
  1210. switch (menuId) {
  1211. case defaultMenu.moveDown: // 展开节点
  1212. _this.menubarMethod().openAllNode();
  1213. break;
  1214. case defaultMenu.moveUp: // 收缩节点
  1215. _this.menubarMethod().closeAllNode();
  1216. break;
  1217. case defaultMenu.refresh:
  1218. _this.menubarMethod().refreshTree(); // 刷新树
  1219. break;
  1220. case defaultMenu.remove:
  1221. _this.menubarMethod().remove();
  1222. break;
  1223. case defaultMenu.searchNode:
  1224. _this.menubarMethod().searchNode();
  1225. break;
  1226. default:
  1227. _this.menubarMethod().extMethod(menuId, $div, flag);
  1228. break;
  1229. }
  1230. };
  1231. //模糊查询该值,展开该值节点
  1232. DTree.prototype.searchNode = function(value){
  1233. var _this = this;
  1234. var b = false;
  1235. var $lis = [];
  1236. _this.obj.find("cite[data-leaf]").each(function(){
  1237. var $nthis = $(this);
  1238. var html = $nthis.html();
  1239. if(html.indexOf(value) > -1){
  1240. if($nthis.attr("data-leaf") == "leaf") {
  1241. // 叶子节点提供包含父节点的所有信息
  1242. var title = "";
  1243. $nthis.parents("li").each(function(){
  1244. title = "-" + $(this).find("cite[data-leaf]").html() + title;
  1245. });
  1246. title = title.substring(1, title.length);
  1247. $nthis.attr("title", title);
  1248. }
  1249. // 保存当前cite所在的li及父li中包含该值,则只保留父的
  1250. var i = 0;
  1251. $nthis.parents("li").each(function(){
  1252. var html2 = $(this).find("cite[data-leaf]").html();
  1253. if(html2.indexOf(value) > -1){
  1254. i++;
  1255. }
  1256. if(i >= 2){
  1257. return true;
  1258. }
  1259. });
  1260. if (i < 2){
  1261. $lis.push($nthis.closest("li").prop("outerHTML"));
  1262. }
  1263. }
  1264. });
  1265. if($lis.length > 0) {
  1266. b = true;
  1267. // 1.将树节点清空
  1268. _this.obj.html("");
  1269. // 2.遍历所有cite节点,展开当前cite节点
  1270. for(var i=0; i<$lis.length; i++){
  1271. _this.obj.append($lis[i]);
  1272. }
  1273. }
  1274. return b;
  1275. };
  1276. /******************** 工具栏区域 ********************/
  1277. // 获取工具栏
  1278. DTree.prototype.getToolbarDom = function(){
  1279. var _this = this;
  1280. var toolbarShow = _this.toolbarShow;
  1281. var toolbarExt = _this.toolbarExt;
  1282. if(toolbarShow.length > 0){
  1283. for(var i=0; i<toolbarShow.length; i++){
  1284. var show = toolbarShow[i];
  1285. if(show == "add"){
  1286. _this.toolbarMenu[defaultTool.addToolbar] = "<dd><a dtree-tool='"+defaultTool.addToolbar+"'><i class='"+DTREEFONT+" "+LI_DIV_TOOLBAR_ADD+"'></i>&nbsp;新增"+_this.toolbarStyle.title+"</a></dd>";
  1287. }
  1288. if(show == "edit"){
  1289. _this.toolbarMenu[defaultTool.editToolbar] = "<dd><a dtree-tool='"+defaultTool.editToolbar+"'><i class='"+DTREEFONT+" "+LI_DIV_TOOLBAR_EDIT+"'></i>&nbsp;编辑"+_this.toolbarStyle.title+"</a></dd>";
  1290. }
  1291. if(show == "delete"){
  1292. _this.toolbarMenu[defaultTool.delToolbar] = "<dd><a dtree-tool='"+defaultTool.delToolbar+"'><i class='"+DTREEFONT+" "+LI_DIV_TOOLBAR_DEL+"'></i>&nbsp;删除"+_this.toolbarStyle.title+"</a></dd>";
  1293. }
  1294. }
  1295. }
  1296. if(toolbarExt.length > 0){
  1297. for(var i=0; i<toolbarExt.length; i++){
  1298. var ext = toolbarExt[i];
  1299. _this.toolbarMenu[ext.toolbarId] = "<dd><a dtree-tool='"+ext.toolbarId+"'><i class='"+DTREEFONT+" "+ext.icon+"'></i>&nbsp;"+ext.title+"</a></dd>";
  1300. }
  1301. }
  1302. };
  1303. // 设置工具栏按钮
  1304. DTree.prototype.setToolbarDom = function(toolbarMenu){
  1305. var _this = this;
  1306. if(toolbarMenu){
  1307. _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).find('div.layui-nav-item>dl.layui-nav-child').html("");
  1308. for(var key in toolbarMenu){
  1309. _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).find('div.layui-nav-item>dl.layui-nav-child').append(toolbarMenu[key]);
  1310. }
  1311. }
  1312. }
  1313. // 加载toolBar中的内容
  1314. DTree.prototype.loadToolBar = function(title, name){
  1315. var _this = this;
  1316. var toolbarShow = _this.toolbarShow;
  1317. var nodeBarContents = _this.toolbarBtn;
  1318. var html = "";
  1319. switch (name) {
  1320. case defaultTool.addToolbar:
  1321. //1. 必须加载的节点内容
  1322. var nowNode = ['<div class="layui-form-item">',
  1323. '<label class="layui-form-label">当前选中:</label>',
  1324. '<div class="layui-input-block f-input-par">',
  1325. '<input type="text" name="nodeTitle" class="layui-input f-input" value="'+title+'" readonly/>',
  1326. '</div>',
  1327. '</div>'].join('');
  1328. var addNodeName = ['<div class="layui-form-item">',
  1329. '<label class="layui-form-label">新增'+_this.toolbarStyle.title+':</label>',
  1330. '<div class="layui-input-block f-input-par">',
  1331. '<input type="text" name="addNodeName" class="layui-input f-input" value="" lay-verify="required"/>',
  1332. '</div>',
  1333. '</div>'].join('');
  1334. var addNodeBtn = ['<div class="layui-form-item">',
  1335. '<div class="layui-input-block" style="margin-left:0px;text-align:center;">',
  1336. '<button type="button" class="layui-btn layui-btn-normal btn-w100" lay-submit lay-filter="dtree_addNode_form">确认添加</button>',
  1337. '</div>',
  1338. '</div>'].join('');
  1339. //2. 用户自定义的节点内容
  1340. var addNodeBar = ['<div class="'+TOOLBAR_TOOL+'"><form class="layui-form layui-form-pane" lay-filter="dtree_addNode_form">', nowNode, addNodeName];
  1341. if(nodeBarContents != null && nodeBarContents.length > 0){
  1342. if(nodeBarContents[0] != null && nodeBarContents[0] != undefined && nodeBarContents[0].length > 0){
  1343. var addNodeBarContents = nodeBarContents[0];
  1344. for(var j=0; j<addNodeBarContents.length; j++){
  1345. var type = addNodeBarContents[j].type;
  1346. if(!type){type = "text";}
  1347. switch (type) {
  1348. case "text":
  1349. addNodeBar.push(_this.loadToolBarDetail().text(addNodeBarContents[j]));
  1350. break;
  1351. case "textarea":
  1352. addNodeBar.push(_this.loadToolBarDetail().textarea(addNodeBarContents[j]));
  1353. break;
  1354. case "select":
  1355. addNodeBar.push(_this.loadToolBarDetail().select(addNodeBarContents[j]));
  1356. break;
  1357. case "hidden":
  1358. addNodeBar.push(_this.loadToolBarDetail().hidden(addNodeBarContents[j]));
  1359. break;
  1360. }
  1361. }
  1362. }
  1363. }
  1364. addNodeBar.push(addNodeBtn);
  1365. addNodeBar.push('</form></div>');
  1366. html = addNodeBar.join('');
  1367. break;
  1368. case defaultTool.editToolbar:
  1369. //1. 必须加载的节点内容
  1370. var nowNode = ['<div class="layui-form-item">',
  1371. '<label class="layui-form-label">当前选中:</label>',
  1372. '<div class="layui-input-block f-input-par">',
  1373. '<input type="text" name="nodeTitle" class="layui-input f-input" value="'+title+'" readonly/>',
  1374. '</div>',
  1375. '</div>'].join('');
  1376. var editNodeName = ['<div class="layui-form-item">',
  1377. '<label class="layui-form-label">编辑'+_this.toolbarStyle.title+':</label>',
  1378. '<div class="layui-input-block f-input-par">',
  1379. '<input type="text" name="editNodeName" class="layui-input f-input" value="'+title+'" lay-verify="required"/>',
  1380. '</div>',
  1381. '</div>'].join('');
  1382. var editNodeBtn = ['<div class="layui-form-item">',
  1383. '<div class="layui-input-block" style="margin-left:0px;text-align:center;">',
  1384. '<button type="button" class="layui-btn layui-btn-normal btn-w100" lay-submit lay-filter="dtree_editNode_form">确认编辑</button>',
  1385. '</div>',
  1386. '</div>'].join('');
  1387. var editNodeBar = ['<div class="'+TOOLBAR_TOOL+'"><form class="layui-form layui-form-pane" lay-filter="dtree_editNode_form">', nowNode, editNodeName];
  1388. //2. 用户自定义的节点内容
  1389. if(nodeBarContents != null && nodeBarContents.length > 0){
  1390. if(nodeBarContents[1] != null && nodeBarContents[1] != undefined && nodeBarContents[1].length > 0){
  1391. var editNodeBarContents = nodeBarContents[1];
  1392. for(var j=0; j<editNodeBarContents.length; j++){
  1393. var type = editNodeBarContents[j].type;
  1394. if(!type){type = "text";}
  1395. switch (type) {
  1396. case "text":
  1397. editNodeBar.push(_this.loadToolBarDetail().text(editNodeBarContents[j]));
  1398. break;
  1399. case "textarea":
  1400. editNodeBar.push(_this.loadToolBarDetail().textarea(editNodeBarContents[j]));
  1401. break;
  1402. case "select":
  1403. editNodeBar.push(_this.loadToolBarDetail().select(editNodeBarContents[j]));
  1404. break;
  1405. case "hidden":
  1406. editNodeBar.push(_this.loadToolBarDetail().hidden(editNodeBarContents[j]));
  1407. break;
  1408. }
  1409. }
  1410. }
  1411. }
  1412. editNodeBar.push(editNodeBtn);
  1413. editNodeBar.push('</form></div>');
  1414. html = editNodeBar.join('');
  1415. break;
  1416. }
  1417. return html;
  1418. };
  1419. // 获取toolbar详细的标签信息
  1420. DTree.prototype.loadToolBarDetail = function(){
  1421. var _this = this;
  1422. return{
  1423. text: function(nodeBarContents){
  1424. return ['<div class="layui-form-item">',
  1425. '<label class="layui-form-label" title="'+nodeBarContents.label+'">'+nodeBarContents.label+':</label>',
  1426. '<div class="layui-input-block f-input-par">',
  1427. '<input type="text" name="'+nodeBarContents.name+'" class="layui-input f-input" value="'+(nodeBarContents.value ? nodeBarContents.value : "")+'"/>',
  1428. '</div>',
  1429. '</div>'].join('');
  1430. },
  1431. textarea: function(nodeBarContents){
  1432. return ['<div class="layui-form-item layui-form-text">',
  1433. '<label class="layui-form-label">'+nodeBarContents.label+':</label>',
  1434. '<div class="layui-input-block f-input-par">',
  1435. '<textarea name="'+nodeBarContents.name+'" class="layui-textarea f-input">'+(nodeBarContents.value ? nodeBarContents.value : "")+'</textarea>',
  1436. '</div>',
  1437. '</div>'].join('');
  1438. },
  1439. hidden: function(nodeBarContents){
  1440. return ['<input type="hidden" name="'+nodeBarContents.name+'" class="layui-input f-input" value="'+(nodeBarContents.value ? nodeBarContents.value : "")+'"/>'].join('');
  1441. },
  1442. select: function(nodeBarContents){
  1443. var optionsData = nodeBarContents.optionsData;
  1444. var options = "";
  1445. var defaultValue = nodeBarContents.value ? nodeBarContents.value : "";
  1446. for(var key in optionsData){
  1447. if(defaultValue == optionsData[key]){
  1448. options += "<option value='"+key+"' selected>"+optionsData[key]+"</option>";
  1449. } else {
  1450. options += "<option value='"+key+"'>"+optionsData[key]+"</option>";
  1451. }
  1452. }
  1453. return ['<div class="layui-form-item">',
  1454. '<label class="layui-form-label" title="'+nodeBarContents.label+'">'+nodeBarContents.label+':</label>',
  1455. '<div class="layui-input-block f-input-par">',
  1456. '<select name="'+nodeBarContents.name+'">',
  1457. options,
  1458. '</select>',
  1459. '</div>',
  1460. '</div>'].join('');
  1461. }
  1462. }
  1463. };
  1464. // 新增节点后改变节点内容
  1465. DTree.prototype.changeTreeNodeAdd = function(returnID){
  1466. var _this = this;
  1467. var temp = _this.temp;
  1468. var id = temp[0], $ul = temp[1], $div = temp[2], level = temp[3];
  1469. if(returnID){
  1470. var $thisDiv = _this.obj.find("[data-id='"+id+"']");
  1471. if(typeof returnID === "object"){
  1472. // 如果是JSON格式数据,则将当前DIV删除,重新建造DIV
  1473. $thisDiv.remove();
  1474. var parseData = _this.parseData(returnID);
  1475. if(parseData.treeId()){
  1476. $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"));
  1477. // 建造完毕后,选中该DIV
  1478. var $addDiv = $ul.find("div[data-id='"+returnID.id+"']");
  1479. _this.setNodeParam($addDiv)
  1480. } else {
  1481. layer.msg("添加失败,节点ID为undefined!",{icon:5});
  1482. // 将li节点删除
  1483. $ul.find("li[data-id='"+id+"']").remove();
  1484. // 重新赋值
  1485. _this.setNodeParam($div);
  1486. // 临时变量制空
  1487. _this.temp = [];
  1488. return ;
  1489. }
  1490. }else if(typeof returnID === "string" || typeof this.icon === 'number'){
  1491. $thisDiv.attr("data-id", returnID);
  1492. // 将li节点展示
  1493. $ul.find("li[data-id='"+returnID+"']").show();
  1494. var $addDiv = $ul.find("div[data-id='"+returnID+"']");
  1495. _this.setNodeParam($addDiv)
  1496. }
  1497. // 判断当前点击的节点是否是最后一级节点,如果是,则需要修改节点的样式
  1498. var $icon_i = $div.find("i[data-spread]");
  1499. if ($icon_i.eq(0).attr("data-spread") == "last") {
  1500. $icon_i.attr("data-spread","open");
  1501. $icon_i.eq(0).removeClass(LI_DIV_SPREAD_LAST);
  1502. $icon_i.eq(0).removeClass(ICON_HIDE);
  1503. $icon_i.eq(0).addClass(_this.ficonOpen);
  1504. $icon_i.eq(1).removeClass(leafIconArray[_this.leafIcon]);
  1505. $icon_i.eq(1).addClass(_this.nodeIconOpen);
  1506. } else { //如果不是,也要修改节点样式
  1507. $icon_i.attr("data-spread","open");
  1508. $icon_i.eq(0).removeClass(_this.ficonClose);
  1509. $icon_i.eq(0).addClass(_this.ficonOpen);
  1510. $icon_i.eq(1).removeClass(_this.nodeIconClose);
  1511. $icon_i.eq(1).addClass(_this.nodeIconOpen);
  1512. // _this.clickSpread($div);
  1513. }
  1514. $ul.addClass(NAV_SHOW); //展开UL
  1515. } else {
  1516. // 将li节点删除
  1517. $ul.find("li[data-id='"+id+"']").remove();
  1518. // 重新赋值
  1519. _this.setNodeParam($div);
  1520. }
  1521. _this.temp = []; // 临时变量制空
  1522. };
  1523. // 修改节点后改变节点内容
  1524. DTree.prototype.changeTreeNodeEdit = function(flag){
  1525. var _this = this;
  1526. var temp = _this.temp;
  1527. var $cite = temp[0],
  1528. $div = temp[1];
  1529. if(!flag){
  1530. $cite.html(title);
  1531. node = _this.getNodeParam($div);
  1532. }
  1533. _this.temp = []; // 临时变量制空
  1534. };
  1535. // 编辑页打开后显示编辑页内容
  1536. DTree.prototype.changeTreeNodeDone = function(param){
  1537. var _this = this;
  1538. form.val('dtree_editNode_form', param);
  1539. form.render();
  1540. };
  1541. // 删除节点后改变节点内容
  1542. DTree.prototype.changeTreeNodeDel = function(flag){
  1543. var _this = this;
  1544. var temp = _this.temp;
  1545. var $p_li = temp[0],
  1546. $p_ul = $p_li.parent("ul"),
  1547. $p_div = temp[1];
  1548. if(flag){
  1549. $p_li.remove();
  1550. // 判断父级ul中是否还存在li,如果不存在,则需要修改节点的样式
  1551. if($p_ul.children("li").length == 0){
  1552. var $icon_i = $p_div.find("i[data-spread]");
  1553. $icon_i.attr("data-spread","last");
  1554. $icon_i.eq(0).removeClass(_this.ficonOpen);
  1555. $icon_i.eq(0).removeClass(_this.ficonClose);
  1556. if(!_this.dot){$icon_i.eq(0).addClass(ICON_HIDE);}
  1557. $icon_i.eq(0).addClass(LI_DIV_SPREAD_LAST);
  1558. $icon_i.eq(1).removeClass(_this.nodeIconOpen);
  1559. $icon_i.eq(1).removeClass(_this.nodeIconClose);
  1560. $icon_i.eq(1).addClass(leafIconArray[_this.leafIcon]);
  1561. }
  1562. _this.initNodeParam();
  1563. }
  1564. _this.temp = []; // 临时变量制空
  1565. };
  1566. /******************** 复选框区域 ********************/
  1567. // 初始化复选框的值
  1568. DTree.prototype.chooseDataInit = function(chooseIds){
  1569. var _this = this;
  1570. var chooseId = chooseIds.split(",");
  1571. for (var i=0; i<chooseId.length; i++) {
  1572. _this.obj.find("i[dtree-click='"+eventName.checkNodeClick+"']").each(function(){
  1573. if ($(this).attr("data-id") == chooseId[i]) {
  1574. _this.checkStatus($(this)).check();
  1575. }
  1576. });
  1577. }
  1578. // 展开选中节点的父节点
  1579. var $li_parents = _this.obj.find("i[dtree-click='"+eventName.checkNodeClick+"'][data-checked='1']").parents("."+LI_NAV_ITEM);
  1580. $li_parents.children("ul").addClass(NAV_SHOW);
  1581. $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+_this.ficonClose).addClass(_this.ficonOpen);
  1582. $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+_this.ficonClose).removeClass(_this.ficonClose);
  1583. $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+_this.nodeIconClose).addClass(_this.nodeIconOpen);
  1584. $li_parents.children("."+LI_DIV_ITEM).children("i[data-spread]."+_this.nodeIconClose).removeClass(_this.nodeIconClose);
  1585. return _this.getCheckbarNodesParam();
  1586. };
  1587. //实现复选框点击,子集选中父级也选中
  1588. DTree.prototype.checkAllOrNot = function($i) {
  1589. var _this = this;
  1590. //$i 当前点击的checkbox
  1591. var dataPar = $i.attr("data-par"),
  1592. dataType = $i.attr("data-type"),
  1593. $li = $i.closest(dataPar), //当前checkbox的上级li节点
  1594. $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
  1595. $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
  1596. if ($i.attr("data-checked") == "1") {
  1597. // 处理当前节点的选中状态
  1598. _this.checkStatus($i).noCheck();
  1599. // 处理子级节点的选中状态
  1600. var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1601. _this.checkStatus($child_li_i).noCheck();
  1602. // 处理父级节点的选中状态
  1603. for (var i = 1, item = $parent_li; i < item.length; i++) {
  1604. var flag = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
  1605. if (flag == 0) {
  1606. //把父级去掉选中
  1607. var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1608. _this.checkStatus($item_i).noCheck();
  1609. }
  1610. }
  1611. } else {
  1612. // 处理当前节点的选中状态
  1613. _this.checkStatus($i).check();
  1614. // 处理子级节点的选中状态
  1615. var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1616. _this.checkStatus($child_li_i).check();
  1617. // 处理父级节点的选中状态
  1618. for (var i = 1, item = $parent_li; i < item.length; i++) {
  1619. var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1620. //把父级选中
  1621. _this.checkStatus($item_i).check();
  1622. }
  1623. }
  1624. };
  1625. //实现复选框点击, no-all 子集选中父级半选中,子集全选父级选中
  1626. DTree.prototype.checkAllOrNoallOrNot = function($i) {
  1627. var _this = this;
  1628. //$i 当前点击的checkbox
  1629. var $div = $i.closest("."+LI_DIV_ITEM),
  1630. dataPar = $i.attr("data-par"),
  1631. dataType = $i.attr("data-type"),
  1632. $li = $i.closest(dataPar), //当前checkbox的上级li节点
  1633. $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
  1634. $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
  1635. if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态
  1636. // 处理当前节点的选中状态
  1637. _this.checkStatus($i).noCheck();
  1638. // 处理子级节点的选中状态
  1639. var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1640. _this.checkStatus($child_li_i).noCheck();
  1641. // 处理父级节点的选中状态
  1642. for (var i = 1, item = $parent_li; i < item.length; i++) {
  1643. var flag = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
  1644. var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1645. if (flag == 0) {
  1646. //把父级去掉选中
  1647. _this.checkStatus($item_i).noCheck();
  1648. } else {
  1649. //把父级半选
  1650. _this.checkStatus($item_i).noallCheck();
  1651. }
  1652. }
  1653. } else { //当前复选框为未选中状态,点击后变为选中状态
  1654. // 处理当前节点的选中状态
  1655. _this.checkStatus($i).check();
  1656. // 处理子级节点的选中状态
  1657. var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1658. _this.checkStatus($child_li_i).check();
  1659. // 处理父级节点的选中状态
  1660. for (var i = 1, item = $parent_li; i < item.length; i++) {
  1661. var flag1 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
  1662. var flag2 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']").length;
  1663. var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1664. if (flag1 != flag2) {
  1665. // 父级复选框半选
  1666. _this.checkStatus($item_i).noallCheck();
  1667. } else {
  1668. // 父级复选框全选
  1669. _this.checkStatus($item_i).check();
  1670. }
  1671. }
  1672. }
  1673. };
  1674. //实现复选框点击,p-casc:父级选中子集全选,子集无法改变父级选中状态
  1675. DTree.prototype.checkAllOrPcascOrNot = function($i) {
  1676. var _this = this;
  1677. //$i 当前点击的checkbox
  1678. var $div = $i.closest("."+LI_DIV_ITEM),
  1679. dataPar = $i.attr("data-par"),
  1680. dataType = $i.attr("data-type"),
  1681. $li = $i.closest(dataPar), //当前checkbox的上级li节点
  1682. $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
  1683. $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
  1684. if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态
  1685. // 处理当前节点的选中状态
  1686. _this.checkStatus($i).noCheck();
  1687. // 处理子级节点的选中状态
  1688. var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1689. _this.checkStatus($child_li_i).noCheck();
  1690. } else { //当前复选框为未选中状态,点击后变为选中状态
  1691. // 处理当前节点的选中状态
  1692. _this.checkStatus($i).check();
  1693. // 处理子级节点的选中状态
  1694. var $child_li_i = $child_li.find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1695. _this.checkStatus($child_li_i).check();
  1696. }
  1697. };
  1698. //实现复选框点击,self:各自选中互不影响
  1699. DTree.prototype.checkOrNot = function($i) {
  1700. var _this = this;
  1701. //$i 当前点击的checkbox
  1702. var $div = $i.closest("."+LI_DIV_ITEM),
  1703. dataPar = $i.attr("data-par"),
  1704. dataType = $i.attr("data-type"),
  1705. $li = $i.closest(dataPar), //当前checkbox的上级li节点
  1706. $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
  1707. $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
  1708. if ($i.attr("data-checked") == "1") { //当前复选框为选中状态,点击后变为未选中状态
  1709. // 处理当前节点的选中状态
  1710. _this.checkStatus($i).noCheck();
  1711. } else { //当前复选框为未选中状态,点击后变为选中状态
  1712. // 处理当前节点的选中状态
  1713. _this.checkStatus($i).check();
  1714. }
  1715. };
  1716. //实现复选框点击,only:只能选中1个复选框
  1717. DTree.prototype.checkOnly = function($i) {
  1718. var _this = this;
  1719. //$i 当前点击的checkbox
  1720. var $div = $i.closest("."+LI_DIV_ITEM),
  1721. dataPar = $i.attr("data-par"),
  1722. dataType = $i.attr("data-type"),
  1723. $li = $i.closest(dataPar), //当前checkbox的上级li节点
  1724. $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
  1725. $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
  1726. var checked = $i.attr("data-checked");
  1727. // 将全部节点全部设为未选中状态
  1728. var $all_i = _this.obj.find("i[data-checked]");
  1729. _this.checkStatus($all_i).noCheck();
  1730. if (checked != "1") { //当前复选框为未选中状态,点击后变为选中状态
  1731. // 处理当前节点的选中状态
  1732. _this.checkStatus($i).check();
  1733. }
  1734. };
  1735. //实现复选框点击
  1736. DTree.prototype.changeCheck = function() {
  1737. var _this = this;
  1738. var temp = _this.temp;
  1739. var $i = temp[0];
  1740. // 复选框选中事件
  1741. if (_this.checkbarType == "all") {
  1742. _this.checkAllOrNot($i);
  1743. } else if(_this.checkbarType == "no-all") {
  1744. _this.checkAllOrNoallOrNot($i);
  1745. } else if(_this.checkbarType == "p-casc") {
  1746. _this.checkAllOrPcascOrNot($i);
  1747. } else if(_this.checkbarType == "self") {
  1748. _this.checkOrNot($i);
  1749. } else if(_this.checkbarType == "only") {
  1750. _this.checkOnly($i);
  1751. } else {
  1752. _this.checkAllOrNot($i);
  1753. }
  1754. // 获取复选框选中节点的内容
  1755. var checkbarNodes = _this.setAndGetCheckbarNodesParam();
  1756. // 用户自定义想做的事情
  1757. _this.checkbarFun.chooseDone(checkbarNodes);
  1758. layui.event.call(this, MOD_NAME, "chooseDone("+$(_this.obj)[0].id+")", {"checkbarParams": checkbarNodes});
  1759. _this.temp = [];
  1760. };
  1761. //复选框半选状态初始化设置
  1762. DTree.prototype.initNoAllCheck = function(){
  1763. var _this = this;
  1764. //1.获取所有选中节点
  1765. var $is = _this.obj.find("i[data-checked='1']");
  1766. if($is.length > 0){
  1767. for ( var key = 0; key < $is.length; key++) {
  1768. var $i = $($is[key]),
  1769. dataPar = $i.attr("data-par"),
  1770. dataType = $i.attr("data-type"),
  1771. $li = $i.closest(dataPar), //当前checkbox的上级li节点
  1772. $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
  1773. $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
  1774. // 处理父级节点的选中状态
  1775. for (var i = 1, item = $parent_li; i < item.length; i++) {
  1776. var flag1 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"'][data-checked='1']").length;
  1777. var flag2 = item.eq(i).find(">."+LI_NAV_CHILD+" ."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']").length;
  1778. var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1779. if (flag1 != flag2) {
  1780. // 父级复选框半选
  1781. _this.checkStatus($item_i).noallCheck();
  1782. } else {
  1783. // 父级复选框全选
  1784. _this.checkStatus($item_i).check();
  1785. }
  1786. }
  1787. }
  1788. }
  1789. };
  1790. //复选框选中状态初始化设置
  1791. DTree.prototype.initAllCheck = function(){
  1792. var _this = this;
  1793. //1.获取所有选中节点
  1794. var $is = _this.obj.find("i[data-checked='1']");
  1795. if($is.length > 0){
  1796. for ( var key = 0; key < $is.length; key++) {
  1797. var $i = $($is[key]),
  1798. dataPar = $i.attr("data-par"),
  1799. dataType = $i.attr("data-type"),
  1800. $li = $i.closest(dataPar), //当前checkbox的上级li节点
  1801. $parent_li = $i.parents(dataPar), //当前checkbox的所有父级li节点
  1802. $child_li = $li.find(dataPar); //当前checkbox的上级li节点下的所有子级li节点
  1803. // 处理父级节点的选中状态
  1804. for (var i = 1, item = $parent_li; i < item.length; i++) {
  1805. var $item_i = item.eq(i).find(">."+LI_DIV_ITEM+">."+LI_DIV_CHECKBAR+">i[data-type='"+dataType+"']");
  1806. // 父级复选框全选
  1807. _this.checkStatus($item_i).check();
  1808. }
  1809. }
  1810. }
  1811. };
  1812. // 设置复选框选中/未选中/半选 _this.checkStatus($i).check(); _this.checkStatus($i).noCheck(); _this.checkStatus($i).noallCheck();
  1813. DTree.prototype.checkStatus = function($i) {
  1814. var _this = this;
  1815. return {
  1816. check: function(){
  1817. $i.removeClass(LI_DIV_CHECKBAR_OUT);
  1818. $i.removeClass(LI_DIV_CHECKBAR_NOALL);
  1819. $i.addClass(LI_DIV_CHECKBAR_ON);
  1820. $i.addClass(_this.style.chs);
  1821. $i.attr("data-checked","1");
  1822. },
  1823. noCheck: function(){
  1824. $i.removeClass(LI_DIV_CHECKBAR_NOALL);
  1825. $i.removeClass(LI_DIV_CHECKBAR_ON);
  1826. $i.removeClass(_this.style.chs);
  1827. $i.addClass(LI_DIV_CHECKBAR_OUT);
  1828. $i.attr("data-checked","0");
  1829. },
  1830. noallCheck: function(){
  1831. $i.removeClass(LI_DIV_CHECKBAR_OUT);
  1832. $i.removeClass(LI_DIV_CHECKBAR_ON);
  1833. $i.addClass(LI_DIV_CHECKBAR_NOALL);
  1834. $i.addClass(_this.style.chs);
  1835. $i.attr("data-checked","2");
  1836. }
  1837. }
  1838. };
  1839. // 设置树的复选框操作值的全部参数,并获取
  1840. DTree.prototype.setAndGetCheckbarNodesParam = function() {
  1841. var _this = this;
  1842. //操作前先清空
  1843. _this.checkbarNode = [];
  1844. // 选择所有复选框节点
  1845. if (_this.checkbarData == "change"){ //记录变更数据
  1846. _this.obj.find("i[data-par]").each(function(){
  1847. var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
  1848. if ($i.attr("data-checked") != $i.attr("data-initchecked")) {
  1849. _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
  1850. }
  1851. });
  1852. } else if (_this.checkbarData == "all"){ //记录全部数据
  1853. _this.obj.find("i[data-par][data-checked]").each(function(){
  1854. var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
  1855. _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
  1856. });
  1857. } else { //记录选中数据
  1858. _this.obj.find("i[data-par][data-checked='1']").each(function(){
  1859. var $i = $(this), $div = $i.closest("."+LI_DIV_ITEM);
  1860. _this.checkbarNode.push(_this.getRequestParam(_this.getCheckbarNodeParam($div, $i)));
  1861. });
  1862. }
  1863. return _this.checkbarNode;
  1864. };
  1865. // 获取树的复选框操作值的全部参数
  1866. DTree.prototype.getCheckbarNodesParam = function() {
  1867. var _this = this;
  1868. return _this.setAndGetCheckbarNodesParam();
  1869. };
  1870. // 获取树的一个复选框的参数
  1871. DTree.prototype.getCheckbarNodeParam = function($div, $i){
  1872. var _this = this;
  1873. var temp_node = {};
  1874. temp_node.nodeId = $div.attr("data-id");
  1875. temp_node.parentId = $div.parent().attr("data-pid");
  1876. temp_node.context = $div.find("cite[data-leaf]").eq(0).text();
  1877. temp_node.isLeaf = $div.find("cite[data-leaf]").eq(0).attr("data-leaf") == "leaf" ? true : false;
  1878. temp_node.level = $div.parent().attr("data-index");
  1879. temp_node.spread = $div.find("i[data-spread]").eq(0).attr("data-spread") == "open" ? true : false;
  1880. temp_node.basicData = $div.attr("data-basic");
  1881. temp_node.recordData = $div.attr("data-record");
  1882. temp_node.dataType = $i.attr("data-type");
  1883. temp_node.ischecked = $i.attr("data-checked");
  1884. temp_node.initchecked = $i.attr("data-initchecked");
  1885. return temp_node;
  1886. };
  1887. //判断复选框是否发生变更
  1888. DTree.prototype.changeCheckbarNodes = function(){
  1889. var flag = false;
  1890. var _this = this;
  1891. _this.obj.find("i[data-par]").each(function(){
  1892. var $i = $(this);
  1893. $div = $i.closest("."+LI_DIV_ITEM);
  1894. if ($i.attr("data-checked") != $i.attr("data-initchecked")) {
  1895. flag = true;
  1896. return true;
  1897. }
  1898. });
  1899. return flag;
  1900. };
  1901. /******************** iframe区域 ********************/
  1902. // 加载iframe
  1903. DTree.prototype.loadIframe = function($div, iframeParam) {
  1904. var _this = this;
  1905. var $cite = $div.find("cite[data-leaf]").eq(0);
  1906. if (!_this.useIframe) { // 启用iframe
  1907. return false;
  1908. }
  1909. var iframeElem = _this.iframe.iframeElem,
  1910. iframeUrl = _this.iframe.iframeUrl,
  1911. iframeLoad = _this.iframe.iframeLoad;
  1912. var flag = iframeLoad == "leaf" ? (($cite.attr("data-leaf") == "leaf") ? true : false) : true;
  1913. if (flag) {
  1914. if ($(iframeElem).length > 0) { //iframe存在
  1915. if (!iframeUrl) {
  1916. layer.msg("数据请求异常,iframeUrl参数未指定", {icon:5});
  1917. return false;
  1918. }
  1919. var param = AjaxHelper.serialize(iframeParam);
  1920. if(iframeUrl.indexOf("?")> -1){
  1921. param = "&"+param.substring(1, param.length);
  1922. }
  1923. var url = iframeUrl + param;
  1924. $(iframeElem).attr("src", url);
  1925. } else {
  1926. layer.msg("iframe绑定异常,请确认页面中是否有iframe页对应的容器", {icon:5});
  1927. return false;
  1928. }
  1929. }
  1930. return flag;
  1931. };
  1932. // 获取传递出去的参数,根据iframe.iframeDefaultRequest、iframe.iframeRequest和node拼出发出请求的参数
  1933. DTree.prototype.getIframeRequestParam = function(nodes){
  1934. var _this = this;
  1935. var request = _this.iframe.iframeRequest,
  1936. defaultRequestNames = _this.iframe.iframeDefaultRequest,
  1937. node = nodes || _this.node,
  1938. requestParam = {};
  1939. // 先拼用户自定义的,在拼树生成的,这样的话用户可以自定义当树未生成时的节点的初始值
  1940. for ( var key in request) {
  1941. requestParam[key] = request[key];
  1942. }
  1943. for ( var key in defaultRequestNames) {
  1944. var paramName = defaultRequestNames[key];
  1945. var paramValue = node[key];
  1946. if(typeof paramValue === "boolean"){
  1947. requestParam[paramName] = paramValue;
  1948. }else {
  1949. if(paramValue){
  1950. requestParam[paramName] = paramValue;
  1951. }
  1952. }
  1953. }
  1954. // 解决传递中文的乱码问题
  1955. var reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/; //正则匹配中文
  1956. for(var key in requestParam){
  1957. if(reg.test(requestParam[key])) {
  1958. var str = requestParam[key];
  1959. requestParam[key] = encodeURI(encodeURI(str));
  1960. }
  1961. }
  1962. return requestParam;
  1963. };
  1964. /******************** 数据回调区域 ********************/
  1965. // 获取当前选中节点下一个UL 或根节点。为了将新节点放入ul下
  1966. DTree.prototype.getNowNodeUl = function() {
  1967. var _this = this;
  1968. 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");
  1969. };
  1970. // 获取当前选中节点 或根节点。
  1971. DTree.prototype.getNowNode = function() {
  1972. var _this = this;
  1973. 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);
  1974. };
  1975. // 设置当前选中节点的全部参数
  1976. DTree.prototype.setNodeParam = function($div) {
  1977. var _this = this;
  1978. _this.node.nodeId = $div.attr("data-id");
  1979. _this.node.parentId = $div.parent().attr("data-pid");
  1980. _this.node.context = $div.find("cite[data-leaf]").eq(0).text();
  1981. _this.node.isLeaf = $div.find("cite[data-leaf]").eq(0).attr("data-leaf") == "leaf" ? true : false;
  1982. _this.node.level = $div.parent().attr("data-index");
  1983. _this.node.spread = $div.find("i[data-spread]").eq(0).attr("data-spread") == "open" ? true : false;
  1984. _this.node.basicData = $div.attr("data-basic");
  1985. _this.node.recordData = $div.attr("data-record");
  1986. if ($div.find("i[data-par]")) {
  1987. var dataTypes = "", ischeckeds = "", initcheckeds = "";
  1988. $div.find("i[data-par]").each(function(){
  1989. dataTypes += $(this).attr("data-type") + ",";
  1990. ischeckeds += $(this).attr("data-checked") + ",";
  1991. initcheckeds += $(this).attr("data-initchecked") + ",";
  1992. });
  1993. dataTypes = dataTypes.substring(0, dataTypes.length-1);
  1994. ischeckeds = ischeckeds.substring(0, ischeckeds.length-1);
  1995. initcheckeds = initcheckeds.substring(0, initcheckeds.length-1);
  1996. _this.node.dataType = dataTypes;
  1997. _this.node.ischecked = ischeckeds;
  1998. _this.node.initchecked = initcheckeds;
  1999. }
  2000. };
  2001. // 获取当前选中节点的全部参数
  2002. DTree.prototype.getNodeParam = function($div) {
  2003. var _this = this;
  2004. if ($div) {
  2005. _this.setNodeParam($div);
  2006. } else {
  2007. if(_this.obj.find("div[data-id]").parent().find("."+NAV_THIS).length == 0){
  2008. _this.initNodeParam();
  2009. }
  2010. }
  2011. return this.node;
  2012. };
  2013. // 获取一个临时的node参数
  2014. DTree.prototype.getTempNodeParam = function($div) {
  2015. var _this = this;
  2016. var temp_node = {};
  2017. temp_node.nodeId = $div.attr("data-id");
  2018. temp_node.parentId = $div.parent().attr("data-pid");
  2019. temp_node.context = $div.find("cite[data-leaf]").eq(0).text();
  2020. temp_node.isLeaf = $div.find("cite[data-leaf]").eq(0).attr("data-leaf") == "leaf" ? true : false;
  2021. temp_node.level = $div.parent().attr("data-index");
  2022. temp_node.spread = $div.find("i[data-spread]").eq(0).attr("data-spread") == "open" ? true : false;
  2023. temp_node.basicData = $div.attr("data-basic");
  2024. temp_node.recordData = $div.attr("data-record");
  2025. if ($div.find("i[data-par]")) {
  2026. var dataTypes = "", ischeckeds = "", initcheckeds = "";
  2027. $div.find("i[data-par]").each(function(){
  2028. dataTypes += $(this).attr("data-type") + ",";
  2029. ischeckeds += $(this).attr("data-checked") + ",";
  2030. initcheckeds += $(this).attr("data-initchecked") + ",";
  2031. });
  2032. dataTypes = dataTypes.substring(0, dataTypes.length-1);
  2033. ischeckeds = ischeckeds.substring(0, ischeckeds.length-1);
  2034. initcheckeds = initcheckeds.substring(0, initcheckeds.length-1);
  2035. temp_node.dataType = dataTypes;
  2036. temp_node.ischecked = ischeckeds;
  2037. temp_node.initchecked = initcheckeds;
  2038. }
  2039. return temp_node;
  2040. };
  2041. // 重置参数
  2042. DTree.prototype.initNodeParam = function(){
  2043. var _this = this;
  2044. _this.node.nodeId = "";
  2045. _this.node.parentId = "";
  2046. _this.node.context = "";
  2047. _this.node.isLeaf = "";
  2048. _this.node.level = "";
  2049. _this.node.spread = "";
  2050. _this.node.dataType = "";
  2051. _this.node.ischecked = "";
  2052. _this.node.initchecked = "";
  2053. _this.node.basicData = "";
  2054. };
  2055. // 获取传递出去的参数,根据defaultRequest、request和node拼出发出请求的参数
  2056. DTree.prototype.getRequestParam = function(nodes){
  2057. var _this = this;
  2058. var request = _this.request,
  2059. defaultRequestNames = _this.defaultRequest,
  2060. node = nodes || _this.node,
  2061. requestParam = {};
  2062. // 先拼用户自定义的,在拼树生成的,这样的话用户可以自定义当树未生成时的节点的初始值
  2063. for ( var key in request) {
  2064. requestParam[key] = request[key];
  2065. }
  2066. for ( var key in defaultRequestNames) {
  2067. var paramName = defaultRequestNames[key];
  2068. var paramValue = node[key];
  2069. if(typeof paramValue === "boolean"){
  2070. requestParam[paramName] = paramValue;
  2071. }else {
  2072. if(paramValue){
  2073. requestParam[paramName] = paramValue;
  2074. }
  2075. }
  2076. }
  2077. return requestParam;
  2078. };
  2079. // 获取filterParam过滤后的requestParam
  2080. DTree.prototype.getFilterRequestParam = function(requestParam){
  2081. var _this = this;
  2082. var filterRequest = _this.filterRequest;
  2083. return event.cloneObj(requestParam, filterRequest);
  2084. };
  2085. // 获取当前选中值
  2086. DTree.prototype.getNowParam = function(){
  2087. var _this = this;
  2088. return _this.getRequestParam(_this.getNodeParam());
  2089. };
  2090. // 获取参数的上级节点
  2091. DTree.prototype.getParentParam = function(id){
  2092. var _this = this;
  2093. var $div = _this.obj.find("div[data-id='"+id+"']");
  2094. if($div.length > 0){ return _this.callbackData().parentNode($div); } else { return {}; }
  2095. };
  2096. // 获取参数的下级节点
  2097. DTree.prototype.getChildParam = function(id){
  2098. var _this = this;
  2099. var $div = _this.obj.find("div[data-id='"+id+"']");
  2100. if($div.length > 0){ return _this.callbackData().childNode($div); } else { return []; }
  2101. };
  2102. // 获取回调数据
  2103. DTree.prototype.callbackData = function(){
  2104. var _this = this;
  2105. return {
  2106. dom: function($dom){ // 获取dom
  2107. return $dom;
  2108. },
  2109. node: function(node){ // 获取当前节点值
  2110. return _this.getRequestParam(node);
  2111. },
  2112. childNode: function($div){ // 获取下级节点值
  2113. var $childDivs = $div.next("ul").find("li."+LI_NAV_ITEM+" div."+LI_DIV_ITEM);
  2114. var childNode = [];
  2115. if($childDivs && $childDivs.length > 0){
  2116. $childDivs.each(function(){
  2117. var $cDiv = $(this);
  2118. childNode.push(_this.getRequestParam(_this.getTempNodeParam($cDiv)));
  2119. });
  2120. }
  2121. return childNode;
  2122. },
  2123. parentNode: function($div){ // 获取上级节点值
  2124. var pId = $div.parent().attr("data-pid");
  2125. var $pdiv = _this.obj.find("div[data-id='"+pId+"']");
  2126. if($pdiv.length > 0) {return _this.getRequestParam(_this.getTempNodeParam($pdiv));} else {return {};}
  2127. }
  2128. }
  2129. };
  2130. /******************** 事件回调区域 ********************/
  2131. // 绑定浏览器事件
  2132. DTree.prototype.bindBrowserEvent = function(){
  2133. var _this = this;
  2134. // 绑定文件夹展开/收缩的图标的点击事件,点击时给当前节点的div添加选中class
  2135. _this.obj.on("click", "i[data-spread]", function(event) {
  2136. event.stopPropagation();
  2137. var $i = $(this),
  2138. $div = $i.parent("div"),
  2139. $cite = $div.find("cite"),
  2140. node = _this.getNodeParam($div),
  2141. $ul = $div.next("ul"),
  2142. $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点
  2143. $p_ul = $p_li.parent("ul");
  2144. var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
  2145. $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
  2146. _this.obj.find("div[data-id]").parent().find("."+NAV_THIS).removeClass(NAV_THIS);
  2147. _this.obj.find("div[data-id]").parent().find("."+_this.style.itemThis).removeClass(_this.style.itemThis);
  2148. $div.addClass(NAV_THIS);
  2149. $div.addClass(_this.style.itemThis);
  2150. _this.clickSpread($div); // 展开或隐藏节点
  2151. // 树状态改变后,用户自定义想做的事情
  2152. 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});
  2153. });
  2154. // 绑定所有子节点div的单击事件,点击时触发加载iframe或用户自定义想做的事情
  2155. _this.obj.on("click", "div[dtree-click='"+eventName.itemNodeClick+"']", function(event) {
  2156. event.stopPropagation();
  2157. var $div = $(this),
  2158. $cite = $div.find("cite"),
  2159. node = _this.getNodeParam($div),
  2160. $ul = $div.next("ul"),
  2161. $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点
  2162. $p_ul = $p_li.parent("ul");
  2163. var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
  2164. $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
  2165. _this.obj.find("div[data-id]").parent().find("."+NAV_THIS).removeClass(NAV_THIS);
  2166. _this.obj.find("div[data-id]").parent().find("."+_this.style.itemThis).removeClass(_this.style.itemThis);
  2167. $div.addClass(NAV_THIS);
  2168. $div.addClass(_this.style.itemThis);
  2169. if (_this.useIframe) {
  2170. var iframeParam = _this.getFilterRequestParam(_this.getIframeRequestParam(node));
  2171. var flag = _this.loadIframe($div, iframeParam); // 加载iframe
  2172. if (flag) {
  2173. // iframe加载完毕后,用户自定义想做的事情
  2174. _this.iframeFun.iframeDone(iframeParam);
  2175. layui.event.call(this, MOD_NAME, "iframeDone("+$(_this.obj)[0].id+")", {"iframeParam": iframeParam, dom: _this.callbackData().dom($div)});
  2176. }
  2177. } else {
  2178. // 单击事件执行完毕后,用户自定义想做的事情
  2179. 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)});
  2180. }
  2181. });
  2182. // 绑定所有子节点div的双击事件,暴露on给用户自定义
  2183. _this.obj.on("dblclick", "div[dtree-click='"+eventName.itemNodeClick+"']", function(event) {
  2184. event.stopPropagation();
  2185. var $div = $(this),
  2186. $cite = $div.find("cite"),
  2187. node = _this.getNodeParam($div),
  2188. $ul = $div.next("ul"),
  2189. $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点
  2190. $p_ul = $p_li.parent("ul");
  2191. var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
  2192. $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
  2193. _this.obj.find("div[data-id]").parent().find("."+NAV_THIS).removeClass(NAV_THIS);
  2194. _this.obj.find("div[data-id]").parent().find("."+_this.style.itemThis).removeClass(_this.style.itemThis);
  2195. $div.addClass(NAV_THIS);
  2196. $div.addClass(_this.style.itemThis);
  2197. // 双击事件执行完毕后,用户自定义想做的事情
  2198. 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)});
  2199. });
  2200. //绑定所有子节点div的右键点击事件,用于显示toolbar
  2201. _this.obj.on("contextmenu", "div[dtree-click='"+eventName.itemNodeClick+"'][d-contextmenu]", function(e){
  2202. var $div = $(this),
  2203. node = _this.getNodeParam($div),
  2204. contextmenu = $div.attr("d-contextmenu");
  2205. if(_this.toolbar){
  2206. var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
  2207. $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
  2208. // toolbar加载前执行的方法,执行完毕之后创建按钮
  2209. _this.setToolbarDom(_this.toolbarFun.loadToolbarBefore(event.cloneObj(_this.toolbarMenu), _this.getRequestParam(node), $div));
  2210. var e = e || window.event,
  2211. mx = e.pageX - $div.offset().left +45 ,
  2212. my = $div.offset().top - _this.obj.closest(_this.toolbarScroll).offset().top +15;
  2213. if(contextmenu == "true"){
  2214. _this.obj.find("div[data-id]").parent().find("."+NAV_THIS).removeClass(NAV_THIS);
  2215. _this.obj.find("div[data-id]").parent().find("."+_this.style.itemThis).removeClass(_this.style.itemThis);
  2216. $div.addClass(NAV_THIS);
  2217. $div.addClass(_this.style.itemThis);
  2218. $toolBarDiv.find(".layui-nav-child").addClass('layui-anim-fadein layui-show');
  2219. $toolBarDiv.css({'left':mx+'px','top':my+'px'});
  2220. }
  2221. }
  2222. e.stopPropagation();
  2223. return false;
  2224. });
  2225. // 绑定装载树的上层出现滚动条的容器,让toolbar隐藏
  2226. _this.obj.closest(_this.toolbarScroll).scroll(function() {
  2227. var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
  2228. $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
  2229. });
  2230. // 绑定toolbar的点击事件
  2231. _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).on("click", "a[dtree-tool]", function(event) {
  2232. event.stopPropagation();
  2233. var $div = _this.getNowNode(),
  2234. node = _this.getNodeParam($div),
  2235. $ul = $div.next("ul"),
  2236. $p_li = $div.parent("li[data-index]"), //当前选中节点的顶级li节点
  2237. $p_ul = $p_li.parent("ul"), //当前选中节点的顶级li节点的父级ul
  2238. $p_div = $p_ul.prev("div"), //当前选中节点的顶级li节点的父级ul的前一个div
  2239. $cite = $div.children("cite"), //当前选中节点的text
  2240. title = $cite.html();
  2241. var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
  2242. $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
  2243. var tool = $(this).attr("dtree-tool");
  2244. switch (tool) {
  2245. case defaultTool.addToolbar:
  2246. var content = _this.loadToolBar(title, defaultTool.addToolbar);
  2247. layer.open({
  2248. title: "新增"+_this.toolbarStyle.title,
  2249. type: 1,
  2250. area: _this.toolbarStyle.area,
  2251. content: content,
  2252. success: function(layero, index){
  2253. form.render();
  2254. form.on("submit(dtree_addNode_form)",function(data){
  2255. var data = data.field;
  2256. var parentId = $div.attr("data-id"),
  2257. id = $div.attr("data-id")+"_node_"+$ul[0].childNodes.length,
  2258. isLeaf = true,
  2259. isChecked = "0",
  2260. level = parseInt($p_li.attr("data-index"))+1;
  2261. // 创建子节点的DOM,添加子节点
  2262. var checkArr = [];
  2263. if (_this.checkArrLen > 0) {
  2264. for (var i = 0; i < _this.checkArrLen; i++) {
  2265. checkArr.push({"type":i,"isChecked":"0"});
  2266. }
  2267. }
  2268. $ul.append(_this.getLiItemDom(id, parentId, data.addNodeName, true, "", checkArr, level, false, false, "", "", "item"));
  2269. // 先将li节点隐藏
  2270. $ul.find("li[data-id='"+id+"']").hide();
  2271. // 重新赋值
  2272. var $addDiv = $ul.find("div[data-id='"+id+"']");
  2273. node = _this.getNodeParam($addDiv);
  2274. //获取组装后的requestNode,组合参数
  2275. var requestNode = _this.getRequestParam(node);
  2276. requestNode = $.extend(requestNode, data);
  2277. _this.temp = [id, $ul, $div, level];
  2278. // 用户自定义想做的事情
  2279. _this.toolbarFun.addTreeNode(requestNode, $div);
  2280. layer.close(index);
  2281. return false;
  2282. });
  2283. }
  2284. });
  2285. break;
  2286. case defaultTool.editToolbar:
  2287. var content = _this.loadToolBar(title, defaultTool.editToolbar);
  2288. layer.open({
  2289. title: "编辑"+_this.toolbarStyle.title,
  2290. type: 1,
  2291. area: _this.toolbarStyle.area,
  2292. content: content,
  2293. success: function(layero, index){
  2294. _this.toolbarFun.editTreeLoad(_this.getRequestParam(node));
  2295. form.render();
  2296. form.on("submit(dtree_editNode_form)",function(data){
  2297. var data = data.field;
  2298. $cite.html(data.editNodeName);
  2299. node = _this.getNodeParam($div);
  2300. var requestNode = _this.getRequestParam(node);
  2301. requestNode = $.extend(requestNode, data);
  2302. _this.temp = [$cite, $div];
  2303. _this.toolbarFun.editTreeNode(requestNode, $div);
  2304. layer.close(index);
  2305. });
  2306. }
  2307. });
  2308. break;
  2309. case defaultTool.delToolbar:
  2310. layer.confirm('确定要删除该'+_this.toolbarStyle.title+'?', {icon: 3, title:'删除'+_this.toolbarStyle.title}, function(index){
  2311. var node = _this.getNodeParam($div);
  2312. _this.temp = [$p_li, $p_div];
  2313. _this.toolbarFun.delTreeNode(_this.getRequestParam(node), $div);
  2314. layer.close(index);
  2315. });
  2316. break;
  2317. default:
  2318. var toolbarId = $(this).attr("dtree-tool");
  2319. if(_this.toolbarExt.length > 0){
  2320. for(var i=0; i<_this.toolbarExt.length; i++){
  2321. var ext = _this.toolbarExt[i];
  2322. if (toolbarId == ext.toolbarId){
  2323. ext.handler(_this.getRequestParam(_this.getNodeParam($div), $div));
  2324. break;
  2325. }
  2326. }
  2327. }
  2328. break;
  2329. }
  2330. });
  2331. // 绑定menubar的点击事件
  2332. _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).on("click", "button[d-menu]", function(event) {
  2333. event.stopPropagation();
  2334. var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
  2335. $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
  2336. _this.menubarListener($(this).attr("d-menu"), "group");
  2337. });
  2338. // 绑定menubar的点击事件
  2339. _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).on("click", "a[d-menu]", function(event) {
  2340. event.stopPropagation();
  2341. var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
  2342. $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
  2343. _this.menubarListener($(this).attr("d-menu"), "toolbar");
  2344. });
  2345. // 绑定menubar的点击按钮事件
  2346. _this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").on("click", function(event) {
  2347. event.stopPropagation();
  2348. var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
  2349. $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
  2350. _this.menubarListener($(this).attr("dtree-menu"), "freedom");
  2351. });
  2352. // 绑定cheboxbar的节点复选框
  2353. _this.obj.on("click", "i[dtree-click='"+eventName.checkNodeClick+"']", function(event) {
  2354. var $toolBarDiv = _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id);
  2355. $toolBarDiv.find(".layui-nav-child").removeClass('layui-anim-fadein layui-show');
  2356. var $i = $(this),
  2357. $div = $i.closest("div[dtree-click='"+eventName.itemNodeClick+"']"),
  2358. node = _this.getNodeParam($div);
  2359. // 复选框选中前的回调
  2360. var flag = _this.checkbarFun.chooseBefore($i, _this.getRequestParam(node));
  2361. _this.temp = [$i];
  2362. if(flag){_this.changeCheck();}
  2363. event.stopPropagation();
  2364. });
  2365. };
  2366. // 绑定body的单击,让本页面所有的toolbar隐藏
  2367. $BODY.on("click", function(event){
  2368. $("div."+LI_DIV_TOOLBAR).find(".layui-show").removeClass('layui-anim-fadein layui-show');
  2369. });
  2370. // 解绑浏览器事件
  2371. DTree.prototype.unbindBrowserEvent = function(){
  2372. var _this = this;
  2373. // 本身事件解绑
  2374. _this.obj.unbind();
  2375. // 菜单栏解绑
  2376. if(_this.menubar){
  2377. _this.obj.prevAll('div#dtree_menubar_'+_this.obj[0].id).unbind();
  2378. if(_this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").length > 0){
  2379. _this.obj.closest('body').find("*[dtree-id='"+_this.obj[0].id+"'][dtree-menu]").unbind();
  2380. }
  2381. }
  2382. // 工具栏解绑
  2383. if(_this.toolbar){
  2384. _this.obj.prevAll('div#dtree_toolbar_'+_this.obj[0].id).unbind();
  2385. if(_this.obj.closest(_this.toolbarScroll).length > 0){
  2386. _this.obj.closest(_this.toolbarScroll).unbind();
  2387. }
  2388. }
  2389. };
  2390. /** 外部访问 **/
  2391. var dtree = {
  2392. render: function(options){ // 初始化树
  2393. var dTree = null;
  2394. var id = event.getElemId(options);
  2395. if(id == "") {
  2396. layer.msg("页面中未找到绑定id", {icon:5});
  2397. } else {
  2398. dTree = DTrees[id];
  2399. if(typeof dTree === 'object'){
  2400. dTree.reloadSetting(options);
  2401. dTree.initTreePlus();
  2402. dTree.openTreePlus();
  2403. dTree.init();
  2404. dTree.unbindBrowserEvent();
  2405. dTree.bindBrowserEvent();
  2406. } else {
  2407. // 创建树
  2408. dTree = new DTree(options);
  2409. // 添加到树数组中去
  2410. DTrees[id] = dTree;
  2411. dTree.initTreePlus();
  2412. dTree.openTreePlus();
  2413. dTree.init();
  2414. dTree.bindBrowserEvent();
  2415. }
  2416. }
  2417. return dTree;
  2418. },
  2419. reload: function(dTree, options){
  2420. if(typeof dTree === "string"){
  2421. dTree = DTrees[dTree];
  2422. }
  2423. if(typeof dTree === "undefined"){
  2424. layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
  2425. return ;
  2426. }
  2427. dTree.reloadSetting(options);
  2428. dTree.initTreePlus();
  2429. dTree.openTreePlus();
  2430. dTree.init();
  2431. dTree.unbindBrowserEvent();
  2432. dTree.bindBrowserEvent();
  2433. },
  2434. on: function(events, callback) { // 绑定事件
  2435. if(events.indexOf("'") > 0){
  2436. events = events.replace(/'/g,"");
  2437. }
  2438. if(events.indexOf('"') > 0) {
  2439. events = events.replace(/"/g,"");
  2440. }
  2441. return layui.onevent.call(this, MOD_NAME, events, callback);
  2442. },
  2443. getNowParam: function(dTree){
  2444. if(typeof dTree === "string"){
  2445. dTree = DTrees[dTree];
  2446. }
  2447. if(typeof dTree === "undefined"){
  2448. layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
  2449. return ;
  2450. }
  2451. return dTree.getNowParam(); // 获取当前选中值
  2452. },
  2453. getParentParam: function(dTree, id){ // 获取参数的上级节点
  2454. if(typeof dTree === "string"){
  2455. dTree = DTrees[dTree];
  2456. }
  2457. if(typeof dTree === "undefined"){
  2458. layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
  2459. return ;
  2460. }
  2461. return dTree.getParentParam(id);
  2462. },
  2463. getChildParam: function(dTree, id){ // 获取参数的全部下级节点
  2464. if(typeof dTree === "string"){
  2465. dTree = DTrees[dTree];
  2466. }
  2467. if(typeof dTree === "undefined"){
  2468. layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
  2469. return ;
  2470. }
  2471. return dTree.getChildParam(id);
  2472. },
  2473. getCheckbarNodesParam: function(dTree){
  2474. if(typeof dTree === "string"){
  2475. dTree = DTrees[dTree];
  2476. }
  2477. if(typeof dTree === "undefined"){
  2478. layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
  2479. return {};
  2480. }
  2481. return dTree.getCheckbarNodesParam(); // 获取复选框选中值
  2482. },
  2483. dataInit: function(dTree, chooseId){ // 初始化选中树,针对数据返选
  2484. if(typeof dTree === "string"){
  2485. dTree = DTrees[dTree];
  2486. }
  2487. if(typeof dTree === "undefined"){
  2488. layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
  2489. return ;
  2490. }
  2491. if(chooseId){
  2492. return dTree.dataInit(chooseId);
  2493. }
  2494. },
  2495. chooseDataInit: function(dTree, chooseIds){ // 初始化复选框的值
  2496. if(typeof dTree === "string"){
  2497. dTree = DTrees[dTree];
  2498. }
  2499. if(typeof dTree === "undefined"){
  2500. layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
  2501. return ;
  2502. }
  2503. if(chooseIds){
  2504. return dTree.chooseDataInit(chooseIds);
  2505. }
  2506. },
  2507. changeCheckbarNodes: function(dTree){ //判断复选框是否发生变更
  2508. if(typeof dTree === "string"){
  2509. dTree = DTrees[dTree];
  2510. }
  2511. if(typeof dTree === "undefined"){
  2512. layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
  2513. return ;
  2514. }
  2515. return dTree.changeCheckbarNodes();
  2516. },
  2517. refreshTree: function(dTree){ //刷新树,并具有数据回显的功能,自动识别复选框or单选(未完成)
  2518. if(typeof dTree === "string"){
  2519. dTree = DTrees[dTree];
  2520. }
  2521. if(typeof dTree === "undefined"){
  2522. layer.msg("方法获取失败,请检查ID或对象传递是否正确",{icon:2});
  2523. return ;
  2524. }
  2525. },
  2526. escape: function(html){
  2527. return event.escape(html);
  2528. },
  2529. unescape: function(str){
  2530. return event.unescape(str);
  2531. },
  2532. version: function(){
  2533. return VERSION;
  2534. }
  2535. };
  2536. exports('dtree', dtree);
  2537. });