參考博客:javascript
https://segmentfault.com/a/1190000004657854php
https://blog.csdn.net/houpengfei111/article/details/8696436css
https://blog.csdn.net/qq_36785111/article/details/78873488html
這裏思路是:java
先異步加載全部節點,同時判斷全部節點是否異步加載完畢,若是全部節點所有加載完畢時設置搜索按鈕可點擊;node
搜索方法根據全部節點進行模糊查詢getNodesByParamFuzzy,而後將查找到的節點和其全部父節點顯示,其餘節點隱藏;jquery
代碼:web
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="resources/zTreeStyle/zTreeStyle.css" type="text/css"> <link rel="stylesheet" type="text/css" href="resources/bootstrap/bootstrap.min.css"> <title>index</title> </head> <body> <div class="container"> <h4>Ztree異步加載使用例子</h4> <input type="text" id="search" /> <input type="button" id="btn" value="搜素" onclick="search()"/> <ul id="zTree" class="ztree"></ul> </div> </body> <script src="resources/js/jquery.min.js"></script> <script type="text/javascript" src="resources/js/jquery.ztree.all.min.js"></script> <script type="text/javascript" src="resources/js/jquery.ztree.exhide.min.js"></script> <script type="text/javascript"> var setting = { async: { enable: true, url:"asyncGetNodes", autoParam:["id", "pid", "name"], dataFilter: filter }, data:{ simpleData:{ enable: true, idKey:'id', pIdKey:'pid', rootPId: 0 } }, view:{ showIcon: false }, callback: { onAsyncSuccess:onAsyncSuccess } }; $(document).ready(function(){ initZTree(); }); /** * 節點加載完的回調函數,加載方式依舊是分批加載,可是不是等用戶展開節點纔去加 * 載,而是讓它自動完成加載,這裏很差的地方是依舊要加載所有數據,因此必須等待 * 它加載完才能使用搜索功能 */ function onAsyncSuccess(event, treeId, treeNode, msg) { //console.log('success'); var zTreeObj = $.fn.zTree.getZTreeObj(treeId); var nodes = zTreeObj.transformToArray(zTreeObj.getNodes()); for (var i = 0; i < nodes.length; i++) { // 判斷節點是否已經加載過,若是已經加載過則不須要再加載 if (!nodes[i].zAsync) { zTreeObj.reAsyncChildNodes(nodes[i], 'refresh', true); } } } function filter(treeId, parentNode, childNodes) { return childNodes; } //初始化樹 function initZTree(){ $.ajax({ url:"asyncGetNodes", type:"post", dataType: "json", success: function(data){ console.log(data); var zTreeObj = $.fn.zTree.init($("#zTree"),setting, data); //讓第一個父節點展開 var rootNode_0 = zTreeObj.getNodeByParam('pid',0,null); zTreeObj.expandNode(rootNode_0, true, false, false, false); console.log('expended'); //搜索按鈕不可用 $('#btn').attr('disabled','disabled'); zTreeAsyncReady('zTree',function(){ console.log('已經所有加載完了'); $('#btn').removeAttr('disabled','disabled'); }); }, error: function(){ } }); } //判斷樹節點是否已經所有加載完 function zTreeAsyncReady(treeId, f){ var zTreeObj = $.fn.zTree.getZTreeObj(treeId); zTreeAsyncReady.timer = setInterval(function(){ var nodes = zTreeObj.getNodesByFilter(function(node) { return !node.zAsync; }); if(nodes.length==0){ clearInterval(zTreeAsyncReady.timer); zTreeAsyncReady.timer == null; zTreeAsyncReady.done = true; } console.log('沒執行完'); if (zTreeAsyncReady.done) { f(); } },100); } /** * 搜索方法 */ function search(){ var treeObj = $.fn.zTree.getZTreeObj('zTree'); var value = $.trim($('#search').val()); if(value == ""){ var hides = treeObj.getNodesByParam("isHidden", true); //顯示全部隱藏節點 treeObj.showNodes(hides); return; } //查找節點 var nodes = treeObj.getNodesByParamFuzzy('name', value); if(nodes.length==0){ alert('未搜索到數據!'); return; } //隱藏全部節點 var all = treeObj.transformToArray(treeObj.getNodes()); for (var i = 0; i < all.length; i++) { treeObj.hideNode(all[i]); } //展現查找到的節點 for (var i = 0; i < nodes.length; i++) { treeObj.showNode(nodes[i]);//顯示查到節點 var parentNodes = []; getParentsNode(nodes[i], parentNodes); treeObj.showNodes(parentNodes); ////顯示其全部父節點 treeObj.expandAll(true);//展開全部查詢到的內容 } } /** * 獲取全部節點的父節點 */ function getParentsNode(node, array){ var parentNode = node.getParentNode(); if(parentNode!=null){ array.push(parentNode); getParentsNode(parentNode, array); } return; } </script> </html>
後臺異步加載節點的代碼:僅僅是模擬使用的;很簡單的模擬:ajax
package com.cy.controller; import java.util.ArrayList; import java.util.List; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.alibaba.fastjson.JSON; import com.test.model.Node; @Controller public class ZtreeController { @RequestMapping("/asyncGetNodes") @ResponseBody public List<Node> asyncGetNodes(String id, String pid, String name) throws Exception{ List<Node> nodeList = new ArrayList<Node>(); if(id==null){ nodeList.add(new Node("1","0","硬件規格","false","true")); nodeList.add(new Node("2","0","軟件規格","false","true")); return nodeList; } if(id.equals("1")){ nodeList.add(new Node("10","1","單板","false","true")); nodeList.add(new Node("11","1","子卡","false","true")); nodeList.add(new Node("12","1","設備","false","true")); }else if(id.equals("2")){ nodeList.add(new Node("20","2","java","false","true")); nodeList.add(new Node("21","2","jscript","false","true")); nodeList.add(new Node("22","2","php","false","true")); }else if(id.equals("10")){ nodeList.add(new Node("100",id,"單板_00","false","true")); nodeList.add(new Node("101",id,"單板_00","false","false")); }else if(id.equals("100")){ nodeList.add(new Node("1000",id,"單板_00_00","false","false")); } Thread.sleep(1000); return nodeList; } }
若是有更好的ztree異步搜索的方法,歡迎大夥留言。不勝感激!!spring
效果: