アプリケーションで jQuery の dynaTree を使用しています。親ノードが選択されたときに、すべての子ノードをプログラムで選択したいと考えています。私のツリーの構造は次のとおりです
<div id = "tree">
<ul>
<li>package 1
<ul>
<li>module 1.1
<ul>
<li> document 1.1.1</li>
<li> document 1.1.2</li>
</ul>
</li>
<li>module 1.2
<ul>
<li>document 1.2.1</li>
<li>document 1.2.2</li>
</ul>
</li>
</ul>
</li>
<li> package 2
<ul>
<li> module 2.1
<ul>
<li>document 2.1.1</li>
<li>document 2.1.1</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
今私が欲しいのは、タイトルが「パッケージ1」のツリーノードをクリックすると、そのすべての子ノード、つまり(モジュール1.1、ドキュメント1.1.1、ドキュメント1.1.2、モジュール1.2、ドキュメント1.2.1、ドキュメント1.2.2)も選択する必要があります。
以下は、私が使用しようとしたアプローチです。
$("#tree").dynatree({
onSelect: function(flag, dtnode) {
// This will happen each time a check box is selected/deselected
var selectedNodes = dtnode.tree.getSelectedNodes();
var selectedKeys = $.map(selectedNodes, function(node) {
//alert(node.data.key);
return node.data.key;
});
// Set the hidden input field's value to the selected items
$('#SelectedItems').val(selectedKeys.join(","));
if (flag) {
child = dtnode.childList;
alert(child.length);
for (i = 0; i < child.length; i++) {
var x = child[i].select(true);
alert(i);
}
}
},
checkbox: true,
onActivate: function(dtnode) {
//alert("You activated " + dtnode.data.key);
}
});
このif(flag)
状態で、ユーザーが選択した要素のすべての子ノードを取得すると、alert(child.length) ステートメントから確認できる正しい値が得られます。次に、ループを実行してすべての子を選択しますが、ループがステートメントを超えることはありませんvar x = child[i].select(true);
alert(i)
そして、ステートメントが実行されているのを見ることはできません。上記のステートメントの結果は、パッケージ 1 を選択すると、モジュール 1.1 とドキュメント 1.1.1 も選択されますが、alert(i)
ステートメントは実行されず、パッケージ 1 の他の子は選択されません。私の見解では、最初のchild[i].select(true)
ステートメントが実行されると、その子の on select イベントもトリガーされ、再帰のようなものになります
私の考えは正しいですか?どんな再帰でも、一体何をしても、ループを完了せず、次の命令を実行しませんalert(i)
。
この問題を解決するのを手伝ってください。私はそのアラートを見て死にかけています。どんな提案や助けも大歓迎です。