nadzieja, że to może pomóc i przepraszam nie używam json. Używam jstree wraz z funkcją do otwierania węzłów poprzez klikanie elementów poza html jstree.
każdy węzeł w naszej konfiguracji jest jak strona internetowa, więc na stronie głównej pulpitu mamy listę ostatnio edytowanych stron.
każdy z tych linków jest to skrypt do wykonania
<a href="javascript: selectLeftNavNode(339);">Edit</a>
gdzie 339 to identyfikator strony chcemy edytować
i jest to funkcja FHE które kiedyś być wykonywane
function selectLeftNavNode(node) {
$('#demo').jstree('deselect_all');
$('#demo').jstree('select_node', '#node_' + node);
}
problem, który ostatnio zauważyliśmy, że jeśli ostatnio edytowana strona znajduje się głęboko w drzewie, w sekcji, która nie została jeszcze załadowana, to się nie powiedzie
dlatego postanowiłem zrobić ajax żądanie do serwera w celu pobrania wszystkich rodzic identyfikatora
zmienił kod poniżej, ajax w moim przypadku będzie powrócić coś jak to patrząc xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
<paths>
<path>339</path>
<path>338</path>
<path>38</path>
</paths>
</response>
a funkcja
function selectLeftNavNode(node) {
$('#demo').jstree('deselect_all');
if($('#demo').jstree('select_node', '#node_' + node) === false)
{
// if it is false means that the node is not yet rendered
// so instead of loading we will require to get list of parent nodes to open in order, then it will become available
// an ajax call should get us all the nodes
$.ajax({
type: "POST",
dataType: "xml",
url: your_url_to_php_script',
data: {node_id:node},
success: function(data)
{
var remaining_nodes = new Array();
var paths_count = $(data).find('response').find('path').length;
for(var x=1;x<=paths_count;x++){
remaining_nodes[x-1] = $(data).find('response').find('paths path:nth-child('+x+')').text();
}
open_nodes_step_by_step(remaining_nodes);
}
});
}
}
i oprócz tej funkcji, która jest przelotowe na wywołania zwrotne z open_node funkcja otwiera węzeł przez węzeł i kiedy trafi t on ostatni wpis, który powinien być rzeczywisty identyfikator węzła chcemy wybrać użyje select_node zamiast
function open_nodes_step_by_step(remaining_nodes)
{
var nodes = remaining_nodes.slice();
tree = jQuery.jstree._focused();
if(nodes.length > 1){
var nodes_left = remaining_nodes.slice();
nodes_left.pop();
var to_open = nodes.length - 1;
tree.open_node(document.getElementById('node_' + nodes[to_open]), /*CALLBACK*/ function() {
open_nodes_step_by_step(nodes_left);
});
}
else{
tree.select_node('#node_' + nodes[0]);
}
}
Ja testowałem moje rozwiązanie z IE8, FF i Chrome wszystko wydaje się działać dobrze, na górze, że i używaj jQuery v1.10.1 i jsTree 1.0-rc1 (niestety, ponieważ kod istnieje od lat i ma całą bazę danych i inne integracje postanowiłem nie zmieniać na nowsze wersje, działa)
mam nadzieję, że pomogłem ktoś
Tom