您好朋友,感謝您關(guān)注xiaosilent,我在blogjava的博客已經(jīng)停止更新,請(qǐng)?jiān)L問(wèn)http://kuan.fm了解我的最新情況,謝謝!
          隨筆-82  評(píng)論-133  文章-0  trackbacks-0

          沒(méi)想到有這么多的朋友關(guān)注的dTree,過(guò)幾天在我的新博客http://www.xiaosilent.com再發(fā)表一些關(guān)于dTree的文章,并會(huì)將本文中的例子修正好放出來(lái),和大家互相學(xué)習(xí)。

          由于最近收到不少朋友發(fā)來(lái)mail反應(yīng)demo不能運(yùn)行的問(wèn)題,在這里再次提請(qǐng)各位看官注意:本文處提供下載的dtree不能直接運(yùn)行,需要修改其中onreadystatechange 的具體實(shí)現(xiàn)? By xiaosilent 2007/11/20

          ?????? 由于手上的項(xiàng)目要用到目錄樹來(lái)顯示分類信息,于是有機(jī)會(huì)了解了一下常用的目錄樹。Google了一下,結(jié)果并不是很多。最后圈定了dTree。因?yàn)樗墓δ懿蝗酰褂靡策€是很方便的,但是dTree原來(lái)是一次性加載的,不能動(dòng)態(tài)添加節(jié)點(diǎn)。但是,只要稍作修改,還是可以實(shí)現(xiàn)的。

          首先來(lái)看看 dTree 到底是什么樣的。
          http://www.destroydrop.com/javascripts/tree/下載回dtree.zip,整個(gè)壓縮包15K不到,可謂是相當(dāng)苗條的了。解壓開(kāi),里面有一個(gè)名為img的文件夾,兩個(gè)html文件和一個(gè)dtree.js以及dtree.css。我們需要關(guān)注的是example01.html文件和dtree.js兩個(gè)文件。

          關(guān)于dTree是如何工作的,這點(diǎn)我就不再贅述了。

          看 dtree.js 里面的一小段代碼

          // ?Adds?a?new?node?to?the?node?array

          dTree.prototype.add?
          = ? function (id,?pid,?name,?url,?title,?target,?icon,?iconOpen,?open)? {

          ????
          this .aNodes[ this .aNodes.length]? = ? new ?Node(id,?pid,?name,?url,?title,?target,?icon,?iconOpen,?open);

          }
          ;

          // ?Outputs?the?tree?to?the?page

          dTree.prototype.toString?
          = ? function ()? {

          ????
          var ?str? = ?' < div?class = " dtree " > \n';

          ????
          if ?(document.getElementById)? {

          ????????
          if ?( this .config.useCookies)? this .selectedNode? = ? this .getSelected();

          ????????str?
          += ? this .addNode( this .root);

          ????}
          ? else ?str? += ?'Browser?not?supported.';

          ????str?
          += ?' </ div > ';

          ????
          if ?( ! this .selectedFound)? this .selectedNode? = ? null ;

          ????
          this .completed? = ? true ;

          ????
          return ?str;

          }
          ;
          節(jié)點(diǎn)通過(guò)其add方法添加到目錄樹,而目錄樹是通過(guò)調(diào)用其 toString() 輸出到頁(yè)面,所有節(jié)點(diǎn)數(shù)據(jù)都保存在一個(gè)名為aNodes的數(shù)組里,隨著程序的運(yùn)行,數(shù)組里的數(shù)據(jù)會(huì)隨之而發(fā)生變化,然而,要實(shí)現(xiàn)動(dòng)態(tài)添加節(jié)點(diǎn),就必須要保持原有的數(shù)據(jù)不變,這點(diǎn),我們可以通過(guò)再添加一個(gè)數(shù)組來(lái)解決。讓 add方法把數(shù)據(jù)添加到一個(gè)數(shù)組里,并讓該數(shù)組的數(shù)據(jù)保持不變。而在toString方法里可以看到對(duì)addNode方法的調(diào)用,我們通過(guò)對(duì)該方法的修改,讓其操縱另外的一個(gè)數(shù)組而不是add方法添加數(shù)據(jù)的那個(gè)。然后,再添加一個(gè)新方法,在該方法里完成將add方法操縱的數(shù)組內(nèi)數(shù)據(jù)復(fù)制到另一數(shù)組的操作。修改toString方法,讓其獲取一個(gè)容器,并把str寫入該容器。再添加一個(gè)getChildren方法,用來(lái)獲取一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn),并根據(jù)該節(jié)點(diǎn)是否有子節(jié)點(diǎn)而變化其圖標(biāo)。

          修改后的 dtree.js 如下(僅 修改的部分)
          /*--------------------------------------------------

          ????dTree?2.05?|?www.destroydrop.com/javascript/tree/

          ????Rewrited?by?xiaosilent@gmail.com?,?xiangdingdang.com

          ????Last?updated?at?2007-4-28?16:32:05

          ????
          ---------------------------------------------------
          */




          /**
          *?dTree??
          *
          *?Edited?by?xiaosilent.
          *?
          *?objName:?name?of?dTree?object?.?Create?your?dTree?object?like?this???tree=new?dTree('tree',*,*);
          *?targetID:?the?id?of?your?container,which?you?used?to?display?the?tree
          *?type:?which?kind?of?category?are?you?doing?with???It?must?be?one?of?these??"goods"?,?"vendor"?and?"consumer"?
          *
          */

          function?dTree(objName,targetID,type)?{
          ???
          ????
          this.config?=?{
          ????????
          ????????target????????????????????:?
          null,
          ????????
          ????????
          //?xiaosilent?changed?it?to?be?false.
          ????????folderLinks????????????:?false,

          ????????useSelection????????:?
          true,
          ????????
          ????????
          ????????
          ????????

          ????}

          ????????
          ????
          //?xiaosilent?changed?this?to?his?own?path.
          ????this.icon?=?{
          ????
          ????
          ????
          ????}
          ;
          ????

          ????
          this.obj?=?objName;

          ????
          this.aNodes?=?[];
          ????
          ????
          //?add?by?xiaosilent.?
          ????this.aNodesData=[];????//This?array?save?the?original?data?all?the?time.
          ????this.targetID=targetID||'dtree';????//?Tree?will?be?displayed?in?this?container.
          ????this.type=type;????//?Saves?the?type?of?tree??goods/vendor/consumer?
          ????

          ????
          this.aIndent?=?[];

          ????
          this.root?=?new?Node(-1);

          ????
          this.selectedNode?=?null;

          ????
          this.selectedFound?=?false;

          ????
          this.completed?=?false;

          }
          ;


          //?Adds?a?new?node?to?the?node?array
          dTree.prototype.add?=?function(id,?pid,?name,?url,?title,?target,?icon,?iconOpen,?open)?{
          ????
          ????
          //?Add?by?xiaosilent.
          ????this.completed?=?false;
          ????
          ????
          this.aNodesData[this.aNodesData.length]?=?new?Node(id,?pid,?name,?url,?title,?target,?icon,?iconOpen,?open);

          }
          ;


          //?Add?by?xiaosilent?.
          //
          ?get?child?nodes?from?web?server?via?AJAX?automatically?
          //
          ?pid?:?parentID.
          dTree.prototype.getChildren?=?function(pid){
          ????
          ????
          var?ajax?=?null;

          ????
          if?(window.ActiveXObject)?{
          ????
          ????????
          try{
          ????????
          ????????????ajax?
          =?new?ActiveXObject("Microsoft.XMLHTTP");
          ????????????
          ????????}
          catch(e){
          ????????
          ????????????alert(
          "創(chuàng)建Microsoft.XMLHTTP對(duì)象失敗,AJAX不能正常運(yùn)行.請(qǐng)檢查您的瀏覽器設(shè)置.");
          ????????}

          ????????
          ????}
          ?else?{
          ????
          ????????
          if?(window.XMLHttpRequest)?{
          ????????????
          ????????????
          try{
          ????????????????
          ????????????????ajax?
          =?new?XMLHttpRequest();
          ????????????????
          ????????????}
          catch(e){
          ????????????
          ????????????????alert(
          "創(chuàng)建XMLHttpRequest對(duì)象失敗,AJAX不能正常運(yùn)行.請(qǐng)檢查您的瀏覽器設(shè)置.");
          ????????????}

          ????????????
          ????????}

          ????}

          ????
          ????
          //?This?usr?is?just?for?my?Sales?Management?System.?This?responses?id,name,childCount|id,name,childCount.
          ????var?url?="/servlet/category?action=getChildren&parentID="?+?pid?+"&type="?+?this.type;
          ????
          ????
          var?tree=this;
          ????
          ????ajax.onreadystatechange?
          =?function?()?{
          ????
          ????????
          if?(ajax.readyState?==?4&&ajax.status?==?200)?{
          ????????????
          ????????????
          if(ajax.responseText=="false")?return;
          ????????????
          ????????????
          var?categories=ajax.responseText.split('|');
          ????????????
          ????????????
          for(var?i=0;i<categories.length;i++){
          ????????????
          ????????????????
          var?aCat?=?categories[i].split(',');
          ????????????????
          ????????????????
          if(aCat.length==3){
          ????????????????????
          ????????????????????
          var?id=aCat[0];
          ????????????????????
          var?name=aCat[1];
          ????????????????????
          var?childCount=aCat[2];
          ????????????????????
          ????????????????????
          if(childCount>0){
          ????????????????????????
          ????????????????????????tree.aNodesData[tree.aNodesData.length]
          =new?Node(id,?pid,?name,?"javascript:"+tree.obj+".getChildren("+id+")",?"點(diǎn)擊獲取其子類",'',tree.icon.folder);
          ????????????????????????
          ????????????????????}
          else{
          ????????????????????????
          ????????????????????????tree.aNodesData[tree.aNodesData.length]
          =new?Node(id,?pid,?name,?"javascript:"+tree.obj+".showCategory("+id+")",?"點(diǎn)擊獲取詳請(qǐng)");
          ????????????????????????
          ????????????????????}

          ????????????????}

          ????????????}

          ????????????
          ????????????tree.show();
          ????????}

          ????????
          ????}
          ;
          ????
          ????ajax.open(
          "POST",url);
          ????ajax.setRequestHeader(
          "Content-Type","application/x-www-form-urlencoded");
          ????ajax.send(
          null);
          ????
          }


          //?Add?by?xiaosilent.
          //
          ?Call?to?show?the?tree.
          dTree.prototype.show?=?function(){
          ????
          ????
          //?Renew?the?two?array?to?save?original?data.
          ????this.aNodes=new?Array();
          ????
          this.aIndent=new?Array();

          ????
          //?Dump?original?data?to?aNode?array.
          ????for(var?i=0?;?i<this.aNodesData.length?;?i++){
          ????????
          ????????
          var?oneNode=this.aNodesData[i];

          ????????
          this.aNodes[i]=new?Node(oneNode.id,oneNode.pid,oneNode.name,oneNode.url,oneNode.title,oneNode.target,oneNode.icon,oneNode.iconOpen,oneNode.open);
          ????}

          ????
          ????
          this.rewriteHTML();
          }




          //?Outputs?the?tree?to?the?page?,?callled?by?show()
          //
          ?Changed?by?xiaosilent.
          //
          ?Renamed?dTree.prototype.toString?to?this.
          dTree.prototype.rewriteHTML?=?function()?{

          ????
          var?str?=?'';
          ????
          ????
          //?Added?by?xiaosilent.?
          ????var?targetDIV;
          ????targetDIV
          =document.getElementById(this.targetID);
          ????
          ????
          if(!targetDIV){
          ????????
          ????????alert('dTree?can\'t?find?your?specified?container?to?show?your?tree.\n\n?Please?check?your?code
          !');

          ????????
          return;
          ????}

          ????
          ????
          if?(this.config.useCookies)?this.selectedNode?=?this.getSelected();
          ????
          ????str?
          +=?this.addNode(this.root);
          ????????

          ????
          //?Disabled?by?xiaosilent.
          ????//????str?+=?'</div>';

          ????
          if?(!this.selectedFound)?this.selectedNode?=?null;

          ????
          this.completed?=?true;

          ????
          ????
          //?Disabled?and?added?by?xiaosilent.
          ????//return?str;
          ????targetDIV.innerHTML=str;

          }
          ;

          //?Highlights?the?selected?node

          dTree.prototype.s?
          =?function(id)?{
          ????

          ????
          if?(!this.config.useSelection)?return;

          ????
          var?cn?=?this.aNodes[id];

          ????
          if?(cn._hc?&&?!this.config.folderLinks)?return;
          ????
          ????
          //?Disabled?by?xiaosilent.

          }
          ;

          最后,客戶端可以通過(guò)以下方式調(diào)用
          <div?class="dtree"?id="dtree1">

          ????
          <script?type="text/javascript">

          ????????d?
          =?new?dTree('d',"dtree1",'goods');

          ????????d.add(
          0,-1,'點(diǎn)擊展開(kāi)商品分類信息',"javascript:d.getChildren(0)");
          ????????
          ????????d.show();


          ????
          </script>

          </div>
          甚至可以在同一個(gè)頁(yè)面里同時(shí)存在多個(gè)的tree,只要指定不同的容器,和創(chuàng)建不同的dtree對(duì)象即可。如:
          <div?class="dtree"?id="dtree2">

          ????
          <script?type="text/javascript">

          ????????w?
          =?new?dTree('w',"dtree2",'consumer');

          ????????w.add(
          0,-1,'點(diǎn)擊展開(kāi)客戶分類信息',"javascript:w.getChildren(0)");
          ????????
          ????????w.show();


          ????
          </script>

          </div>

          <div?class="dtree"?id="dtree3">

          ????
          <script?type="text/javascript">

          ????????z?
          =?new?dTree('z',"dtree3",'vendor');

          ????????z.add(
          0,-1,'點(diǎn)擊展開(kāi)商家分類信息',"javascript:z.getChildren(0)");
          ????????
          ????????z.show();


          ????
          </script>

          </div>



          這樣,雖然實(shí)現(xiàn)了節(jié)點(diǎn)的動(dòng)態(tài)添加,但是,由于每次都要復(fù)制一次數(shù)組,程序執(zhí)行的效率不高,期待更好的實(shí)現(xiàn)。

          示例下載?需要有服務(wù)器提供正確的返回值才能正常運(yùn)行……
          posted on 2007-04-28 16:54 xiaosilent 閱讀(17598) 評(píng)論(17)  編輯  收藏 所屬分類: Java相關(guān)

          評(píng)論:
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2007-04-29 08:52 | 祎恬凡
          把你做出來(lái)的東西,代碼共享一下。  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2007-04-29 09:44 | xiaosilent
          已經(jīng)添加到隨筆尾部……  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2007-07-22 06:47 | huangdeh
          你好,如何實(shí)現(xiàn)“需要有服務(wù)器提供正確的返回值才能正常運(yùn)行”?

          謝謝  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2007-08-14 23:30 | dajay
          是的
          我們項(xiàng)目中也用了dtree感覺(jué)不錯(cuò)
          我現(xiàn)在也需要修改
          但是我們項(xiàng)目比較大
          每次都是在服務(wù)器端全部生成 推到客戶端
          在壓力測(cè)試中 直接承受不了
          我也想修改dtree 所以看到你的
          感覺(jué)這個(gè)dtree還是不是很適合做動(dòng)態(tài)的 感覺(jué)效率太低
          我的想法跟你一樣。我先下了看看
          有好的想法在 留言給你
          你有什么好的想法也可以mail我
          dajay520@sina.com
            回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2007-11-20 16:28 | xiaosilent
          請(qǐng)各位看官注意:本文處提供下載的dtree不能直接運(yùn)行,需要修改其中onreadystatechange 的具體實(shí)現(xiàn)  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2007-11-21 15:09 | somad
          @xiaosilent
          能說(shuō)一下具體怎么修改嗎?  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2007-11-28 11:23 | xiaosilent
          參考一下原來(lái)的onreadystatechange 相信修改起來(lái)不難。 問(wèn)題關(guān)鍵還是在于和服務(wù)器端返回值進(jìn)行配合。  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2008-02-29 11:53 | 賴皮熊
          xiaosilent:你太有才了,非常感謝你的文章,我的動(dòng)態(tài)目錄樹在你文章的指導(dǎo)下終于出來(lái)了,特此感謝!!!!!!!!!!!!!  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2008-06-25 15:52 | 馬新良
          tree.aNodesData[tree.aNodesData.length]=new Node(id, pid, name, "javascript:"+tree.obj+".getChildren("+id+")", "點(diǎn)擊獲取其子類",'',tree.icon.folder);
          朋友,你這行有問(wèn)題 ,原代碼里面你改過(guò)dTree 的Node方法嗎?如果沒(méi)改,你這里應(yīng)該 是錯(cuò)的,如果改了,你該寫出來(lái)是怎么改的啊?不過(guò)我按著你的方法搞定了,你這一行搞了我好長(zhǎng)時(shí)間呢。  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加[未登錄](méi) 2008-09-10 11:41 | bill
          @賴皮熊
          到底怎么改啊,能說(shuō)一下嗎?  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加[未登錄](méi) 2008-09-10 11:47 | bill
          誰(shuí)能告訴我一下,由于我們的這個(gè)項(xiàng)目是在一期的基礎(chǔ)上改造的,這些Dtree不太熟悉,我的郵箱是fanbing1121@163.com  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2008-10-08 16:00 | 藍(lán)拖
          QQ:181202585 加我吧~!有些東西想請(qǐng)教您~!  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2008-12-29 13:29 | frog
          有修改. 在add()方式中  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2009-09-27 09:04 | rachael
          想你那樣添加樹了
          也實(shí)現(xiàn)了動(dòng)態(tài)獲取節(jié)點(diǎn)的方法
          唯一都問(wèn)題是打開(kāi)樹獲取節(jié)點(diǎn)的時(shí)候
          樹失去焦點(diǎn)了
          alert這個(gè)節(jié)點(diǎn)的id為null
          請(qǐng)問(wèn)這怎樣解決?  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加[未登錄](méi) 2009-10-18 23:47 | king
          節(jié)點(diǎn)多的話,效率很低!!!每次動(dòng)態(tài)獲取后都要重新生成樹!!  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2011-02-19 11:53 | 訪問(wèn)
          這樣應(yīng)該只是修改了他的顯示方式,但最終數(shù)據(jù)還是全部加載了,關(guān)鍵還是從數(shù)據(jù)的動(dòng)態(tài)加載考慮啊  回復(fù)  更多評(píng)論
            
          # re: 修改 dTree , 實(shí)現(xiàn)節(jié)點(diǎn)的動(dòng)態(tài)添加 2013-04-27 10:21 | 小東北
          我更據(jù)你的給的代碼,怎么在前臺(tái)不顯示啊  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 齐齐哈尔市| 花莲县| 盘锦市| 卫辉市| 新泰市| 永平县| 边坝县| 华阴市| 营山县| 黔西| 丹巴县| 宾川县| 佛冈县| 共和县| 余姚市| 武强县| 济源市| 呼伦贝尔市| 都昌县| 和顺县| 宁乡县| 从江县| 卢龙县| 菏泽市| 南川市| 冀州市| 胶南市| 荆州市| 鲁甸县| 鸡泽县| 娄底市| 贺州市| 吉林省| 义乌市| 福鼎市| 涪陵区| 吉隆县| 兴文县| 云霄县| 鸡东县| 吉木乃县|