esperanza que esto podría ayudar, y lo siento, no estoy usando JSON. Estoy usando jstree junto con la función para abrir nodos haciendo clic en elementos externos desde el html de jstree.
cada nodo en nuestra configuración es como una página web, por lo que en la página de inicio del panel de control tenemos una lista de las páginas recientemente editadas.
cada uno de estos enlaces tiene este Javascript para ejecutar
<a href="javascript: selectLeftNavNode(339);">Edit</a>
donde 339 es el ID de la página que queremos editar
y esto es función de la noche de hogar que solía ser ejecutado
function selectLeftNavNode(node) {
$('#demo').jstree('deselect_all');
$('#demo').jstree('select_node', '#node_' + node);
}
El problema que notamos recientemente es que si la página editada recientemente está en el interior del árbol, más específicamente en la sección que aún no se ha cargado, fallará
esto es por eso que decidí hacer una petición Ajax al servidor con el fin de recuperar toda la ID de padre
cambiado código de abajo, el Ajax en mi caso devolverá algo como esto xml mirando
<?xml version="1.0" encoding="UTF-8"?>
<response>
<paths>
<path>339</path>
<path>338</path>
<path>38</path>
</paths>
</response>
y la función
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);
}
});
}
}
y además de que una función que es devuelto a través de devoluciones de llamada de open_node, la función abre nodo por nodo y cuando golpea t que la última entrada que debe ser el ID de nodo real que queremos para seleccionarlo utilizará select_node lugar
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]);
}
}
he probado mi solución con IE8, FF y Chrome todo parece estar funcionando muy bien, por encima de eso i use jQuery v1.10.1 y jsTree 1.0-rc1 (desafortunadamente, como el código ha estado allí durante años y tiene toda esa base de datos y otras integraciones, decidí no cambiar a versiones más nuevas, funciona)
espero que haya ayudado alguien
Tom