电脑网络: 全部 | 电脑诊所 | 图形图象 | 数据库 | IT论坛 | 硬件DIY | Web开发 | 编程语言 | 网络技术  
主题:树形结构的JS代码(2
摘要
关键词
  发送私信
//====================== 以下函数响应鼠标单击事件 =================================

function doclick(r)  //响应鼠标单击事件,r是一个span元素
{  
   if (r.parentElement.className=="branch") //如果选择的是树枝(r的parentElement是一个LI元素)
   {
  //alert(r.status);
  if (r.status=="closed") r.status="opened"; else r.status="closed"; //改变节点r的状态标记
 // alert(r.status);
  var cul=r.parentElement.children.tags("UL"); 
  if (cul!=null)  
   for (var i=0;i   if (r.status=="closed")  cul[i].style.display="none"; else cul[i].style.display="block";
  var mm=r.children[0]; //r一共有两个儿子元素,第一个为IMG元素,mm指向r的第一个儿子图片
  if (r.status=="closed") mm.src=mm.close_img; else mm.src=mm.open_img; //切换图片  
   }   
   if (lastSelected!=null) lastSelected.children[0].children[1].className="unselected";  //改变上一次选择的节点的外观
   r.children[1].className="selected";  //改变当前选择的节点的外观,r.children[1]是一个SPAN元素
   //注意,上面两句次序不能颠倒
   lastSelected=r.parentElement;  //改变当前选择的节点
}

//====================== 以上函数响应鼠标单击事件 =================================

//======================== 以下函数根据绝对URL在树中定位 ==========================

function locate(s)  //根据url=s 定位,s必须是绝对地址,返回所找到的LI节点,但是不做任何事

 if (document.all.tree==null) return;  
 var coll = document.all.tree.children.tags("UL");
 var e;

 if (coll!=null)
    for (var i=0;i    {
     e=FindInUL(coll[i],s);  //在每棵子树中找;
     if (e!=null) return(e); 
     } 
 return(null);
}

function FindInUL(r,s)  //在UL tag r中定位s
{    
 var cli=r.children.tags("LI");
 var e;
 if (cli!=null&&cli.length>0)
  for (var i=0;i   {      
    e=FindInLI(cli[i],s);
   if (e!=null) return(e);
  } 
   return(null);  
}

function FindInLI(r,s) //在LI tag r中定位s
{
 var lnk=GetLink(r); //返回LI节点r里面的第一个A元素
 if (lnk!=null&&lnk.href==s) 
  {  
  //LocateNode(r);  //定位节点r  
   return(r);
  } 
 var cul=r.children.tags("UL");
 var e;
 if (cul!=null&&cul.length>0) 
  for (var i=0;i  {
   e=FindInUL(cul[i],s);
    if (e!=null) return(e);  
  }  
 return(null);
}

//======================== 以上函数根据绝对URL在树中定位 ==========================
function GetLink(e)  //e是一个LI元素,返回e里面的第一个A元素
{
 if (e==null) return(null);
 var lnk=e.children[0].children[1].children.tags("A");
 if (lnk==null||lnk.length==0) return(null); else return(lnk[0]);
}

function select(e) //选择节点e,e 必须是一个LI元素,将e的父辈目录全部打开,e如果是目录也将其打开
{   
   if (e==null) return;
   if (lastSelected!=null) lastSelected.children[0].children[1].className="unselected";  //改变上一次选择的节点的外观
   e.children[0].children[1].className="selected";  //改变当前选择的节点的外观,e.children[0].children[1]是一个SPAN元素
   //注意,上面两句次序不能颠倒
   lastSelected=e;  //改变当前选择的节点
   if (e.className=="branch")  //如果e是树枝
   {
    e.children[0].status="opened";
    var mm=e.children[0].children[0];  //切换图片
    mm.src=mm.open_img;
    var cul=e.children.tags("UL");
    if (cul!=null)    
    for (var i=0;i   cul[i].style.display="block";    
   }
}

//===================== 以下函数根据节点r(一个LI元素)在树中定位 ====================

function LocateNode(r) //定位节点r,成功则返回true,否则返回false
{
 if (document.all.tree==null) return; 
 var coll = document.all.tree.children.tags("UL");
 if (coll!=null)
    for (var i=0;i   if (FindNodeInUL(coll[i],r)) return(true);//在每棵子树中找节点r;     
 return(false);
}

function FindNodeInUL(t,r)  //在UL tag t中定位节点r
{   
 var cli=t.children.tags("LI");
 if (cli!=null&&cli.length>0)
  for (var i=0;i   {      
    if (FindNodeInLI(cli[i],r))
   {
       t.style.display="block";  //改变t的可视性
       return(true);
   }
  } 
   return(false);  
}

function FindNodeInLI(t,r) //在LI tag t中定位节点r

 if (t==r) 
  {
   select(t);  //选中LI节点t
   return(true);
  } 
 var cul=t.children.tags("UL");
 if (cul!=null&&cul.length>0) 
  for (var i=0;i  {
   if (FindNodeInUL(cul[i],r))
   {
    t.children[0].status="opened";
    var mm=t.children[0].children[0];  //切换t的图片
    mm.src=mm.open_img;
    return(true);
   }
  }  
 return(false);
}

//===================== 以上函数根据节点r(一个LI元素)在树中定位 ====================
//========================= 以下函数将所有的目录关闭 ==============================

function closeAll() //将所有的目录折叠
{   if (document.all.tree==null) return; 
 var coll = document.all.tree.children.tags("UL");
 if (coll!=null)
    for (var i=0;i     { 
   var cli=coll[i].children.tags("LI");
   if (cli!=null&&cli.length>0)
         for (var j=0;j     }
 if (lastSelected!=null) lastSelected.children[0].children[1].className="unselected";  //改变上一次选择的节点的外观
 lastSelected=null;  
}
 

function closeLI(r)  //将节点r(一个LI元素)里面的各层关闭
{
 var cul=r.children.tags("UL");
 if (cul!=null&&cul.length>0) //如果r是目录
 { 
  r.children[0].status="closed";
  var mm=r.children[0].children[0];
  mm.src=mm.close_img;       //切换目录图片
  for (var i=0;i  {
   var cli=cul[i].children.tags("LI");
   if (cli!=null)   
    for (var j=0;j   cul[i].style.display="none";
  }
 }
}

//========================= 以上函数将所有的目录关闭 ==============================

//========================= 以下函数将所有的目录打开 ==============================

function openAll()  //将所有的目录打开
{  
 if (document.all.tree==null) return; 
 var coll = document.all.tree.children.tags("UL");
 if (coll!=null)
    for (var i=0;i     { 
   var cli=coll[i].children.tags("LI");
   if (cli!=null&&cli.length>0)
         for (var j=0;j     }
 if (lastSelected!=null) lastSelected.children[0].children[1].className="unselected";  //改变上一次选择的节点的外观
 lastSelected=null;  

function openLI(r)  //将节点r(一个LI元素)里面的各层打开
{
 var cul=r.children.tags("UL");
 if (cul!=null&&cul.length>0) //如果r是目录
 { 
  r.children[0].status="opened";
  var mm=r.children[0].children[0];
  mm.src=mm.open_img;       //切换目录图片
  for (var i=0;i  {
   var cli=cul[i].children.tags("LI");
   if (cli!=null)   
    for (var j=0;j   cul[i].style.display="block";
  }
 }
}

//========================= 以上函数将所有的目录关闭 ==============================


//====================== 以下函数找到树中下一个相邻节点 ============================

/*
nextNode(e) 找到节点e在树中的下一个相邻节点,返回值为一个LI元素
Algorithm:
 1.如果e有儿子,返回e 的第一个儿子;否则
 2.如果e没有父亲,则失败返回,否则
 3.如果e不是他的父亲的最后一个儿子,返回e的父亲的下一个儿子,即e的弟弟;否则
 4.e=e的父亲,转2;
*/
function nextNode(e)  //找到节点e在树中的下一个相邻节点,e 必须是LI元素
{   
 if (e==null||e.tagName!="LI") return(null);
 var cul=e.children.tags("UL"); 
 if (cul!=null&&cul.length>0)  //如果e有儿子
 { 
   var t=cul[0].children.tags("LI"); 
   if (t!=null&&t.length>0)  
    return(t[0]);  //返回e 的第一个儿子;   
 } 
 var par,i,son;
 while (true)
 {
  par=e.parentElement;  //par是e的父亲元素,应该是一个UL元素
  if (par==null||par.tagName!="UL") return(null);//如果e没有父亲,则失败返回 
  son=par.children.tags("LI");
  if (son!=null&&son.length>0)
   for (i=0;i    if (son[i]==e) break; //找到e在其父亲的儿子中的索引
  i++;
  if (i  e=par.parentElement;  //e现在是一个LI元素
  if (e==null||e.tagName!="LI") return(null);
 } 
}


//====================== 以下函数找到树中上一个相邻节点 ============================

/*
prevNode(e) 找到节点e在树中的上一个相邻节点,
Algorithm:
 1.如果e有哥哥,返回e的哥哥,否则
 2.如果e有父亲,则返回e的父亲,否则失败返回; 
*/
function prevNode(e)  //找到节点e在树中的上一个相邻节点,e 必须是LI元素
{   
 if (e==null||e.tagName!="LI") return(null);
 var par,i,son;  
 par=e.parentElement;
 if (par==null||par.tagName!="UL") return(null);//如果e没有父亲,则失败返回  
 son=par.children.tags("LI"); 
 if (son!=null&&son.length>0)
  for (i=0;i   if (son[i]==e) break; //找到e在其父亲的儿子中的索引 
 if (i>0) return(son[i-1]);//e不是他的父亲的第一个儿子,返回e的父亲的上一个儿子  
 par=par.parentElement;
// while (par!=null&&par.tagName!="BODY"&&par.tagName!="LI") par=par.parentElement;
 if (par!=null&&par.tagName=="LI") return(par);
       else return(null);
  
}


来源:  作者:
点击数: | 回复数: | 时间:2007-11-2 11:47:31
共有评论 
快速回复
游客身份发表,或者输入大名:
支持HTML语法,限250字内 
     
请根据下图中的字符输入验证码:
Powered by pwmis.com  技术支持