<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        jQuery zTree搜索-關鍵字查詢 遞歸無限層功能實現代碼

        來源:懂視網 責編:小采 時間:2020-11-27 22:21:12
        文檔

        jQuery zTree搜索-關鍵字查詢 遞歸無限層功能實現代碼

        jQuery zTree搜索-關鍵字查詢 遞歸無限層功能實現代碼: 嘮叨一哈 前兩天朋友跟我說要一個ztree的搜索功能,我劈頭就是一巴掌:這種方法難道無數前輩還做少了?自己去找,我很忙~然后我默默地蹲著寫zTree的搜索方法去了。為什么呢?因為我說了句找不到是不可能的啊,肯定有很多人早做了無數了,找不到我給你寫還
        推薦度:
        導讀jQuery zTree搜索-關鍵字查詢 遞歸無限層功能實現代碼: 嘮叨一哈 前兩天朋友跟我說要一個ztree的搜索功能,我劈頭就是一巴掌:這種方法難道無數前輩還做少了?自己去找,我很忙~然后我默默地蹲著寫zTree的搜索方法去了。為什么呢?因為我說了句找不到是不可能的啊,肯定有很多人早做了無數了,找不到我給你寫還

         嘮叨一哈

          前兩天朋友跟我說要一個ztree的搜索功能,我劈頭就是一巴掌:這種方法難道無數前輩還做少了?自己去找,我很忙~然后我默默地蹲著寫zTree的搜索方法去了。為什么呢?因為我說了句“找不到是不可能的啊,肯定有很多人早做了無數了,找不到我給你寫還請你恰午飯”,然而我也去找了很久也沒有找到(淚崩,我的計劃,我的午飯~)。絕大多數都是用的API里面的getNodesByParamFuzzy()或者高亮之類的。然而朋友表示需求不符合:1. 匹配失敗父節點也隱藏;2.能自定義匹配規則,即能匹配name還能匹配屬性......(反正就是我想要的不是辣個,小生臉上笑嘻嘻,心里.......那我給你寫唄~),下面進入正文:

        思維導圖

          

          一般搜索功能只是在“既定范圍內(方便稱呼)”匹配關鍵字,“既定范圍”即我們已經知道搜索的范圍:比如說一個文本庫,一個下拉框,換而言之我們匹配的對象集大小已經確定了。然而這一點在ztree上不可行,為什么呢?在我考慮了一下ztree搜索功能實現邏輯的時候問了一句:那啥,這棵樹的層級是固定的嗎?還是說不確定有多少層?老哥看著我會心一笑:你按無限層來寫~小生小腿肚子一抽。因為樹的層級不確定,所以搜索范圍不確定,舉個栗子:目標節點匹配成功,如果這個節點是子節點,那么它的父節點也應該是顯示的,然后它父節點的父節點也應該是顯示的,然后它父節點的父節點的父節點的...Orz...這仿佛永遠寫不到盡頭了...沒辦法,只能:遞歸,找到目標節點的所有父節點和子節點。

        邏輯關鍵點

          在上面的思維導圖中我大致列出了邏輯,目標節點在什么情況下顯示,什么情況下隱藏,這是我們必須清楚的關鍵點,下面我們具體看下目標節點存在的情況:

          

          到了這里,相信對于如何實現滿足我們需求的搜索功能開發,已經能做到了然于心了,剩下的只是實現的方法,然而這完全不是事~(小生竊以為真正讓人憂心的理不清功能的流程,至于實現方法你們都懂的吧?0.0..)

        關于樹節點

          要完成上述流程中各種方法,我們需要知道樹節點的一系列屬性,我們都知道有api這種神器,然而api有一個特點就是齊全(齊全得我們想精確的找到某一個屬性或者方法時可能得一頓好找),這里我們想要的是如何快速得到自己想要的屬性或者方法,我們在控制臺打印出樹節點集合: 

         var treeObj=$.fn.zTree.getZTreeObj("homeTree"); // 設置根節點
         var node = treeObj.getNodes(); // 獲取根節點
         var nodes = treeObj.transformToArray(node); // 獲取所有節點
         console.log(nodes); 

           看圖:我們能看到所有節點,其中有id,name等各種屬性

          再看圖:我們能看到任意節點的各種屬性,有我們想要的子節點集合 childern,父節點屬性 isParent ,節點id tId,父節點id parentTid...

        萬事俱備,動手

          下面看一下相關方法,很多小細節需要在真正編碼過程中才能發現,這里為了方便展示就直接列舉方法了。

          聲明備用數組:

        // 地區搜索
         var parentArray = [];
         var childArray = [];

           遞歸獲取目標節點父節點集合:

         // 遞歸獲取目標節點所有父節點
         function getParentsNode(treeNode){
         var thisParentNode = treeNode.getParentNode(); //得到該節點的父節點
         if( thisParentNode != null ){ // 父節點存在
         parentArray.push(thisParentNode); // 儲存至數組
         getParentsNode(thisParentNode); // 重調 
         }else{
         return false;
         } 
         }

           遞歸獲取目標節點子節點集合:

         // 遞歸獲取目標節點所有子節點
         function getChildrenNode(treeNode){
         var thisIsParent = treeNode.isParent; // 獲取目標節點 isParent 屬性,判斷是否為父節點
         if( thisIsParent == true ){
         var thisChildrenNode = treeNode.children; // 得到該節點的子節點集合
         for(var i=0;i<thisChildrenNode.length;i++){
         childArray.push(thisChildrenNode[i]); // 將該子節點加入數組中
         getChildrenNode(thisChildrenNode[i]); // 重調 
         }
         }else{
         return false;
         }
         }

           這里建議將匹配節點部分摘出來單獨寫一個方法,方便進行拓展匹配規則,這里我們假設除了匹配name還需要匹配節點的 entity_code 屬性:

         //匹配節點
         function matchNode(treeNode,num){
         var inputArea = $("input[name='searchArea']");
         var name = treeNode.name;
         var entityCode = treeNode.entity_code|| '';
         var val = inputArea.val(); // 獲取檢索值
         var numName = name.indexOf(val);
         var numCode = entityCode.indexOf(val);
         var num = -1;
         if( numName != -1 || numCode !=-1 ){
         num = 1;
         }
         if( numName == -1 && numCode == -1 ){
         num = -1; 
         }
         return num;
         }

           節點匹配成功方法:

         // 節點匹配成功
         function checkTrueArray(arr,treeNode){
         var thisTid = treeNode.tId;
         var thisLi = $("#"+thisTid);
         for(var n=0;n<arr.length;n++){
         var thisNodeId = arr[n].tId;
         var thisNodeLi = $("#"+thisNodeId);
         thisLi.show();
         thisNodeLi.show();
         }
         }

           節點匹配失敗方法:

         // 節點匹配失敗
         function checkFalseArray(arr,treeNode){
         var result = [];
         var result2 = [];
         var thisTid = treeNode.tId;
         var thisLi = $("#"+thisTid);
         var val = inputArea.val(); // 獲取檢索值
         var thisParent = treeNode.getParentNode(); // 獲取目標節點父節點
         if( thisParent != null ){ // 有父節點
         var thisBrotherArr = treeNode.getParentNode().children; // 得到包含自身的兄弟數組
         for(var m=0;m<arr.length;m++){ // 匹配父節點
         var num = matchNode(arr[m]);
         if( num != -1 ){
         result.push(arr[m]);
         }
         }
         var resultLength = result.length;
         for( var m=0;m<thisBrotherArr.length;m++ ){ // 匹配兄弟節點
         var num = matchNode(thisBrotherArr[m]);
         if( num != -1 ){
         result2.push(thisBrotherArr[m]);
         }
         }
         var resultLength2 = result2.length;
         // 對于自身匹配失敗的節點,要顯示必須滿足有父節點匹配成功,且兄弟級節點都匹配失敗
         if( (resultLength == 0 && resultLength2 == 0) || resultLength2 != 0 ){
         thisLi.hide();
         }
         if( resultLength !=0 && resultLength2 == 0 ){
         thisLi.show();
         }
         }else{
         thisLi.hide();
         } 
         }

            目標節點匹配失敗 目標節點即有父節點又有子節點:

         // 目標節點匹配失敗 目標節點即有父節點又有子節點
         function checkAllArray(arr,arr2,treeNode){
         var result = [];
         var result2 = [];
         var thisTid = treeNode.tId;
         var thisLi = $("#"+thisTid);
         var val = inputArea.val(); // 獲取檢索值
         for(var m=0;m<arr.length;m++){ // 匹配子節點或父節點
         var num = matchNode(arr[m]);
         if( num != -1 ){
         result.push(arr[m]); // 匹配成功儲存至數組
         }
         }
         var resultLength = result.length; // 獲取匹配成功后返回的數組長度
         for(var m=0;m<arr2.length;m++){ // 匹配子節點或父節點
         var num = matchNode(arr2[m]);
         if( num != -1 ){
         result2.push(arr2[m]); // 匹配成功儲存至數組
         }
         }
         var resultLength2 = result2.length; // 獲取匹配成功后返回的數組長度
         if( resultLength == 0 && resultLength2 == 0 ){ // 子節點和父節點都匹配失敗
         thisLi.hide();
         }else{ 
         thisLi.show(); // 有一種匹配成功或都匹配成功
         }
         }

          定義搜索方法:

         function searchArea(treeId, treeNode){ // 定義搜索方法
         var inputArea = $("input[name='searchArea']");
         var val = inputArea.val(); // 獲取檢索值
         var treeObj=$.fn.zTree.getZTreeObj("homeTree"); // 設置根節點
         var node = treeObj.getNodes(); // 獲取根節點
         var nodes = treeObj.transformToArray(node); // 獲取所有節點
         console.log(nodes);
         for(var i=0;i<nodes.length;i++){
         var thisNodePid = nodes[i].pId;
         var thisParentNode = 
         parentArray = [];
         childArray = [];
         getParentsNode(nodes[i]); // 獲取目標節點所有父節點 返回數組
         getChildrenNode(nodes[i]); // 獲取目標節點所有子節點 返回數組
         var num = matchNode(nodes[i]);
         if( nodes[i].isParent == false ){ 
         if( num != -1 ){
         checkTrueArray(parentArray,nodes[i]);
         }else{
         checkFalseArray(parentArray,nodes[i]);
         }
         }
         if( nodes[i].isParent == true ){
         if( num != -1 ){
         checkTrueArray(parentArray,nodes[i]); 
         checkTrueArray(childArray,nodes[i]); 
         }else{
         checkAllArray(parentArray,childArray,nodes[i]);
         }
         } 
         }
         
         }

          調用搜索方法:

         // 調用搜索方法
         $(".searchAreaBtn").click(function(treeId, treeNode){
         searchArea(treeId, treeNode);
         });
         var inputArea = $("input[name='searchArea']");
         inputArea.keyup(function(treeId, treeNode,e){
         var e = event || window.event;
         var val = inputArea.val();
         if( e.keyCode == 13 || val == "" ){
         searchArea(treeId, treeNode);
         }
         });

           看效果(電腦ps出問題了,用美圖秀秀拼的圖~囧...):

        結語

          理論上來說應該是能支持無限層的,最多試了四層,沒有問題,沒有做更多測試,有興趣的看官可以試試,需要demo的可以留言,互相學習,一起進步,么么噠~

        總結

        以上所述是小編給大家介紹的jQuery zTree搜索-關鍵字查詢 遞歸無限層功能實現代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        jQuery zTree搜索-關鍵字查詢 遞歸無限層功能實現代碼

        jQuery zTree搜索-關鍵字查詢 遞歸無限層功能實現代碼: 嘮叨一哈 前兩天朋友跟我說要一個ztree的搜索功能,我劈頭就是一巴掌:這種方法難道無數前輩還做少了?自己去找,我很忙~然后我默默地蹲著寫zTree的搜索方法去了。為什么呢?因為我說了句找不到是不可能的啊,肯定有很多人早做了無數了,找不到我給你寫還
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产精品免费观看视频| 亚洲国产一区二区三区在线观看 | 亚洲人成影院在线| 一区二区三区免费看| 亚洲Av无码乱码在线播放| 精品久久久久久久久亚洲偷窥女厕| 久久精品网站免费观看| 亚洲a级片在线观看| 久久久久久久久免费看无码| 亚洲乱码一二三四区国产| 免费人成网站在线观看10分钟| 亚洲无线一二三四区| 毛片免费在线播放| 亚洲爆乳无码精品AAA片蜜桃| 日本一道高清不卡免费| 一级毛片免费在线观看网站| 超清首页国产亚洲丝袜| 日本免费久久久久久久网站| 久久久久亚洲精品天堂| 免费黄色小视频网站| 全部一级一级毛片免费看| 亚洲av永久无码精品表情包| 永久在线观看www免费视频| 亚洲综合一区国产精品| 亚洲国产精品成人一区| 99精品视频在线观看免费播放 | 亚洲人6666成人观看| 色视频色露露永久免费观看| 337P日本欧洲亚洲大胆精品| 亚洲小说区图片区另类春色| 在线成人爽a毛片免费软件| 亚洲国产午夜精品理论片在线播放| 免费jjzz在线播放国产| 99精品视频在线观看免费播放| 亚洲国产区男人本色| 亚洲大尺度无码无码专区| 好先生在线观看免费播放| 精品国产呦系列在线观看免费| 亚洲成人网在线观看| 精品亚洲成α人无码成α在线观看 | 亚洲美女aⅴ久久久91|