jsTree 很棒,但它的文档相当密集。我最终想通了,所以这里是任何遇到此线程的人的解决方案。
首先,您需要将 open_node 事件绑定到相关树。类似于
$("tree").jstree({"themes":objTheme,"plugins":arrPlugins,"core":objCore}).
bind("open_node.jstree",function(event,data){closeOld(data)});
即您配置树视图实例,然后绑定 open_node 事件。在这里,我调用 closeOld 函数来完成我需要的工作 - 关闭任何其他可能打开的节点。函数是这样的
function closeOld(data)
{
var nn = data.rslt.obj;
var thisLvl = nn;
var levels = new Array();
var iex = 0;
while (-1 != thisLvl)
{
levels.push(thisLvl);
thisLvl = data.inst._get_parent(thisLvl);
iex++;
}
if (0 < ignoreExp)
{
ignoreExp--;
return;
}
$("#divElements").jstree("close_all");
ignoreExp = iex;
var len = levels.length - 1;
for (var i=len;i >=0;i--) $('#divElements').jstree('open_node',levels[i]);
}
这将正确处理所有其他节点的折叠,而与刚刚展开的节点的嵌套级别无关。
所涉及步骤的简要说明
- 首先,我们向后退树视图,直到到达顶级节点(在 jstree 中为 -1),确保将进程中遇到的每个祖先节点记录在数组 levels 中
- 接下来我们折叠树视图中的所有节点
- 我们现在要重新展开 levels 数组中的所有节点。在这样做的同时,我们不希望这段代码再次执行。为了阻止这种情况发生,我们将全局 ignoreEx 变量设置为 levels 中的节点数
- 最后,我们逐步遍历关卡中的节点并展开每个节点