2004年时候写的,javascript出来的时间不久,没那么多框架和现成的模板,当时比较流行树形目录展现层级数据,但那棵目录树有几万个节点,而且层级不是固定的,并且要求点击叶子节点选中所有直接父节点,点击父节点选中所有子节点,当时完全基于javascript写的,每次点击节点进行遍历,响应一下需要1分钟,客户无法忍受要求优化。

曾经写过javaservlet代码,但服务端和客户端通信有问题,后来再次重新改写,在JSP服务端输出树形目录树,在js端进行响应优化,采用的是递归算法,花了三天时间研究节点和节点的HTML标签关系,最后写出来了,基本秒计响应,可以说超过了预期值。

十年以后申请专利,结果经过漫长的等待,被驳回来了。

仅此怀念过去的代码时光!


唉,很久以前写的代码,晒一晒,估计自己看都看不懂了,:(

代码示例

  1. var head = "display:''"

  2. img_close=new Image()

  3. img_close.src="/sysManage/images/f.gif"

  4. img_open=new Image()

  5. img_open.src="/sysManage/images/fo.gif"

  6. img3=new Image()

  7. img3.src="/sysManage/images/e.gif";


  8. var elment = img_close.src


  9. function onMouseDown()

  10. {

  11. if(!document.all)return

  12. var eventObj = event.srcElement;

  13. if(eventObj.tagName=="IMG" )

  14. {

  15. //判断是否存在子节点

  16. var sSrc = eventObj.src ;

  17. if(sSrc == null || sSrc.length<=0)return;

  18. if(sSrc.indexOf("e.gif") >= 0)return;


  19. if(sSrc.indexOf("f")<0 && sSrc.indexOf("tree-site")<0 )return;


  20. var nOffIndex = 2;

  21. var srcIndex = eventObj.sourceIndex;

  22. var nested = document.all[srcIndex + nOffIndex];

  23. if(nested.tagName!="DL")

  24. {

  25. nested = document.all[srcIndex + 1];

  26. }


  27. if (nested.style.display=="none")

  28. {

  29. nested.style.display='inline';

  30. if(sSrc.indexOf("f.gif")>0)

  31. eventObj.src = img_open.src;

  32. }

  33. else

  34. {

  35. nested.style.display="none";

  36. if(sSrc.indexOf("fo.gif")>0)

  37. eventObj.src = img_close.src;

  38. }

  39. }

  40. else if(eventObj.tagName == "A" )

  41. {//相应节点的点击

  42. var nChnlId = parseInt(eventObj.name);

  43. if(!isNaN(nChnlId))

  44. {

  45. onClickChannel(nChnlId);

  46. }

  47. }

  48. }

  49. /** 选中某个节点下的所有子节点(主要用于权限树的选择).

  50. * @param obj 节点选择框对象(checkbox对象)

  51. *根据所选节点的值,遍历整个树,从而选中满足条件的节点.

  52. */


  53. function checkNode(obj)

  54. {

  55. var elm = obj.parentNode;

  56. checkChildrenRecurve(elm);

  57. }


  58. function checkChildrenRecurve(elm)

  59. {

  60. var dd = elm;

  61. var dl = dd.lastChild;

  62. if (dl.tagName != "DL") return;

  63. var ddlist = dl.children;

  64. for (var i=0;i<ddlist.length;i++)

  65. {

  66. ddlist[i].firstChild.checked=elm.firstChild.checked;

  67. checkChildrenRecurve(ddlist[i].firstChild.parentNode)

  68. }

  69. }


  70. function checkRootRecurve(dl)

  71. {

  72. if (dl.tagName != "DD")

  73. {

  74. dl.parentNode.firstChild.firstChild.allChecked = dl.parentNode.firstChild.firstChild.checked;

  75. dl.parentNode.firstChild.firstChild.allUnChecked = !dl.parentNode.firstChild.firstChild.checked;

  76. return;

  77. }

  78. var lis = dl.children;

  79. var allChecked = true;

  80. var allUnChecked = true;

  81. for (var i=0;i<lis.length;i++)

  82. {

  83. checkRootRecurve(lis[i].lastChild);

  84. allChecked = allChecked && lis[i].firstChild.firstChild.checked && lis[i].firstChild.firstChild.allChecked;

  85. allUnChecked = allUnChecked && !lis[i].firstChild.firstChild.checked && lis[i].firstChild.firstChild.allUnChecked;

  86. }

  87. dl.parentNode.firstChild.firstChild.allChecked=allChecked;

  88. dl.parentNode.firstChild.firstChild.allUnChecked=allUnChecked;

  89. if (allChecked || allUnChecked)

  90. {

  91. dl.parentNode.firstChild.firstChild.checked=allChecked;

  92. dl.parentNode.firstChild.firstChild.disabled=false;

  93. dl.parentNode.firstChild.childStatus=false;

  94. }

  95. else

  96. {

  97. dl.parentNode.firstChild.firstChild.disabled=true;

  98. dl.parentNode.firstChild.childStatus=true;

  99. dl.parentNode.firstChild.firstChild.checked=true;

  100. }

  101. }


  102. document.οnclick=onMouseDown


  103. /**

  104. *如果所有子节点都被选中,然么父节点也要选中

  105. *output:无

  106. */

  107. function selParentNode(nodeIDStr,spltStr)

  108. {

  109. var nodeLen=nodeIDStr.length;

  110. var nodeList;


  111. if(nodeLen<1){

  112. return;

  113. }


  114. nodeIDList = nodeIDStr.split(spltStr);

  115. for (j=0;j<nodeIDList.length;j++)

  116. {

  117. if(checkSubNode(nodeIDList[j]))

  118. {

  119. for (var k=0;k<form1.chkID.length;k++)

  120. {

  121. if(form1.chkID[k].value == nodeIDList[j] )

  122. {

  123. form1.chkID[k].checked = true;

  124. break;

  125. }

  126. }

  127. }

  128. }

  129. }



  130. /**

  131. * 判断某个节点值下的所有子节点是否被选中(主要用于权限树的选择).

  132. * curNodeID 某个节点的值

  133. *output:true 或 false

  134. **/

  135. function checkSubNode(curNodeID)

  136. {

  137. for (var i=0;i<form1.chkID.length;i++)

  138. {

  139. if (form1.chkID[i].value.substring(0,curNodeID.length) == curNodeID && form1.chkID[i].value.length >= (curNodeID.length +2) )

  140. {

  141. if(!form1.chkID[i].checked )

  142. {

  143. return false;

  144. }

  145. }

  146. }

  147. return true;

  148. }


关于树形目录的一段javascript代码_i++