tntreebox.js 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. // var data = [
  2. // ];
  3. var data = [];
  4. var _tnTreebox = function(){};
  5. var _tnTreebox_id = 0;
  6. //_tnTreebox原型上增加方法
  7. _tnTreebox.prototype = {
  8. //初始化数据
  9. data:null,//三联级所有对象
  10. dom_id:null,
  11. name:null,
  12. old_selected:null,//默认选中状态
  13. width:0,
  14. //初始化方法
  15. //调用: tnTreeBox('treebox','checkboxname',data,['o_1','o_2']);
  16. init:function(dom_id,name,data,selected){
  17. this.dom_id = dom_id;
  18. this.data = data;
  19. this.name = name;
  20. this.old_selected = selected;
  21. },
  22. //动态创建初始页面
  23. makeHtml:function(){
  24. var _data = {};
  25. for(var i in this.data){
  26. //for..in循环遍历data的每一个对象,并赋值给d
  27. var d = this.data[i];
  28. //hasOwnProperty()判断对象是否包含特定的自身(非继承)属性。
  29. if(!d.hasOwnProperty('parent_id')){
  30. //第一级的数据,没有父节点
  31. d.parent_id = 0;
  32. }
  33. //区分每一级每一组的方法是parent_id,第一级为0
  34. //每一级一开始if内创建一个数组,并将第一个值放入,再走else将同一级的全部对象放入
  35. if(typeof(_data[d.parent_id]) != 'object'){
  36. //将第一个每一级的数据赋值给_data
  37. _data[d.parent_id] = [d];
  38. }else{
  39. // 将data[i]放入_data的d.parent_id属性中
  40. _data[d.parent_id].push(d);
  41. }
  42. }
  43. //console.log(_data) //输出按父节点分类的数组
  44. var html= "";
  45. for(var parent_id in _data){
  46. var list = _data[parent_id];
  47. // console.log(list)//按上面data顺序打印数组
  48. var html_list = "";//装子类html
  49. for(var j in list){
  50. var item = list[j];
  51. //$.inArray() 函数用于在数组中查找指定值,并返回它的索引值(如果没有找到,则返回-1)
  52. //被选中且在数组中可以找到,则默认为选中态
  53. if(this.old_selected&&$.inArray(item.id,this.old_selected)!=-1){
  54. var checked = " checked='checked'";
  55. }else{
  56. var checked = "";
  57. }
  58. //如果item的属性有is_select为true,那么默认也为选中态,此处有bug,即使选中态,后面也会被清空
  59. if(checked==''){
  60. try{
  61. if(item.is_select){
  62. checked = " checked='checked'";
  63. }
  64. }catch(err){
  65. }
  66. }
  67. var _class = "";
  68. // console.log(_data[item.id])//打印子类,为什么?
  69. //_data[item.id]是对象即为子类
  70. if(typeof(_data[item.id]) == 'object'){
  71. //增加一个类属性children,注意空格隔开
  72. _class+=" children";
  73. }
  74. try{
  75. if(item.is_hidden){
  76. _class+=" hide2";
  77. }
  78. }catch(err){
  79. }
  80. //补充class用来装上面的类
  81. if(_class){
  82. _class = " class='"+_class+"'";
  83. }
  84. //_tnTreebox_id
  85. _tnTreebox_id++;
  86. var id = 'treebox_'+_tnTreebox_id;
  87. //多选框
  88. var box = "<input type='checkbox' id='"+id+"' data-herf='"+item.href+"' data-id='11' name='"+this.name+"' value='"+item.id+"' />";
  89. try{
  90. //没有多选框,自行在data中定义,只有最后一项才有多选框
  91. if(item.no_box){
  92. box = '';
  93. }
  94. }catch(err){
  95. }
  96. //三级的box叠加
  97. html_list+="<li"+_class+" v="+item.id+"><em>"+box+"</em><label>"+item.name+"</label><span></span></li>";
  98. }
  99. var _class = 'box';
  100. //0是一级,其他的是子集
  101. if(parent_id==='0'){
  102. _class += " root";
  103. }else{
  104. _class += " hide";
  105. }
  106. if(_class){
  107. _class = " class='"+_class+"'";
  108. }
  109. //<li class=' children' v=o_1><em></em><label>基础数据管理</label><span></span></li>叠加
  110. html_list = "<div parent_id="+parent_id+_class+"><ul>"+html_list+"</ul></div>";
  111. // console.log(html_list)
  112. html+=html_list;//全部html_list叠加
  113. }
  114. //header存放选中的多选框内容,list存放动态生成的全部
  115. html = "<div class='header'></div><div class='list'>"+html+"</div>";
  116. //给id为treebox的div加上类tntreebox
  117. $("#"+this.dom_id).addClass('tntreebox').html(html);
  118. //获取宽度
  119. this.width = $("#"+this.dom_id).width();
  120. var that = this;
  121. $("#"+this.dom_id+" .children").on('click',function(){
  122. that.showChildren(this);
  123. });
  124. //当元素的值发生改变时,会发生 change 事件。
  125. $("#"+this.dom_id+" :checkbox").on('change',function(dom){
  126. console.log(dom.currentTarget)
  127. var event = dom.currentTarget;
  128. that.showChecked(event);
  129. });
  130. //?
  131. that.showChecked();
  132. },
  133. //点击触发事件
  134. showChildren:function(e){
  135. // console.log(e)//获取被点击元素
  136. var li = $(e);
  137. //cur,当前选中的元素
  138. li.parent().find('.cur').removeClass('cur');
  139. li.addClass('cur');
  140. //attr:找到每一个匹配元素的一个或多个属性。
  141. //找到一级盒子
  142. if(li.parent().parent().attr('class')=="box root"){
  143. var liV = li.attr("v");
  144. // 子元素取消颜色
  145. //让子类全部失效,注释掉之后,点击一级父类,子类还能继续保持选中状态
  146. // li.siblings().removeClass('selected');
  147. // $(".list").find(':checkbox').prop('checked',false);
  148. // li.parent().parent().parent().prev().html('');
  149. // $(".list li[v^=" + liV + "]").removeClass('selected');
  150. }
  151. //获得点击元素的id,id存储在v里面
  152. var id = li.attr('v');
  153. var col = li.parent().parent().attr('col');
  154. // console.log(col) 1/undefined
  155. //如果col==undefined,即一级col=0
  156. if(!col){
  157. col = 0;
  158. }
  159. var _col = col;
  160. // console.log(_col) 0/1
  161. //1代表着第二级
  162. while(1){
  163. _col++;
  164. //一级被点击后给其二级增加col=1,二级被点击后给其三级增加col=2
  165. var o = $("#"+this.dom_id+" div[col="+_col+"]");
  166. // console.log(o)
  167. if(o.length>0){
  168. //点击一级后隐藏其两级子类
  169. o.hide();
  170. }else{
  171. break;
  172. }
  173. }
  174. //点击后清除隐藏,并展示
  175. $("#"+this.dom_id+" div[parent_id="+id+"]").attr('col',col*1+1).removeClass('hide').show();
  176. },
  177. //多选框每次被点击触发
  178. showChecked:function(event){
  179. var html = '';
  180. //not:去除所有与给定选择器匹配的元素
  181. $("#"+this.dom_id+" input:checked").not('.hide2 input:checked').each(function(i,e){
  182. // console.log(e) //勾选的那个多选框,e等同于this
  183. //next:找到每个段落的后面紧邻的同辈元素中类名为label的元素。
  184. var text = $(this).parent().next('label').html();
  185. var id = $(this).val();
  186. //动态的为选中元素创建div,显示选中元素
  187. html += "<div>"+text+"<span v="+id+">x</span></div>";
  188. });
  189. if(html){
  190. html+=" <a>清空</a>";
  191. }
  192. //将创建好的div放入类名header的div里面
  193. // $("#"+this.dom_id+" .header").html(html);
  194. var thats = this
  195. //为x添加点击事件
  196. $("#"+this.dom_id+" .header span").on('click',function(){
  197. var obj = $(this);//$(this)是被点击的span的对象
  198. var id = obj.attr('v');
  199. //obj.parent().parent() 是header, length<2,因为是header也是div,其目的是清除header这个div内部的div
  200. if(obj.parent().parent().find('div').length<2){
  201. //移除“清空”按钮
  202. obj.parent().parent().find('a').remove();
  203. }
  204. //prop:获取匹配的元素集中第一个元素的属性(property)值或设置每一个匹配元素的一个或多个属性。
  205. //将三级的选中状态取消
  206. var checked = obj.parent().parent().next(".list").find(':checkbox[value='+id+']')
  207. checked.parent().parent().removeClass('selected');
  208. //将三级的多选框的对应的元素checked移除
  209. var p = checked.prop('checked',false);
  210. //移除被点击x的div
  211. obj.parent().remove();
  212. });
  213. var that = this;
  214. //“清空”按钮被点击后,全部移除
  215. // $("#"+this.dom_id+" .header a").on('click',function(){
  216. // var obj = $(this);
  217. // obj.parent().next('.list').find(':checkbox').prop('checked',false);
  218. // obj.parent().html('');
  219. // $("#"+that.dom_id+" .selected").removeClass('selected');
  220. // });
  221. //将原来的选中态,现在不是选中态的清除,下面会为真正被选中的重新添加selected样式
  222. $("#"+this.dom_id+" .selected").removeClass('selected');
  223. //选中背景加深
  224. $("#"+this.dom_id+" input:checked").each(function(index,item){
  225. //为三级li添加selected事件
  226. console.log(item);
  227. if(item == event)
  228. that.selected($(this).parent().parent());
  229. });
  230. },
  231. //selected事件
  232. selected:function(obj){
  233. $(obj).parent().parent().parent().find(':checkbox').prop('checked',false);
  234. $(obj).children().children().prop('checked',true);
  235. var href = $(obj).children().children().attr("data-herf");
  236. if(this.dom_id == 'treebox') {
  237. var id = $("#modal-mylink").attr("data-id")
  238. }
  239. else if(this.dom_id == 'treebox1') {
  240. var id = $("#modal-myApplink").attr("data-id");
  241. }
  242. // var id = $("#modal-mylink").attr("data-id") || $("#modal-myApplink").attr("data-id");
  243. console.log(id);
  244. // return;
  245. if(id){
  246. $("input[data-id="+id+"]").val('');
  247. $("input[data-id="+id+"]").val(href);
  248. $("#modal-mylink").attr("data-id","");
  249. $("#modal-myApplink").attr("data-id","");
  250. }else{
  251. ue.execCommand('link', {href:href});
  252. }
  253. $("#modal-mylink .close").click();
  254. $("#modal-myApplink .close").click();
  255. }
  256. };
  257. //最后归纳到tnTreeBox方法
  258. function tnTreeBox(id,name,data,selected){
  259. var obj = new _tnTreebox();//new一个_tnTreebox的实例
  260. obj.init(id,name,data,selected);//初始化
  261. obj.makeHtml();//绘制
  262. }