其實網上現在用JS來實現一個樹形的代碼多得不成樣子了.不過偶覺得這個還算可以的(至少比我第一次寫的那個強多了o_o)

我在WEB中JS初始化如下:

<  script language  =   "  javascript  "   >  
Show_Root  
=     2  
Insert_ID  
=     "  content  "  
Target_Text  
=     "  ContentCortrol  "  
Root_Name  
=     "  n0  "  
var  myurl   =     "  http://www.tkk7.com/jkallen  "  ;

 
//  我以當節點處于1, 4 ,7的時候作為父節點處理
var  n0   =     new   Node(  "  n0  "  ,  "  節點0  "  ,myurl,  "  none  "  );
var  n1   =   n0.createChild(  "  n1  "  ,  "  節點1  "  ,myurl,  "  none  "  )    ;    
var  n2   =   n1.createChild(  "  n2  "  ,  "  節點2  "  ,myurl,  "  none  "  )    ;
var  n3   =   n1.createChild(  "  n3  "  ,  "  節點3  "  ,myurl,  "  none  "  )    ;
var  n4   =   n0.createChild(  "  n4  "  ,  "  節點4  "  ,myurl,  "  none  "  )    ;
var  n5   =   n4.createChild(  "  n5  "  ,  "  節點5  "  ,myurl,  "  none  "  )    ;
var  n6   =   n4.createChild(  "  n6  "  ,  "  節點6  "  ,myurl,  "  none  "  )    ;
var  n7   =   n0.createChild(  "  n7  "  ,  "  節點7  "  ,myurl,  "  none  "  )    ;
var  n8   =   n7.createChild(  "  n8  "  ,  "  節點8  "  ,myurl,  "  none  "  )    ;
var  n9   =   n0.createChild(  "  n9  "  ,  "  節點9  "  ,myurl,  "  none  "  )    ;

loadPage( 
"  n0  "  )
 
</  script  >  

看起來相當笨拙.但這僅是為了表現JS罷了,其實各種node完全可以在bean中實現才是(node value也正是從DB是取才是啊)!

先來看效果啦:



其中一些主要的JS代碼分別如下:
Node的定義:

  function   Node(name, text, link, status)
{
    
this .name   =   name
    
this .text   =   text
    
this .link   =   link
    
this .status   =   status
    
    
this .depth   =     0  
    
this .order   =     1  
    
this .parent   =     ""  
    
this .folder   =     0  
    
this .closed   =     1  
            
    
this .childCount   =     0  
    
this .childArray   =     new    Array ()
    
    
this .isRoot   =   isRoot
    
this .isFolder   =   isFolder
    
this .isClosed   =   isClosed
    
this .isHeadChild   =   isHeadChild
      ..
     }
 


產生子節點:

  function   expandChild(iRoot)
{
    
var  sOutput   =    this .getMyBranch(iRoot)
    sOutput  
=     "  <tr bgcolor='#FFFFFF'><td class='text' width=260>  "     +   sOutput
     
if   (iRoot)
    
{
        iDepth  
=     0  
    }

     
else  
    
{
        iDepth  
=     1  
    }


     
if   ( !   this .isFolder())
    
{
        sOutput  
+=   getImageStr(  3  )   +     "  <a href='  "     +    this .link   +     "  ' target='  "     +   Target_Text   +     "  '>  "  
                 
+     "  <span id='  "     +    this .name   +     "  ' class='node' onclick=changeColor('  "     +    this .name   +     "  ')>  "  
                 
+    this .text   +     "  </span></a></td>  "  
    }

     
else  
    
{
         
if   ( this .depth   >=   iDepth)
        
{
            
var  iIconID   =     0  
             
if   ( this .isLastChild()) iIconID   =     1  
             
if   ( this .depth   ==   iDepth)
            
{
                 
if   ( this .isHeadChild()) iIconID   =     2  
                 
if   ( this .isSingleton()) iIconID   =     3  
            }

                sOutput  
+=     "  <a href='JavaScript:  "     +    this .name   +     "  .changeState()'>  "  
                     
+   getImageStr(  1  ,  this .isClosed()   *     4     +   iIconID)   +     "  </a>  "  
            sOutput  
+=   getImageStr(  2  ,  this .isClosed())
                    
             
if   ( this .link   ==     ""  )
            
{
                 
//  sOutput  +=   " <a href='JavaScript: "   +  this.name  +   " .changeState()'> " 
            }

             
else  
            
{
                sOutput  
+=     "  <a href='  "     +    this .link   +     "  ' target='  "     +   Target_Text   +     "  '>  "  
            }

            
            sOutput  
+=     "  <span id='  "     +    this .name   +     "  ' class='node'  "  
             
if   ( this .link   ==     ""  )
            
{
                sOutput  
+=     "  >  "  
            }

             
else  
            
{
                sOutput  
+=     "   onclick=changeColor('  "     +    this .name   +     "  ')>  "  
            }

            sOutput  
+=    this .text   +     "  </span></a></td>  "     +     "  <td width=40>  "     +   getStatusImageStr( this )   +     "  </td>  "          }

        sOutput  
=   sOutput   +     "  </tr>  "  
         
if   ( !   this .isClosed())
        
{
             
for   ( var  i   =     0  ; i  <    this .childCount; i   ++  )
                sOutput  
+=    this .childArray[i].expandChild(iRoot)
        }

    }

    
return  sOutput
}
 


展開父節點:

  function   expandChild(iRoot)
{
    
var  sOutput   =    this .getMyBranch(iRoot)
    sOutput  
=     "  <tr bgcolor='#FFFFFF'><td class='text'>  "     +   sOutput
     
if   (iRoot)
    
{
        iDepth  
=     0  
    }

     
else  
    
{
        iDepth  
=     1  
    }


     
if   ( !   this .isFolder())
    
{
        sOutput  
+=   getImageStr(  3  )   +     "  <a href='  "     +    this .link   +     "  ' target='  "     +   Target_Text   +     "  '>  "  
                 
+     "  <span id='  "     +    this .name   +     "  ' class='node' onclick=changeColor('  "     +    this .name   +     "  ')>  "  
                 
+    this .text   +     "  </span></a></td>  "  
    }

     
else  
    
{
         
if   ( this .depth   >=   iDepth)
        
{
            
var  iIconID   =     0  
             
if   ( this .isLastChild()) iIconID   =     1  
             
if   ( this .depth   ==   iDepth)
            
{
                 
if   ( this .isHeadChild()) iIconID   =     2  
                 
if   ( this .isSingleton()) iIconID   =     3  
            }

                sOutput  
+=     "  <a href='JavaScript:  "     +    this .name   +     "  .changeState()'>  "  
                     
+   getImageStr(  1  ,  this .isClosed()   *     4     +   iIconID)   +     "  </a>  "  
            sOutput  
+=   getImageStr(  2  ,  this .isClosed())
                    
             
if   ( this .link   ==     ""  )
            
{
                 
//  sOutput  +=   " <a href='JavaScript: "   +  this.name  +   " .changeState()'> " 
            }

             
else  
            
{
                sOutput  
+=     "  <a href='  "     +    this .link   +     "  ' target='  "     +   Target_Text   +     "  '>  "  
            }

            
            sOutput  
+=     "  <span id='  "     +    this .name   +     "  ' class='node'  "  
             
if   ( this .link   ==     ""  )
            
{
                sOutput  
+=     "  >  "  
            }

             
else  
            
{
                sOutput  
+=     "   onclick=changeColor('  "     +    this .name   +     "  ')>  "  
            }

            sOutput  
+=    this .text   +     "  </span></a></td>  "  
        }

        sOutput  
=   sOutput   +     "  </tr>  "  
         
if   ( !   this .isClosed())
        
{
             
for   ( var  i   =     0  ; i  <    this .childCount; i   ++  )
                sOutput  
+=    this .childArray[i].expandChild(iRoot)
        }

    }

    
return  sOutput
}
 


注意:

從以上可以看到在WEB頁面中得有相關JS代碼初始化Insert_ID(create space to storage the menu) 如:

< table  width ="100%" >
< tr >
 
< td  valign ="top"  id ="content"  nowrap >
 
</ td >
</ tr >
</ table >  

Insert_ID = "content"http://JS代碼 

 

在WEB頁面中得初始化Root_Name(此處為"n0")

JS中沒有提供對父節點的判斷,而是直接(依據當前節點的下標)取得某一節點的父節點(反正菜單項一般是從DB中select的,所以你可以在bean中去處理).我覺得也許可以將此功能也在JS中實現,將DB中的數據直接提到XML(or我們JS是從JS中提取數據的)....