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)に到達するまでツリービューをステップアップし、プロセスで検出されたすべての祖先ノードを配列レベルで記録するようにします。
- 次に、ツリービューのすべてのノードを折りたたみます
- 次に、 levels配列内のすべてのノードを再展開します。そうしている間、このコードを再度実行したくありません。これを防ぐために、グローバルignoreEx変数をレベル内のノード数に設定します
- 最後に、ノードをレベルごとにステップスルーし、各ノードを展開します