Treeview如何支持全选和单选,以及获取相关的节点id值,经过自己的修改改为针对3级目录,其中提供选择的是2和3级目录,我的代码如下(其中还需要一个selectID的hidden input控件)
1
2 // 根据已选择的节点的字符串初始化选择的节点
3 function findAndCheckedNodes(NodeArray,nodeDatas)
4 {
5 if (parseInt(NodeArray.length) == 0 )
6 {
7 return ;
8 }
9 else
10 {
11 for ( var i = 0 ;i < parseInt(NodeArray.length);i ++ )
12 {
13 var cNode,nodeData;
14 cNode = NodeArray[i];
15 // //如果该节点在nodeDatas里则初始化checked = true;
16 nodeData = cNode.getAttribute( " NodeData " );
17 for ( var j = 0 ;j < nodeDatas.length;j ++ )
18 {
19 if (nodeDatas[j] == nodeData)
20 {
21 cNode.setAttribute( " checked " , " true " );
22 break ;
23 }
24 }
25 // 如果有子节点,则继续递归
26 if (parseInt(cNode.getChildren().length) != 0 )
27 findAndCheckedNodes(cNode.getChildren(),nodeDatas);
28 }
29 }
30 }
31
32 // 节点的oncheck事件
33 function tree_oncheck(tree)
34 {
35 var node = tree.getTreeNode(tree.clickedNodeIndex);
36 var Pchecked = tree.getTreeNode(tree.clickedNodeIndex).getAttribute( " checked " );
37 setcheck(node,Pchecked);
38 setParent(node,Pchecked); // 如果是选择那么选择其父接点.
39 document.getElementById('selectID').value = '';
40 FindCheckedFromNode(TvwCategorys);
41 }
42 // 设置子节点选中
43 function setcheck(node,Pc)
44 {
45 var i;
46 var ChildNode = new Array();
47 ChildNode = node.getChildren();
48
49 if (parseInt(ChildNode.length) == 0 )
50 return ;
51 else
52 {
53 for (i = 0 ;i < ChildNode.length;i ++ )
54 {
55 var cNode;
56 cNode = ChildNode[i];
57 if (parseInt(cNode.getChildren().length) != 0 )
58 setcheck(cNode,Pc);
59 cNode.setAttribute( " checked " ,Pc);
60 }
61 }
62 }
63 // 获取所有节点状态
64 function FindCheckedFromNode(node)
65 {
66 var i = 0 ;
67 var nodes = new Array();
68 nodes = node.getChildren();
69
70 for (i = 0 ; i < nodes.length; i ++ )
71 {
72 var cNode;
73 cNode = nodes[i];
74 if (cNode.getAttribute( " checked " ))
75 AddChecked(cNode);
76 else
77 AddUnChecked(cNode);
78
79 if (parseInt(cNode.getChildren().length) != 0 )
80 {
81 FindCheckedFromNode(cNode);
82 }
83 }
84 }
85 // 添加选中节点
86 function AddChecked(node)
87 {
88 var selectID = document.getElementById( " selectID " ).value;
89 if (node.getAttribute( " Type " ) == " sub " && selectID.indexOf(node.getAttribute( " NodeData " )) < 0 )
90 document.getElementById( " selectID " ).value += node.getAttribute( " NodeData " ) + " , " ;
91 }
92 // 添加未选中节点
93 function AddUnChecked(node)
94 {
95 var selectID = document.getElementById( " selectID " ).value;
96 if (node.getAttribute( " Type " ) == " sub " && selectID.indexOf(node.getAttribute( " NodeData " )) >= 0 )
97 selectedID.replace( " , " + curID + " , " , " , " );
98 document.getElementById( " selectID " ).value = selectID;
99 }
100
101 // 设置子节点选中/取消;
102 // 同时需要设置父节点的状态(如果是取消选中的话,仅仅设置本节点及其所有字接点,不涉及父接点)
103 function setParent(node,Pc)
104 {
105 var parentNode = node.getParent();
106 if (parentNode)
107 {
108 var parentNodeFather = parentNode.getParent();
109 if (parentNodeFather)
110 {
111 setParent(parentNode,Pc);
112 }
113 if (Pc)
114 {parentNode.setAttribute( " checked " ,Pc);}
115 else
116 {
117 checkBrother(parentNode,Pc,node.getAttribute( " NodeData " ))
118 }
119 }
120 }
121
122 // 检查子接点是否有选择的,如果有一个选择了,那返回true
123 // 只查第一级节点.
124 function checkBrother(parentNode,Pc,nodeData)
125 {
126 var childNodes = new Array();
127 childNodes = parentNode.getChildren();
128 if (childNodes.length > 0 )
129 {
130 var bChecked = true ;
131 for ( var i = 0 ;i < childNodes.length;i ++ )
132 {
133 if (childNodes[i].getAttribute( " checked " ) == true && childNodes[i].getAttribute( " NodeData " ) != nodeData)
134 {
135 // alert(i+childNodes[i].getAttribute("Text"));
136 bChecked = false ;
137 break ;
138 }
139 }
140 if (bChecked)
141 {
142 parentNode.setAttribute( " checked " ,Pc);
143 }
144 else
145 {
146 // 所有父结点选择
147 setParent(parentNode, ! Pc)
148 }
149 }
150 else
151 {
152 parentNode.setAttribute( " checked " ,Pc);
153 }
154 }
155
2 // 根据已选择的节点的字符串初始化选择的节点
3 function findAndCheckedNodes(NodeArray,nodeDatas)
4 {
5 if (parseInt(NodeArray.length) == 0 )
6 {
7 return ;
8 }
9 else
10 {
11 for ( var i = 0 ;i < parseInt(NodeArray.length);i ++ )
12 {
13 var cNode,nodeData;
14 cNode = NodeArray[i];
15 // //如果该节点在nodeDatas里则初始化checked = true;
16 nodeData = cNode.getAttribute( " NodeData " );
17 for ( var j = 0 ;j < nodeDatas.length;j ++ )
18 {
19 if (nodeDatas[j] == nodeData)
20 {
21 cNode.setAttribute( " checked " , " true " );
22 break ;
23 }
24 }
25 // 如果有子节点,则继续递归
26 if (parseInt(cNode.getChildren().length) != 0 )
27 findAndCheckedNodes(cNode.getChildren(),nodeDatas);
28 }
29 }
30 }
31
32 // 节点的oncheck事件
33 function tree_oncheck(tree)
34 {
35 var node = tree.getTreeNode(tree.clickedNodeIndex);
36 var Pchecked = tree.getTreeNode(tree.clickedNodeIndex).getAttribute( " checked " );
37 setcheck(node,Pchecked);
38 setParent(node,Pchecked); // 如果是选择那么选择其父接点.
39 document.getElementById('selectID').value = '';
40 FindCheckedFromNode(TvwCategorys);
41 }
42 // 设置子节点选中
43 function setcheck(node,Pc)
44 {
45 var i;
46 var ChildNode = new Array();
47 ChildNode = node.getChildren();
48
49 if (parseInt(ChildNode.length) == 0 )
50 return ;
51 else
52 {
53 for (i = 0 ;i < ChildNode.length;i ++ )
54 {
55 var cNode;
56 cNode = ChildNode[i];
57 if (parseInt(cNode.getChildren().length) != 0 )
58 setcheck(cNode,Pc);
59 cNode.setAttribute( " checked " ,Pc);
60 }
61 }
62 }
63 // 获取所有节点状态
64 function FindCheckedFromNode(node)
65 {
66 var i = 0 ;
67 var nodes = new Array();
68 nodes = node.getChildren();
69
70 for (i = 0 ; i < nodes.length; i ++ )
71 {
72 var cNode;
73 cNode = nodes[i];
74 if (cNode.getAttribute( " checked " ))
75 AddChecked(cNode);
76 else
77 AddUnChecked(cNode);
78
79 if (parseInt(cNode.getChildren().length) != 0 )
80 {
81 FindCheckedFromNode(cNode);
82 }
83 }
84 }
85 // 添加选中节点
86 function AddChecked(node)
87 {
88 var selectID = document.getElementById( " selectID " ).value;
89 if (node.getAttribute( " Type " ) == " sub " && selectID.indexOf(node.getAttribute( " NodeData " )) < 0 )
90 document.getElementById( " selectID " ).value += node.getAttribute( " NodeData " ) + " , " ;
91 }
92 // 添加未选中节点
93 function AddUnChecked(node)
94 {
95 var selectID = document.getElementById( " selectID " ).value;
96 if (node.getAttribute( " Type " ) == " sub " && selectID.indexOf(node.getAttribute( " NodeData " )) >= 0 )
97 selectedID.replace( " , " + curID + " , " , " , " );
98 document.getElementById( " selectID " ).value = selectID;
99 }
100
101 // 设置子节点选中/取消;
102 // 同时需要设置父节点的状态(如果是取消选中的话,仅仅设置本节点及其所有字接点,不涉及父接点)
103 function setParent(node,Pc)
104 {
105 var parentNode = node.getParent();
106 if (parentNode)
107 {
108 var parentNodeFather = parentNode.getParent();
109 if (parentNodeFather)
110 {
111 setParent(parentNode,Pc);
112 }
113 if (Pc)
114 {parentNode.setAttribute( " checked " ,Pc);}
115 else
116 {
117 checkBrother(parentNode,Pc,node.getAttribute( " NodeData " ))
118 }
119 }
120 }
121
122 // 检查子接点是否有选择的,如果有一个选择了,那返回true
123 // 只查第一级节点.
124 function checkBrother(parentNode,Pc,nodeData)
125 {
126 var childNodes = new Array();
127 childNodes = parentNode.getChildren();
128 if (childNodes.length > 0 )
129 {
130 var bChecked = true ;
131 for ( var i = 0 ;i < childNodes.length;i ++ )
132 {
133 if (childNodes[i].getAttribute( " checked " ) == true && childNodes[i].getAttribute( " NodeData " ) != nodeData)
134 {
135 // alert(i+childNodes[i].getAttribute("Text"));
136 bChecked = false ;
137 break ;
138 }
139 }
140 if (bChecked)
141 {
142 parentNode.setAttribute( " checked " ,Pc);
143 }
144 else
145 {
146 // 所有父结点选择
147 setParent(parentNode, ! Pc)
148 }
149 }
150 else
151 {
152 parentNode.setAttribute( " checked " ,Pc);
153 }
154 }
155