надеюсь, что это может помочь, и извините, я не использую json.Я использую jstree вместе с функцией, чтобы открывать узлы, нажимая на элементы вне html-файла jstree.
каждый узел в нашей настройке похож на веб-страницу, поэтому на домашней странице панели мониторинга есть список недавно отредактированныхстраниц.
каждая из этих ссылок имеет этот javascript для выполнения
<a href="javascript: selectLeftNavNode(339);">Edit</a>
, где 339 - это идентификатор страницы, которую мы хотим редактировать
, и это функция, котораяраньше выполнялся
function selectLeftNavNode(node) {
$('#demo').jstree('deselect_all');
$('#demo').jstree('select_node', '#node_' + node);
}
проблема, которую мы недавно заметили, что если недавно отредактированная страница находится глубоко в дереве, более конкретно в разделе, который еще не был загружен, то это приведет к ошибке
thisВот почему я решил сделать ajax-запрос к серверу, чтобы получить приведенный ниже код родительского идентификатора
, в моем случае ajax вернет что-то вроде этого xml
<?xml version="1.0" encoding="UTF-8"?>
<response>
<paths>
<path>339</path>
<path>338</path>
<path>38</path>
</paths>
</response>
ифункция
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);
}
});
}
}
и, в дополнение к этой функции, которая перебирается при обратных вызовах из open_node, функция открывает узел за узлом и когдаон попадает в последнюю запись, которая должна быть фактическим идентификатором узла, который мы хотим выбрать, вместо этого он будет использовать select_node
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]);
}
}
Я проверил свое решение с IE8, FF и Chrome, кажется, все работает нормально, наВдобавок ко всему, я использую jQuery v1.10.1 и jsTree 1.0-rc1 (к сожалению, поскольку код существует там уже много лет, и в нем есть вся эта база данных и другие интеграции, я решил не переходить на более новые версии, это работает)
надеюсь, что я кому-то помог
Том