这是最好的时代,这是最坏的时代,这是智慧的时代,这是愚蠢的时代;这是信仰的时期,这是怀疑的时期;这是光明的季节,这是黑暗的季节;这是希望之春,这是失望之冬;人们面前有着各样事物,人们面前一无所有;人们正在直登天堂;人们正在直下地狱。 我也要与时俱进了,被itpub2.0牵着尾巴,拼命的奔跑,不停的灌水...

一个带CheckBox的树形目录javascript的递归算法

上一篇 / 下一篇  2007-12-16 00:00:00 / 个人分类:软件开发

唉,很久以前写的代码,晒一晒,估计自己看都看不懂了,:(
c4| T+? if0

var head="display:''"ITPUB个人空间PI-L,WS#{C
img_close=new Image()ITPUB个人空间u\,[yf Biei(X
img_close.src="/sysManage/images/f.gif"ITPUB个人空间7} ?+hH K
img_open=new Image()ITPUB个人空间[6Db9q"JKNO\k
img_open.src="/sysManage/images/fo.gif"
#R WO/C GlW)[mg3=new Image()ITPUB个人空间;R?4K hu
img3.src="/sysManage/images/e.gif";

var elment = img_close.src

function onMouseDown(){ITPUB个人空间"mH3C]5s
if(!document.all)return
wzP_ JL,d x0var eventObj = event.srcElement;ITPUB个人空间;vJ_A.^9JR,m
if(eventObj.tagName=="IMG" ) {
s,b pgup0//判断是否存在子节点ITPUB个人空间 PT Vh!a5i
var sSrc = eventObj.src ;ITPUB个人空间pr5kP2p9_#[RH
if(sSrc == null || sSrc.length<=0)return;
)v:r?/i.O&L:{0if(sSrc.indexOf("e.gif") >= 0)return;

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

var nOffIndex = 2;
0l;XF6nF(g0rA w%g N0var srcIndex = eventObj.sourceIndex;ITPUB个人空间4o:Ym!B!ug1P8o
var nested = document.all[srcIndex + nOffIndex];
v;z7g4GS&X0if(nested.tagName!="DL"){
+wU)^$T*@0}Q0nested = document.all[srcIndex + 1];
;r5VN+U U7yRl0}

if (nested.style.display=="none") {ITPUB个人空间+?c/_f3^4Hy%K'?
nested.style.display='inline';
w1| e D|-Q0if(sSrc.indexOf("f.gif")>0)
7G-zt2aXA0eventObj.src = img_open.src;
"q Qb's!A0T~"\ V/w}0}
j#| Wm6j&F\0else {ITPUB个人空间d/h;RHB1U
nested.style.display="none";
VH;t G8Y6]0if(sSrc.indexOf("fo.gif")>0)ITPUB个人空间:@1s_;y@:CWB7be
eventObj.src = img_close.src;
:Q4J)^+Ix:_-b"m0}

}else if(eventObj.tagName == "A" ){//相应节点的点击ITPUB个人空间7L5v#YU7w~8M
var nChnlId = parseInt(eventObj.name);ITPUB个人空间_,G2o!](C h5uL4X
if(!isNaN(nChnlId)){ITPUB个人空间A D8l1}r;iM
onClickChannel(nChnlId);
g,c ] bh;PQ\0}ITPUB个人空间$HYS6] `"g#p1\%X wn,O
}ITPUB个人空间? BS-`@sY
}ITPUB个人空间|Et ~Yh
/** 选中某个节点下的所有子节点(主要用于权限树的选择).ITPUB个人空间HG~#MiC`
* @param obj 节点选择框对象(checkbox对象)ITPUB个人空间+{$L9U7vm:j5{ ^
*根据所选节点的值,遍历整个树,从而选中满足条件的节点.
N R Kq)L#aM/}8@ D0?Z0*/

/*
o'y xE!nz.N0function checkNode(obj) {
6w9^6V?,QW%i0for (var i=0;i<form1.chkID.length;i++)
gM%Zc1p G2\([m0{
ybV+k8r B:f0if (form1.chkID[i].value.length > obj.value.length && form1.chkID[i].value.substring(0,obj.value.length) == obj.value)
+?,TL|/K SNn0{

if(obj.checked)ITPUB个人空间 dy,y@T2W
{

form1.chkID[i].checked = true;
J9~hh^(U*~x3i C0}
.|{1n.EQ:T&X0else
#a)Fm4TJ|&Al0{ITPUB个人空间!ed9Hqa+m\9v*u
form1.chkID[i].checked = false;
;v3iex&M+M[JS0}ITPUB个人空间 ]3[#A$j E@ g4R
}
N _/o+BJf0}ITPUB个人空间-A[1I&KG$W
}ITPUB个人空间z,FGxEm{ r
*/

function checkNode(obj)ITPUB个人空间?\'K,\?*D z
{ITPUB个人空间8i7`l:jM6hN
var elm = obj.parentNode; ITPUB个人空间2z)GSJ \M
checkChildrenRecurve(elm);
X}XM9o2i~6A%}0//checkRootRecurve(document.getElementById("root"));ITPUB个人空间 az%Z z!U1n
}

function checkChildrenRecurve(elm)
SqDO ]1E0{ITPUB个人空间,NrLvYkV;b;}
var dd = elm;
R5cxb7MLf7VX0var dl = dd.lastChild;ITPUB个人空间,s,`#aR;I5K zi*xQ
if (dl.tagName != "DL") return;ITPUB个人空间 qrHeN.S z
var ddlist = dl.children;
g,grb_7w0for (var i=0;i<ddlist.length;i++)ITPUB个人空间1M:zuo l.uR
{ITPUB个人空间mo\lB1c"r
ddlist[i].firstChild.checked=elm.firstChild.checked;ITPUB个人空间1fa~GX t4k7D*i

V5n2W%G6K0checkChildrenRecurve(ddlist[i].firstChild.parentNode)
@~Z$yhOP0}
.SU'T qE0J8~0}

function checkRootRecurve(dl)ITPUB个人空间B\6jXm!~n!hJ
{ITPUB个人空间z*k+F"T|)~0]
if (dl.tagName != "DD") ITPUB个人空间!pZ,K7{e"D0DCT
{
/l%ah:r._1lO0dl.parentNode.firstChild.firstChild.allChecked = dl.parentNode.firstChild.firstChild.checked;ITPUB个人空间#fp,F~.jkCJ+f9o!Z
dl.parentNode.firstChild.firstChild.allUnChecked = !dl.parentNode.firstChild.firstChild.checked;ITPUB个人空间0U7r/n%W(od4U7Ql
return;
E]Er e m0}ITPUB个人空间(x8I"y3A"S8I
var lis = dl.children;ITPUB个人空间WN-^,M I3@5J)OE5u{
var allChecked = true;ITPUB个人空间xX'l v t j3v"w
var allUnChecked = true;
Dmm1Y`[:n;j`"u|0for (var i=0;i<lis.length;i++)
-X)b#P6g \8U q7em0{
,u [o}3p/@0IF0checkRootRecurve(lis[i].lastChild);
Y] t4vl+O x0allChecked = allChecked && lis[i].firstChild.firstChild.checked && lis[i].firstChild.firstChild.allChecked;
3O'j8xS9rh0allUnChecked = allUnChecked && !lis[i].firstChild.firstChild.checked && lis[i].firstChild.firstChild.allUnChecked;ITPUB个人空间K@8A}C;e8G {
}ITPUB个人空间,P"Gq7SE$f X#E6D V/m;F
dl.parentNode.firstChild.firstChild.allChecked=allChecked;ITPUB个人空间6k;`1g*}3? v)d
dl.parentNode.firstChild.firstChild.allUnChecked=allUnChecked;ITPUB个人空间5a6Z6tXk R2P#C/DT['N
if (allChecked || allUnChecked)ITPUB个人空间P:CQ/b\*Y w
{ITPUB个人空间 ^3F gw"lC
dl.parentNode.firstChild.firstChild.checked=allChecked;
ET9D+H.J.@Q'yq-W0dl.parentNode.firstChild.firstChild.disabled=false;ITPUB个人空间 R RC[(j
dl.parentNode.firstChild.childStatus=false;
gP(]#? v"Gt0}
Jr])o2g9gi0else
`@\d Hx_(y_y0{
#R`iaT0g:jd6nA0dl.parentNode.firstChild.firstChild.disabled=true;
1o.@&| dZ5H{0dl.parentNode.firstChild.childStatus=true;ITPUB个人空间O)U6u5uL
dl.parentNode.firstChild.firstChild.checked=true;

}ITPUB个人空间/DQRn:mhZp
}

document.onclick=onMouseDown

/**
8}k~?|;f:X;o)c&F0*如果所有子节点都被选中,然么父节点也要选中ITPUB个人空间GZ.?0p%TZ:K
*output:无
AX3NM+k$n4hu7G0*/
~8r7G}Q:| Q0function selParentNode(nodeIDStr,spltStr){ITPUB个人空间'cmp;k(@9xO2UJ7w
var nodeLen=nodeIDStr.length;ITPUB个人空间 hWj_ iF-@
var nodeList;

if(nodeLen<1){
C)K:RYN|0return;
'ws MM7j;w _^#i0}

nodeIDList = nodeIDStr.split(spltStr);
/rz p!\4j[9M&j0for (j=0;j<nodeIDList.length;j++)
(jUsCM P#NL0{
Ki_@[0if(checkSubNode(nodeIDList[j]))ITPUB个人空间'E|%b7np-m
{ITPUB个人空间+f&t7j3qm*] Js
for (var k=0;k<form1.chkID.length;k++)ITPUB个人空间6C)SZ%_ W&L8t4H5Pp
{ITPUB个人空间7C?5_ @ Y
if(form1.chkID[k].value == nodeIDList[j] )ITPUB个人空间N&nuY*pB]
{
h2Z~6K,W Z.nO0form1.chkID[k].checked = true;
6A(`1{|"AsN'dJq8~0break;
J&Ea-LX!Nd0}
Ef0wd t ubo0}ITPUB个人空间x7n|+G%F
}
|#St7GAt0}ITPUB个人空间jZ8K5\B-E
}


O5{f-KC5B N,k8m3h0/**
LLmonF0* 判断某个节点值下的所有子节点是否被选中(主要用于权限树的选择).
e?D&B8B)c(X Wa-b*t0* curNodeID 某个节点的值ITPUB个人空间8kI A-M7B6q-M'J
*output:true 或 false
1Gjlf/w,rA1l0**/
/A*hZfQ\ gF)g4w0function checkSubNode(curNodeID) {
0aXS;p:\4O mC0for (var i=0;i<form1.chkID.length;i++)
]2`TA-P3jc0{ITPUB个人空间.@#S Rh8IZ3i!L
if (form1.chkID[i].value.substring(0,curNodeID.length) == curNodeID && form1.chkID[i].value.length >= (curNodeID.length +2) )ITPUB个人空间Vr(wE!bqS
{ITPUB个人空间e6ZcZ+T py
if(!form1.chkID[i].checked )
/R@J{LDk[0{
&P:{Gtl v0return false;
4Q`%f!kx/F0}
}8~3u Ump0}ITPUB个人空间6Q.}z0amg$`
}
BI't1qM0return true;
c?#F)v,~_7Li0}


TAG:

不胜人生一场醉 引用 删除 bq_wang   /   2008-01-21 22:37:36
这是偶自己写的代码分析了2,3天才把递归算法搞定

记忆深刻,所以才发了出来
引用 删除 hunterdong   /   2008-01-21 08:40:40
haha,真不错,还有收集代码

好像5年前也写过树的代码,散落在某台前单位的服务器上了。。

收集和利用资源,是个重要而不容易保持并且合理应用的习惯阿。。(对于我)

目前用gmail+greader,但是链接还没有什么太好的收集办法(不喜欢用搜狐等)

学习
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-09-07  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 22535
  • 日志数: 65
  • 建立时间: 2007-12-07
  • 更新时间: 2008-08-31

RSS订阅

Open Toolbar