做權限的時候,主要實現如下功能
1、該節點可以訪問,則他的父節點也必能訪問;
2、該節點可以訪問,則他的子節點也都能訪問;
3、該節點不可訪問,則他的子節點也不能訪問。
使用帶checkbox的數型結構能得到很好的用戶體驗,可是編程的難度也是有點增加,如果全部有服務端來完成,那點下刷下,肯定不行,只能使用javascript,javascript調試的時候郁悶的很,一個字類,還有郁悶的遞歸,麻煩
我以前是使用以下該方法
<script language="javascript">
<!--
//初始化節點
initchecknode(document.all("tvitemclientid").value,document.all("checked").value)
//初始化選中節點
function initchecknode(tree,tvvalue)
{
//獲得需要初始化選擇狀態的節點的字符串.
var selectednodes = tvvalue;
var arraynodes = new array();
arraynodes = selectednodes.split(",");
var allrootnode=new array();
allrootnode=document.getelementbyid(tree).getchildren();
//初始化選擇的節點
findandcheckednodes(allrootnode,arraynodes);
}
//根據已選擇的節點的字符串初始化選擇的節點
function findandcheckednodes(nodearray,nodedatas)
{
//alert(nodearray.length);
if(parseint(nodearray.length)==0)
{
return;
}
else
{
for(var i=0;i<parseint(nodearray.length);i++)
{
var cnode,nodedata;
cnode=nodearray[i];
////如果該節點在nodedatas里則初始化checked = true;
nodedata = cnode.getattribute("nodedata");
for(var j=0;j<nodedatas.length;j++)
{
if(nodedatas[j] == nodedata)
{
cnode.setattribute("checked","true");
break;
}
}
//如果有子節點,則繼續遞歸
if(parseint(cnode.getchildren().length)!=0)
findandcheckednodes(cnode.getchildren(),nodedatas);
}
}
}
//-->
//oncheck事件
function tree_oncheck(tree)
{
var i;
var node=tree.gettreenode(tree.clickednodeindex);
var pchecked=tree.gettreenode(tree.clickednodeindex).getattribute("checked");
setcheck(node,pchecked);
setparent(node,pchecked);
//window.alert(pchecked);
document.all.checked.value = "";
if (tree.getchildren().length > 0)
{
for (i=0;i<=tree.getchildren().length-1;i++)
{
if (tree.getchildren()[i].getattribute("checked"))
{
addchecked(tree.getchildren()[i]);
}
findcheckedfromnode(tree.getchildren()[i]);
}
}
}
//設置子節點選中
function setcheck(node,pchecked)
{
var i;
var childnode=new array();
childnode=node.getchildren();
if(parseint(childnode.length)==0)
{
return;
}
else
{
for(i=0;i<childnode.length;i++)
{
var cnode;
cnode=childnode[i];
cnode.setattribute("checked",pchecked);
//cnode.checked = pchecked;
if(parseint(cnode.getchildren().length)!=0)
{
setcheck(cnode,pchecked);
}
}
}
}
//設置子節點選中/取消;
//同時需要設置父節點的狀態(如果是取消選中的話,僅僅設置本節點及其所有字接點,不涉及父接點)
function setparent(node,pc)
{
var parentnode = node.getparent();
if(parentnode)
{
var parentnodefather = parentnode.getparent();
if(parentnodefather)
{
setparent(parentnode,pc);
}
if(pc)
{parentnode.setattribute("checked",pc);}
else
{
checkbrother(parentnode,pc,node.getattribute("nodedata"))
}
}
}
//檢查子接點是否有選擇的,如果有一個選擇了,那返回true
//只查第一級節點.
function checkbrother(parentnode,pc,nodedata)
{
var childnodes = new array();
childnodes = parentnode.getchildren();
if(childnodes.length >0)
{
var bchecked = true;
for(var i=0;i<childnodes.length;i++)
{
if(childnodes[i].getattribute("checked") == true && childnodes[i].getattribute("nodedata") != nodedata)
{
//alert(i+childnodes[i].getattribute("text"));
bchecked = false;
break;
}
}
if(bchecked)
{
parentnode.setattribute("checked",pc);
}
else
{
//所有父結點選擇
setparent(parentnode,!pc)
}
}
else
{
parentnode.setattribute("checked",pc);
}
}
//獲取所有節點狀態
function findcheckedfromnode(node)
{
var i = 0;
var nodes = new array();
nodes = node.getchildren();
for (i = 0; i <= nodes.length - 1; i++)
{
if (nodes[i].getattribute("checked"))
{
addchecked(nodes[i]);
}
if (parseint(nodes[i].getchildren().length) != 0 )
{
findcheckedfromnode(nodes[i]);
}
}
}
//添加選中節點
function addchecked(node)
{
document.all.checked.value += node.getattribute("nodedata") + ",";
}
//-->
</script>這種方法有個很大的問題,就是他客戶端設置的checkbox在服務器端是不能獲取的,現在只能在check的時候遍歷樹,并把checked的值放在一個文本里,然后提交到服務器,然后服務器來解析[email protected]@這種字符
現在我使用的是asp.net2.0,使用的是以下的方法
function public_getparentbytagname(element, tagname)
{
var parent = element.parentnode;
var uppertagname = tagname.touppercase();
//如果這個元素還不是想要的tag就繼續上溯
while (parent && (parent.tagname.touppercase() != uppertagname))
{
parent = parent.parentnode ? parent.parentnode : parent.parentelement;
}
return parent;
}
//設置節點的父節點cheched——該節點可訪問,則他的父節點也必能訪問
function setparentchecked(objnode)
{
var objparentdiv = public_getparentbytagname(objnode,"div");
if(objparentdiv==null || objparentdiv == "undefined")
{
return;
}
var objid = objparentdiv.getattribute("id");
objid = objid.substring(0,objid.indexof("nodes"));
objid = objid+"checkbox";
var objparentcheckbox = document.getelementbyid(objid);
if(objparentcheckbox==null || objparentcheckbox == "undefined")
{
return;
}
if(objparentcheckbox.tagname!="input" && objparentcheckbox.type == "checkbox")
return;
objparentcheckbox.checked = true;
setparentchecked(objparentcheckbox);
}
//設置節點的子節點uncheched——該節點不可訪問,則他的子節點也不能訪問
function setchildunchecked(divid)
{
var objchild = divid.children;
var count = objchild.length;
for(var i=0;i<objchild.length;i++)
{
var tempobj = objchild[i];
if(tempobj.tagname=="input" && tempobj.type == "checkbox")
{
tempobj.checked = false;
}
setchildunchecked(tempobj);
}
}
//設置節點的子節點cheched——該節點可以訪問,則他的子節點也都能訪問
function setchildchecked(divid)
{
var objchild = divid.children;
var count = objchild.length;
for(var i=0;i<objchild.length;i++)
{
var tempobj = objchild[i];
if(tempobj.tagname=="input" && tempobj.type == "checkbox")
{
tempobj.checked = true;
}
setchildchecked(tempobj);
}
}
//觸發事件
function checkevent()
{
var objnode = event.srcelement;
if(objnode.tagname!="input" || objnode.type!="checkbox")
return;
if(objnode.checked==true)
{
setparentchecked(objnode);
var objid = objnode.getattribute("id");
var objid = objid.substring(0,objid.indexof("checkbox"));
var objparentdiv = document.getelementbyid(objid+"nodes");
if(objparentdiv==null || objparentdiv == "undefined")
{
return;
}
setchildchecked(objparentdiv);
}
else
{
var objid = objnode.getattribute("id");
var objid = objid.substring(0,objid.indexof("checkbox"));
var objparentdiv = document.getelementbyid(objid+"nodes");
if(objparentdiv==null || objparentdiv == "undefined")
{
return;
}
setchildunchecked(objparentdiv);
}
}這種方法最大的好處就是服務端能得javascript設置的checked的值,不用沒點下就全部把樹遍利下,直接在服務端遍利一次就行了
//遍歷子節點
public void getchildnode(treenode node)
{
foreach (treenode node in node.childnodes)
{
if (node.checked)
{
strchecked += node.value+"@";
}
getchildnode(node);
}
}
}我照樣能得到它的check的值
新聞熱點
疑難解答
圖片精選