一个带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)[[0img3=new Image()ITPUB个人空间;R?4Khu
img3.src="/sysManage/images/e.gif";
var elment = img_close.src
function onMouseDown(){ITPUB个人空间"mH3C]5s
if(!document.all)return
wz P_JL,d x0var eventObj = event.srcElement;ITPUB个人空间;vJ_A.^9JR,m
if(eventObj.tagName=="IMG" ) {
s,bpgup0//判断是否存在子节点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%gN0var 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+UU7yRl0}
if (nested.style.display=="none") {ITPUB个人空间+?c/_f3^4H y%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\%Xwn,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%Zc1pG2\([m0{
ybV+k8rB: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个人空间,N rLvYkV;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'lv
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;
'w s 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*]
J s
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-K C5B
N,k8m3h0/**
LLmonF0* 判断某个节点值下的所有子节点是否被选中(主要用于权限树的选择).
e?D&B8B)c(XWa-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个人空间.@#SRh8IZ3i!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~3uUmp0}ITPUB个人空间6Q.}z0amg$`
}