最近因为做权限功能,所以一直要和treeview打交道,虽然说treeview是个很好用的东东,可是客户端的操作未免太少了,因为自己添加了一个客户端的控件,没有使用他自己自带的checkbox功能,ID上是自己设置的,为了实现父级与子级 的级连,真是的费了好大的劲呀,原来打算写一个递归分析其div层之间的关系,
//查找其下所有的子层
function GetChildDiv(div)
{
var divs = document.getElementsByTagName("div");
for(var i=0;i<divs.length;i++){
e2=divs[i];
GetChildNode(e2.id);
}
}
function GetChildNode(div)
{
var eles = document.getElementsByTagName("input");
for(var i = 0; i < eles.length; i++){
e1 = eles[i];
//alert(e1.id);
if(e1.type == "checkbox" && e1.parentNode.parentNode.parentNode.parentNode.parentNode.parentNode.id==div) {
alert(e1.id);
}
}
}
结果却发现兄弟的关系也被放在了子层之中,痛恨一下,好不容易写了一堆的js,只好放弃,想改用ajax写吧,经理说这样写的话,会影响效率,三思而后想,决定放弃.5555555555,简直恨到了极点.不过还好,又想到了用链表来做,终于一路绿灯前进,写了N个方法之后,级连才算是告一段落, 可能是自己的想法受限,所以感觉还不是很完善.
把我写过后一个链表加父子级的级连copy过来一份,算是给自己的一个纪念吧,
/***************************************************************************************
Name: Javescript for checkbox in ASP.NET 2.0 TreeView
描述: ASP.NET 2.0 TreeView 主要功能:实现treeview中 父级与子级checkbox的级联状态
包括:
* 父级未选中状态,其子级是不可以操作
* 父级选中,其下子级也选中
Author: 蔡永莲
Date: 2008-02-27
Commonts:
***************************************************************************************/
var nodeRelate;
var list;
var first=null;
var last=null;
var childChk; //子节点ID;
var arr ;
//将所有模块功能关系放入链表中
function LinkList(id,parentID){
this.id=id;
this.parentData=parentID;
this.next=null;
}
function LinkListAdd(returnStr){
arr = returnStr.split(',');
for(var i=0;i<arr.length;i++)
{
nodeRelate=arr[i].split('/');
if(nodeRelate.length>0){
list=new LinkList(nodeRelate[0],nodeRelate[1]);
//如果是第一个,则第一个值和最后一个值都为当前值
if(first==null)
{
first=list;
last=list;
}
//不是第一个节点,则在其后追加值
else
{
last.next=list;
last=list;
}
}
}
}
//遍历链表判断checkbox的选择状态,此处只实现了其下一级子节点的级连,
function show(parentID,isChecked)
{
var childChk;
for(temp=first;temp!=null;temp=temp.next)
{
if(temp.parentData==parentID){
childChk = document.getElementById(temp.id)
//如果父节点的选择状态,选中则子节点选中,未选中,则子节点未选中
if(isChecked){
childChk.checked=isChecked;
}
else{
childChk.checked=false;
}
}
}
}
//父级与当前级及当前级下子级的级联关系
function isCheck(oChk,pChk)
{
var cb=document.getElementById(oChk);
var pCK=document.getElementById(pChk);
var isChecked;
//看当前级的状态,如果是选中,则判断其父级的状态,如果其父级不是选中状态,则弹出提示框
if(cb.checked){
if(pCK.checked){
cb.checked="checked";
}
else{
cb.checked=false;
alert("此父级未选中,请先选中父级");
}
}
// 是否级联选择
//记录当前级的选择状态
isChecked = cb.checked;
show(cb.id,isChecked);
}
//根节点下当前级与子级的级联关系
function isCheck(oChk)
{
var cb=document.getElementById(oChk);
var isChecked;
//记录当前级的选择状态
isChecked = cb.checked;
show(cb.id,isChecked);
}
//是否是checkbox
function IsCheckBox(element)
{
if(element == null)
return false;
return (element.tagName == "INPUT" && element.type.toLowerCase() == "checkbox");
}
不过还是很幸福的,因为最后实现了功能 ,虽然没有把其下所有的子级点全部选中,但因为时间关系,只好先做完了整个权限再接着完善,等改好了,再把那部分发下来.呵呵.