利用JavaScript實現樹型結構的TreeView類

來源:互聯網
上載者:User
說明:這是一個用JAVASCRPT類實現的顯示樹型結構的類。程式的0.5版(第一次編寫的不完美程式)是用JAVASCRIPT和XML DOM實現的,在IE5.5以下的版本中,必須安裝MSXML3.0組件才可以使用。
     該版本的程式採用數組代替了XML DOM,速度更快,也更穩定!
     下一步,我將使用HTML DOM 編寫ListView類,請喜歡的朋友為我提供思路
     這是我第一個寫成的自己比較滿意的作品,歡迎大家多提意見。在此,將原始碼全部公開,喜歡能為大家所使用
    
     類中的方法為:
     add(節點編號,父節點編號,節點文字)
     refresh()   根據數組中的內容更改外觀
    
     類中的屬性為:
     container  一個TD的HTML DOM節點,需要更改TREEVIEW的外觀時使用
     selectedID 當前選中的節點的編號
     data       存貯節點資訊的數組
    
     使用方法:
     一般與伺服器端的目錄結構表一起使用
     eg: var tv=new TreeView("tv");   這裡要注意,由於類中成員對象的事件中,不能識別對象本身,所以必須在類的建構函式中加入代表對象名的字串
         tv.add(0,1,"跟目錄一");       0代表在跟節點下添加節點
         tv.add(1,2,"子目錄一");      
         tv.refresh();                顯示外觀
        
    註:程式中使用了六張圖片,注意指定它們的路徑,需要的話可以在http://www.fangfa.net/treeview/下下載
===================================================*/

//預先下載圖片
var ImagePath="./";  //在這裡定義預設的圖片路徑

var img1=new Image();
img1.src=ImagePath+"close.gif";
var img2=new Image();
img2.src=ImagePath+"closeitem.gif";
var img3=new Image();
img3.src=ImagePath+"closeselect.gif";
var img4=new Image();
img4.src=ImagePath+"open.gif";
var img5=new Image();
img5.src=ImagePath+"openitem.gif";
var img6=new Image();
img6.src=ImagePath+"openselect.gif";
//**********************************************************
//*                     TreeView類                         *
//* 功能:顯示樹型結構                                      *
//* 時間:2002-9-27 17:25                                  *
//* 作者:阿福,happy_afu@sina.com                          *
//* 版本:1.0                                               *
//**********************************************************
//註:數組格式:Array(編號,父節點編號,文本,級數,選擇情況,展開情況,子節點ID列表)
function TreeView(ObjectVarName)
{
//屬性
this.OverTag=null;                                           //滑鼠移上時候的標籤
this.OverObj=null;                                           //滑鼠移上時候的對象
this.container=CreateTable();                                //建立最初的表格,返回容器物件
this.selectedID=null;                                        //得到當前選中的對象
this.data=new Array();
//方法
this.CreateRow=CreateRow;                                    //建立行
        //高層函數
this.add=add;                                                //添加節點
this.refresh=refresh;                                        //根據XML節點的值來建立TREEVIEW外觀
this.ADDNODE=ADDNODE;                                        //遞迴方法加入節點
 
this.add=add;
function add(ParentID,ID,TEXT)
{
//首先檢查數組中是否已經存在這個元素
var item;
for(item in this.data)
{
if(this.data[item][0]==ID)
{
alert("ID為"+ID+"的元素已經存在!");
return;
}
}

if(ParentID==0)
{
this.data[ID]=new Array(ID,ParentID,TEXT,1,false,false,new Array());
}
else
{
//首先找到父節點
for(item in this.data)
{
if(this.data[item][0]==ParentID)
{
//在父節點的ID列表中加入
this.data[item][6][this.data[item][6].length]=ID;
var level=this.data[item][3]+1;
this.data[ID]=new Array(ID,ParentID,TEXT,level,false,false,new Array());
return;
}
}
//如果沒有找到
alert("沒有找到ParentID為"+ParentID+"的父節點");
return;
}
}

//*建立最初的表格,返回容器物件
function CreateTable() 
{
var TableID="maintable";
var TableText;
var classText="background-color:#FFFFFF;";  //這裡是控制風格的代碼
TableText="<table border=0 cellpadding=0 cellspacing=0 style='" + classText + "'" +
  " id='" + TableID + "'" +
  "><tbody><tr><td></td></tr></tbody></table>";
document.write(TableText);
return document.all[TableID].childNodes[0].childNodes[0].childNodes[0];  //返回最裡面儲存格的對象
}

//*建立一表格,作為外觀的行
function CreateRow(ID,text,level,IsClose,hasChild,Selected,locate)  //插入一行,在表格中第LOCATE行插入
{
//建立table標記
var table=document.createElement("TABLE");
table.setAttribute("id","t" + ID);
table.setAttribute("border","0");
table.setAttribute("cellpadding","0");
table.setAttribute("cellspacing","0");
table.setAttribute("height","16");
table.setAttribute("cellpadding","0");
//建立tbaby標記
var tbody=document.createElement("TBODY");
//建立tr標記
var tr =  document.createElement("TR");
//建立縮排儲存格
var indent=document.createElement("TD");
indent.setAttribute("width",(level-1)*16+1);
tr.appendChild(indent);
//建立圖片儲存格
var imgtd=document.createElement("TD");
imgtd.setAttribute("width","32");
//定義節點圖片
var ImagePath="./";  //定義圖片路徑
var ImgFC=ImagePath + "close.gif"  //關閉的父節點
var ImgFO=ImagePath + "open.gif"  //開啟的父節點
var ImgFCS=ImagePath + "closeselect.gif"  //關閉選中的父節點
var ImgFOS=ImagePath + "openselect.gif" //'開啟選中的父節點
var ImgCOS=ImagePath + "openitem.gif"  //開啟選中的子節點
var ImgCC=ImagePath + "closeitem.gif"   //關閉的子節點
var img; 
if(hasChild)  //如果有子節點
{
if(IsClose)  //如果是關閉的父節點
{
if(Selected){img=ImgFCS;}//如果是關閉未選中的父節點
else        {img=ImgFC; }//如果是關閉選中的父節點
}
else  //如果是開啟的父節點
{
if(Selected){img=ImgFOS; }//如果是開啟未選中的父節點
else        {img=ImgFO;}//如果是開啟選中的父節點
}
}
else  //如果沒有子節點
{
if(Selected){img=ImgCOS;}//如果是選中的子節點
else     {img=ImgCC; }//如果是未選中的子節點
}
//建立圖片標記
var nodeimg=document.createElement("IMG");
nodeimg.setAttribute("width","32");
nodeimg.setAttribute("height","16");
nodeimg.setAttribute("id","i" + ID);
nodeimg.setAttribute("src",img);
imgtd.appendChild(nodeimg);
tr.appendChild(imgtd);
//建立文本儲存格
var textnode=document.createElement("TD");
textnode.setAttribute("id","d" + ID);
textnode.setAttribute("title",text);
if(text.length>8){text=text.substr(0,8)+"..";}
textnode.innerText=text;
tr.appendChild(textnode);
//下面進行組合
tbody.appendChild(tr);
table.appendChild(tbody);
//下面插入主容器
if(locate<0||locate>this.container.childNodes.length-1)
{
this.container.appendChild(table);
}
else
{
this.container.insertBefore(table,this.container.childNodes[locate]);
}
//下面是控制風格的代碼
document.all["i"+ID].style.cursor="hand";
document.all["d"+ID].style.cursor="hand";
if(Selected==true)
{
document.all["d"+ID].style.backgroundColor="#003399";
document.all["d"+ID].style.color="#FFFFFF";
}
}
//查看下一部分

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=258913

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.