對於樹的節點加載有兩種方法,一是同步全部加載,二是異步分批加載。
那么我們什么時候該用同步全部加載,什么時候該用異步分批加載呢?。當我們要顯示的樹節點不是很多的時候,應首選同步全部加載。如果我們有很多的節點要加載,並且加載時間非常的慢,這時候我們要選擇異步分批加載。如果這時還用同步全部加載的話,頁面加載的速度會很慢,如果數據足夠多會造成頁面假死現象。凡事不能說的太死,也要根據自己的實際情況來判定到底用那種方法合適。
下面介紹具體的應用,我先簡述一下項目的架構,此test,用的是javaee開發的,主要是jsp和Servlet,這里沒有數據庫,都是一些假數據。
首先同步全部加載,因為要在js里面去后台獲取節點數據,所有我用了ajax,但是是同步的不是異步的,json數據的格式[{id:’1’,pid:’0’,name:’1’},…………]。主頁面index.jsp. 我只說js代碼,剩下的我相信大家能領會的看代碼
1 var zTreeObj; 2 var zNodes; 3 var setting = { 4 check: { 5 enable: true, 6 chkStyle:"checkbox" 7 }, 8 data: { 9 simpleData: { 10 enable: true 11 } 12 } 13 };
這是設置樹的屬性值,在上一篇文章已經結束,在這不多廢話了,代碼中zTreeObj是定義的一個樹的全局變量。zNodes是保存樹節點的json對象。繼續看
1 $(document).ready(function(){ 2 $.ajax({ 3 type: "Get", 4 url: 'GetTree', 5 dataType: "text", 6 global: false, 7 async: false, 8 success: function (strReult) { 9 zNodes=eval(strReult); 10 }, 11 error: function () { 12 alert("Ajax請求數據失敗!"); 13 } 14 }); 15 zTreeObj = $.fn.zTree.init($("#treeDemo"), setting, zNodes); 16 $("#submit").bind('click',getNodeValue); 17 });
上面不難看出我是用ajax同步的方法去后台獲取數據的,其中 9行是把獲取的數據轉換成json對象在賦值給zNodes, 此時zNodes已經有數據了,第15 行是初始化樹,傳進三個參數,分別是 html對象,setting樹屬性,zNodes json數據。這行執行完樹就在id為treeDemo的地方顯示出來了。
其實樹就是拿來用的嗎,那么當被選中的節點如何才能傳到后台給java程序用呢,我的辦法是這樣的看代碼。
第16行按鈕綁定一個click
1 function getNodeValue (){ 2 var nodes = zTreeObj.getCheckedNodes(); 3 var s = '';//選中節點ids 4 //遍歷選中的節點,為s賦值 5 for(var i=0; i<nodes.length; i++){ 6 var isParent = nodes[i].isParent; 7 if(isParent!=true){ 8 if (s != '')s += ','; 9 s += nodes[i].id; 10 } 11 } 12 $("#content").val(s); 13 }
但你選中復選框是按下按鈕,通過這個方法就可以獲取到葉子節點的信息,id pid name 等信息。把想獲取的信息放到id為content的容器里,在用from傳到后台,這樣就后台就可以用到前台傳來的信息了。
樹全部加載節點就介紹到這,下面我們來介紹怎樣異步加載節點,看代碼
1 var zTreeObj; 2 var setting = { 3 check: { 4 enable: true, 5 chkStyle:"checkbox" 6 }, 7 async: { 8 enable: true, 9 url:"ShowTree", 10 autoParam:["id", "name=n"], 11 otherParam:{"otherParam":"zTreeAsyncTest"}, 12 dataFilter: filter 13 } 14 }; 15 16 function filter(treeId, parentNode, childNodes) { 17 if (!childNodes) return null; 18 for (var i=0, l=childNodes.length; i<l; i++) { 19 childNodes[i].name = childNodes[i].name.replace(/\.n/g, '.'); 20 } 21 return childNodes; 22 } 23 function setContentValue(){ 24 var nodes = zTreeObj.getCheckedNodes(); 25 var s = '';//選中節點ids 26 //遍歷選中的節點,為s賦值 27 for(var i=0; i<nodes.length; i++){ 28 var isParent = nodes[i].isParent; 29 30 if (s != '')s += ','; 31 s += nodes[i].id; 32 33 } 34 $("#content").val(s); 35 } 36 37 $(document).ready(function(){ 38 zTreeObj = $.fn.zTree.init($("#treeDemo"), setting); 39 });
上面的代碼作用就是當你點擊某一父節點是他會從后台獲取其子節點並加載到樹里,這就是異步加載樹節點的代碼,同步加載數據看懂了,這個異步加載樹節點自然就通了,我就不再多廢話了。
下面是異步分批獲取節點用到的java Servlet的dopost方法看代碼
1 public void doPost(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 String pId = "0"; 4 String pName = ""; 5 if(null!=request.getParameter("id")) 6 pId = request.getParameter("id"); 7 if(null!=request.getParameter("n")) 8 pName =request.getParameter("n"); 9 if (pId==null || pId=="") pId = "0"; 10 if (pName==null) pName = ""; 11 StringBuffer ss = new StringBuffer("["); 12 for (int i=1; i<5; i++) { 13 String nId = pId+i; 14 String nName = pName+"n"+i; 15 ss.append("{ id:'"+nId+"', name:'"+nName+"', isParent:true}"); 16 if (i<4) { 17 ss.append(","); 18 } 19 } 20 ss.append("]"); 21 response.getWriter().write(ss.toString()); 22 }
從這個類里面可以看出我需要json的數據結構,其實我這個test寫的漏洞很多,我只是想展示一下怎么用這個ztree。至於其他的大家在用的自己可以完善。