jsTree 很棒,但它的文档相当密集。我最终想通了,所以这里是任何遇到这个线程的人的解决方案。
首先,您需要将 open_node 事件绑定到相关树。类似的东西
$("tree").jstree({"themes":objTheme,"plugins":arrPlugins,"core":objCore}).
bind("open_node.jstree",function(event,data){closeOld(data)});
即您配置treeview 实例,然后绑定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),确保我们在数组级别中记录进程中遇到的每个祖先节点
- 接下来我们折叠树视图中的所有节点
- 我们现在将重新展开级别数组中的所有节点。在这样做的同时,我们不希望这段代码再次执行。为了阻止这种情况发生,我们将全局ignoreEx变量设置为级别中的节点数
- 最后,我们逐步遍历关卡中的节点并展开每个节点