javascript动态生成树形菜单的方法
本文实例讲述了javascript动态生成树形菜单的方法。分享给大家供大家参考,具体如下:
//======================================== //EnvrionmenttoholdListeners //======================================== tv_listeners=newArray(); functionlistener(type,handler){ this.type=type; this.handler=handler; this.id=tv_listeners.length; tv_listeners[tv_listeners.length]=this; } functionaddListener(type,handler){ newlistener(type,handler); } //===END===== //========================================= //Holdthetopitem //========================================= tv_topnodeitem=null; //=====END======= //========================================= //Holdnodeitems,andsupplyanodeitemRegister //========================================= nodeitems=newArray(); functionnodeitemRegister(obj){ nodeitems[nodeitems.length]=obj; returnnodeitems.length-1; } //===END======= //================================= //Customastack //Class:stack //metheds:get() //put(obj) //================================= functionstack(){ this.value=newArray(); this.cursor=0; } functionstack_get(){ this.cursor=this.cursor-1; returnthis.value[this.cursor]; } functionstack_put(obj){ this.value[this.cursor]=obj; this.cursor=this.cursor+1; } stack.prototype.get=stack_get; stack.prototype.put=stack_put; //=======END========== //========================================= //Defineapublicstack //========================================= userstack=newstack(); //======END=========== //========================================= //ImageList //========================================= treeview_box_0_none="../images/4_clos.gif"; treeview_box_0_line="../images/4_none.gif"; treeview_box_2_open="../images/2_open.gif"; treeview_box_2_none="../images/2_none.gif"; treeview_box_2_close="../images/2_clos.gif"; treeview_box_1_open="../images/3_open.gif"; treeview_box_1_none="../images/3_none.gif"; treeview_box_1_close="../images/3_clos.gif"; //=============================================== //Class:nodeitem //status------------------------1:two-direction0:nobox0:disactivite //2:three-0direction1:close-box1:activite //2:open-box //=============================================== functionnodeitem(parentkey,key,lable,img){ this.lable=lable; this.key=key; this.parent=findNode(parentkey); if(this.parent!=null){ aa=this.parent.status; if(aa.substring(1,2)=="0") this.parent.status=aa.substring(0,1)+"1"+aa.substring(2,3); if(this.parent.maxsubitem!=null) this.parent.maxsubitem.status="2"+this.parent.maxsubitem.status.substring(1,3); this.parent.subitems[this.parent.subitems.length]=this; this.parent.maxsubitem=this; } else{ if(tv_topnodeitem!=null){ alert("不能有两个顶项!"); return; } tv_topnodeitem=this; } this.img=img; this.tag=null; this.status="100"; this.subitems=newArray(); this.maxsubitem=null; this.id=nodeitemRegister(this); //********************** this.questionId=0; this.description=""; //this.url=null; //********************** //addedbymsbforthesortandmoveup/down /*if(this==tv_topnodeitem) { this.nodeIndex=0; }else{ this.nodeIndex=this.parent.subitems.length; }*/ //endadded } //addedbymsbforthesortandmoveup/down functionnodeitem_moveUp(){ if(this==tv_topnodeitem)return;//topitem ssubitems=this.parent.subitems; for(i=0;i<ssubitems.length;i++){ if(ssubitems[i]==this){ break; } } if(i==0)return; ssubitems[i]=ssubitems[i-1]; ssubitems[i-1]=this; if(i==ssubitems.length-1){ ssubitems[i-1].status="2"+ssubitems[i-1].status.substring(1,3); ssubitems[i].status="1"+ssubitems[i].status.substring(1,3); } /* itemTemp=this; ssubitems[this.nodeIndex-1]*/ /*for(i=0;i<ssubitems.length;i++){ if(ssubitems[i]!=null&&ssubitems[i].nodeIndex==(this.nodeIndex-1)) previousitem=ssubitems[i] } previousitem.nodeIndex=this.nodeIndex; this.nodeIndex=this.nodeIndex-1; swap(this,previousitem); */ //label_on_click(this.id); this.parent.refresh(); lable_on_click(this.id); }//moveUp() functionnodeitem_moveDown(){ if(this==tv_topnodeitem)return;//topitem ssubitems=this.parent.subitems; for(i=0;i<ssubitems.length;i++){ if(ssubitems[i]==this){ break; } } if(i==ssubitems.length-1)return; ssubitems[i]=ssubitems[i+1]; ssubitems[i+1]=this; if(i==ssubitems.length-2){ ssubitems[i+1].status="1"+ssubitems[i+1].status.substring(1,3); ssubitems[i].status="2"+ssubitems[i].status.substring(1,3); } this.parent.refresh(); lable_on_click(this.id); }//moveDown() /*functionswap(item1,item2){ nodeitems[item1.id]=item2; nodeitems[item2.id]=item1; idTemp=item1.id; item1.id=item2.id; item2.id=idTemp; }*/ //endadded functionnodeitem_setTag(obj){ this.tag=obj; } functionnodeitem_getTag(){ returnthis.tag; } functionnodeitem_show(){ str="<spanid='preface"+this.id+"'><tableborder='0'cellspacing='0'cellpadding='0'><tr><td>"; str_f=""; for(j=this.parent;j!=null;j=j.parent){ if(j.status.substring(0,1)==1) str_f="<imgsrc='"+treeview_box_0_none+"'align='absmiddle'>"+str_f; else str_f="<imgsrc='"+treeview_box_0_line+"'align='absmiddle'>"+str_f; } str=str+str_f; str+="<imgid='box"+this.id+"'nodeid='"+this.id+"'src='"; switch(this.status.substring(0,2)){ case"10":str+=treeview_box_1_none;break; case"11":str+=treeview_box_1_close;break; case"12":str+=treeview_box_1_open;break; case"20":str+=treeview_box_2_none;break; case"21":str+=treeview_box_2_close;break; case"22":str+=treeview_box_2_open;break; } str+="'align='absmiddle'onclick='box_on_click(this)'>"; if(this.img=="") str+=this.img; else str+="<imgsrc='"+this.img+"'align='absmiddle'width='16'height='16'>"; str+="</td><td><tableborder='0'cellspacing='1'cellpadding='1'style='font-size:9pt;color:#333333'id='lablePanel"+this.id+"'><tr><tdondblclick='lable_on_dblclick("+this.id+")'onclick='lable_on_click("+this.id+")'style='cursor:hand'id='f_lablePanel"+this.id+"'nowrap>"+this.lable+"</td></tr></table></td></tr></table>"; str+="</span><spanid='tv_panel_"+this.id+"'style='display:"; if(this.status.substring(1,2)=='2') str+=""; else str+="none"; str+="'></span>"; if(this.parent==null) for(variindocument.all){ if(document.all[i].tagName=="BODY") { document.all[i].insertAdjacentHTML("AfterBegin",str); break } } else document.all("tv_panel_"+this.parent.id).insertAdjacentHTML("BeforeEnd",str); for(m=0;m<this.subitems.length;m++) if(this.subitems[m]!=null){ userstack.put(m); this.subitems[m].show(); m=userstack.get(); } } functionnodeitem_refresh(){ str="<tableborder='0'cellspacing='0'cellpadding='0'><tr><td>"; str_f=""; for(j=this.parent;j!=null;j=j.parent){ if(j.status.substring(0,1)==1) str_f="<imgsrc='"+treeview_box_0_none+"'align='absmiddle'>"+str_f; else str_f="<imgsrc='"+treeview_box_0_line+"'align='absmiddle'>"+str_f; } str=str+str_f; str+="<imgid='box"+this.id+"'nodeid='"+this.id+"'src='"; switch(this.status.substring(0,2)){ case"10":str+=treeview_box_1_none;break; case"11":str+=treeview_box_1_close;break; case"12":str+=treeview_box_1_open;break; case"20":str+=treeview_box_2_none;break; case"21":str+=treeview_box_2_close;break; case"22":str+=treeview_box_2_open;break; } str+="'align='absmiddle'onclick='box_on_click(this)'>"; if(this.img=="") str+=this.img; else str+="<imgsrc='"+this.img+"'align='absmiddle'width='16'height='16'>"; str+="</td><td><tableborder='0'cellspacing='1'cellpadding='1'style='font-size:9pt;color:#333333'id='lablePanel"+this.id+"'><tr><tdondblclick='lable_on_dblclick("+this.id+")'onclick='lable_on_click("+this.id+")'style='cursor:hand'id='f_lablePanel"+this.id+"'nowrap>"+this.lable+"</td></tr></table></td></tr></table>"; document.all("preface"+this.id).innerHTML=str; document.all("tv_panel_"+this.id).innerHTML=""; for(m=0;m<this.subitems.length;m++) if(this.subitems[m]!=null){ userstack.put(m); this.subitems[m].show(); m=userstack.get(); } } functionnodeitem_remove(){ pparent=this.parent; if(pparent==null){ removenodeitem(this.id); for(variindocument.all){ if(document.all[i].tagName=="BODY") { document.all[i].innerHTML=""; break } } return; } lastsubitem=null; for(i=0;i<pparent.subitems.length;i++) if(pparent.subitems[i]!=null) if(pparent.subitems[i]==this) pparent.subitems[i]=null; else lastsubitem=pparent.subitems[i]; pparent.maxsubitem=lastsubitem; if(lastsubitem==null) pparent.status=pparent.status.substring(0,1)+"0"+pparent.status.substring(2,3); else pparent.maxsubitem.status="1"+pparent.maxsubitem.status.substring(1,3); removenodeitem(this.id); //addedbymsbformoveup/down arrTemp=newArray(); j=0; for(i=0;i<pparent.subitems.length;i++){ if(pparent.subitems[i]!=null){ arrTemp[j]=pparent.subitems[i]; j++; } } this.parent.subitems=arrTemp; //endadded pparent.refresh(); //tv_topnodeitem.refresh(); } functionremovenodeitem(id){ curitem=nodeitems[id]; nodeitems[id]=null; for(m=0;m<curitem.subitems.length;m++) if(curitem.subitems[m]!=null){ userstack.put(m); removenodeitem(curitem.subitems[m].id); m=userstack.get(); } } functionnodeitem_boxclick(){ if(this.status.substring(1,2)=="0") return; if(this.status.substring(1,2)=="1") this.open(); else this.close(); } functionnodeitem_close(){ this.status=this.status.substring(0,1)+"1"+this.status.substring(2,3); document.all("tv_panel_"+this.id).style.display="none"; eval("document.all('box'+this.id).src=treeview_box_"+this.status.substring(0,1)+"_close"); } functionnodeitem_open(){ this.status=this.status.substring(0,1)+"2"+this.status.substring(2,3); document.all("tv_panel_"+this.id).style.display=""; eval("document.all('box'+this.id).src=treeview_box_"+this.status.substring(0,1)+"_open"); } //addedbymsbforthemoveup/down nodeitem.prototype.moveUp=nodeitem_moveUp; nodeitem.prototype.moveDown=nodeitem_moveDown; //endadded nodeitem.prototype.show=nodeitem_show; nodeitem.prototype.refresh=nodeitem_refresh; nodeitem.prototype.boxclick=nodeitem_boxclick; nodeitem.prototype.close=nodeitem_close; nodeitem.prototype.open=nodeitem_open; nodeitem.prototype.remove=nodeitem_remove; nodeitem.prototype.setTag=nodeitem_setTag; nodeitem.prototype.getTag=nodeitem_getTag; //========================================================== //PublicMethods //========================================================== functionshowTV(){ tv_topnodeitem.show(); } functionfindNode(key){ pppp=null; for(i=0;i<nodeitems.length;i++){ if(nodeitems[i]!=null){ if(nodeitems[i].key==key){ pppp=nodeitems[i]; } } } returnpppp; } functionaddNode(parentkey,key,lable,img){ returnnewnodeitem(parentkey,key,lable,img); } functiondeleteNode(key){ curNode=findNode(key); if(curNode==null) returnfalse; curNode.remove(); returntrue; } //======END================ //=========================================================== //Events //=========================================================== functionbox_on_click(obj){ nodeitems[obj.nodeid].boxclick(); } tv_curlable=null; tv_curlable_f=null; functionlable_on_click(id){ key=nodeitems[id].key; if(nodeitems[id].parent==null) parentkey=""; else parentkey=nodeitems[id].parent.key; if(tv_curlable!=null){ tv_curlable.bgColor="transparent"; tv_curlable.style.color="#333333"; tv_curlable_f.bgColor="transparent"; } tv_curlable=document.all("lablePanel"+id); tv_curlable.bgColor="#000000"; tv_curlable.style.color="#FFFFFF"; tv_curlable_f=document.all("f_lablePanel"+id); tv_curlable_f.bgColor="#888888"; for(i=0;i<tv_listeners.length;i++) if(tv_listeners[i].type=="click"){ h=tv_listeners[i].handler; eval(h+"('"+key+"','"+parentkey+"');"); } } functionlable_on_dblclick(id){ key=nodeitems[id].key; if(nodeitems[id].parent==null) parentkey=""; else parentkey=nodeitems[id].parent.key; if(tv_curlable!=null){ tv_curlable.bgColor="transparent"; tv_curlable.style.color="#333333"; tv_curlable_f.bgColor="transparent"; } tv_curlable=document.all("lablePanel"+id); tv_curlable.bgColor="#000000"; tv_curlable.style.color="#FFFFFF"; tv_curlable_f=document.all("f_lablePanel"+id); tv_curlable_f.bgColor="#888888"; for(i=0;i<tv_listeners.length;i++) if(tv_listeners[i].type=="dblclick"){ h=tv_listeners[i].handler; eval(h+"('"+key+"','"+parentkey+"');"); } }
javascript调用
<scriptlanguage="javascript"> <!-- addNode(-1,0,"hehe","../images/top.gif"); addNode(0,1,"haha","../images/top.gif"); addNode(0,2,"haha","../images/top.gif"); addNode(1,3,"haha","../images/top.gif"); addNode(1,4,"haha","../images/top.gif"); addNode(2,5,"haha","../images/top.gif"); addNode(2,6,"haha","../images/top.gif"); showTV(); --> </script>
希望本文所述对大家JavaScript程序设计有所帮助。