2016-08-24 195 views
4

我有這個JSTree如何找出父節點的所有嵌套子節點?

enter image description here

和下面的代碼爲這棵樹

var data1 = [{ 
    "id": "W", 
    "text": "World", 
    "state": { "opened": true }, 
    "children": [{"text": "Asia"}, 
       {"text": "Africa"}, 
       {"text": "Europe", 
       "state": { "opened": false }, 
       "children": [ "France","Germany","UK" ] 
    }] 
}]; 

$('#data').jstree({ 
    core: { 
     data: data1, 
     check_callback: false 
    }, 
    checkbox: {  

     whole_node : false, 
     tie_selection : false 
    }, 
    plugins: ['checkbox','search'] 
}) 

我想是讓所有的父節點的嵌套或深子節點。我怎樣才能做到這一點 ?

+0

你不能得到這個像'數據1 [0]。 id;'? – abpatil

+0

不,假如我選擇了World,因爲它是一個父節點,它有6個孩子,包括嵌套,所以我怎樣才能得到所有的孩子列表或長度? – legend

回答

1

我想要的是獲得父節點的所有嵌套或深層子節點。我怎樣才能做到這一點 ?

您需要有一個起始節點才能開始。假設您監聽「select_node.jstree」事件以獲取當前選定的節點。

您正在查找的主要功能是.get_children_dom(node) and .is_leaf(node)

完整的例子是:

.on('check_node.jstree', function(e, obj) { 
    var currentNode = obj.node; 
    $('#data').jstree(true).open_all(currentNode); 
    var allChildren = $('#data').jstree(true).get_children_dom(currentNode); 
    var result = [currentNode.text]; 
    allChildren.find('li').andSelf().each(function(index, element) { 
     if ($('#data').jstree(true).is_leaf(element)) { 
      result.push(element.textContent); 
     } else { 
      var nod = $('#data').jstree(true).get_node(element); 
      result.push(nod.text); 
     } 
    }); 
    console.log(result.join(', ')); 
}); 

全段所有的功能是:

var data1 = [{ 
 
    "id": "W", 
 
    "text": "World", 
 
    "state": {"opened": true}, 
 
    "children": [{"text": "Asia"}, 
 
       {"text": "Africa"}, 
 
       { 
 
       "text": "Europe", 
 
       "state": {"opened": false}, 
 
       "children": ["France", "Germany", "UK"] 
 
       }] 
 
}]; 
 

 
$(function() { 
 
    $('#data').jstree({ 
 
    core: { 
 
     data: data1, 
 
     check_callback: false 
 
    }, 
 
    checkbox: { 
 

 
     whole_node: false, 
 
     tie_selection: false 
 
    }, 
 
    plugins: ['checkbox', 'search'] 
 
    }).on('check_node.jstree.jstree', function(e, obj) { 
 
    var currentNode = obj.node; 
 
    $('#data').jstree(true).open_all(currentNode); 
 
    var allChildren = $('#data').jstree(true).get_children_dom(currentNode); 
 
    var result = [currentNode.text]; 
 
    allChildren.find('li').andSelf().each(function(index, element) { 
 
     if ($('#data').jstree(true).is_leaf(element)) { 
 
     result.push(element.textContent); 
 
     } else { 
 
     var nod = $('#data').jstree(true).get_node(element); 
 
     result.push(nod.text); 
 
     } 
 
    }); 
 
    console.log(result.join(', ')); 
 
    }); 
 

 
    $('#btnClose').on('click', function(e) { 
 
    $('#data').jstree(true).close_all(); 
 
    }); 
 

 
    var to = false; 
 
    $('#search').on('input', function(e) { 
 
    if (to) { clearTimeout(to); } 
 
    to = setTimeout(function() { 
 
     var v = $('#search').val(); 
 
     $('#data').jstree(true).search(v); 
 
    }, 250); 
 
    }); 
 

 
    $('#btnCheckAll').on('click', function(e) { 
 
    $('#data').jstree(true).check_all(); 
 
    }); 
 

 
    $('#btnUnCheckAll').on('click', function(e) { 
 
    $('#data').jstree(true).uncheck_all(); 
 
    }); 
 
});
button { 
 
    background-color: transparent; 
 
    color: red; 
 
    border-style: none; 
 
}
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css"/> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script> 
 

 

 
<label form="search">Products: </label> 
 
<input type="text" value="" id="search" placeholder="Search products"> 
 
<div id="divPanel"> 
 
    <button id="btnCheckAll">Check All</button><button id="btnUnCheckAll">UnCheck All</button><button id="btnClose">Close</button> 
 
    <div id="data"> 
 

 
     <ul> 
 
      <li>Root node 1 
 
       <ul> 
 
        <li id="child_node_1">Child node 1</li> 
 
        <li>Child node 2</li> 
 
       </ul> 
 
      </li> 
 
      <li>Root node 2</li> 
 
     </ul> 
 
    </div> 
 
</div>

+0

感謝您的幫助,但代碼中有一些調整,而不是使用'select_node',我使用'check_node',當點擊複選框而不是節點時執行某些操作。那麼當我點擊特定節點時,如何獲得節點的所有子節點和子節點 – legend

+0

@code_legend我使用'check_node'而不是'select_node'更新了片段。當您檢查(而不是取消選中)節點時,結果數組將包含所有文本(當前節點(子節點)和子節點)。運行該代碼段並在代碼段控制檯中查看消息。如有問題請告訴我。 – gaetanoM

+0

感謝它的工作原理,只有一件事我想知道爲什麼在'check_node.jstree.jstree'中兩次使用.jstree。 – legend

相關問題