我在我的应用程序中使用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>
现在我想要的是当我点击标题为“package 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)
。
请帮我解决这个问题。我很想看到那个警报,任何建议和帮助都会受到高度赞赏。
答案 0 :(得分:2)
经常测试,但你可以尝试这样的事情:
$(function(){
var inEventHandler = false;
$("#tree").dynatree({
checkbox: true,
selectMode: 2,
[...]
onSelect: function(select, dtnode) {
// Ignore, if this is a recursive call
if(inEventHandler)
return;
// Select all children of currently selected node
try {
inEventHandler = true;
dtnode.visit(function(childNode){
childNode.select(true);
});
} finally {
inEventHandler = false;
}
}
答案 1 :(得分:0)
虽然不是Dynatree内部能力的专家,但我写了一些代码,为点击的节点及其所有后代生成面包屑。
在下面的示例中,点击&#34;食物&#34;输出:
edibles
edibles > fruits
edibles > fruits > apples
edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith
edible > vegetables
edible > vegetables > potatoes
点击&#34;青苹果&#34;输出:
edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith
您可以从此示例中汲取灵感,并从所有子文档中检索所需的字段并生成HTML输出。
代码在这个帖子中: Best way to generate text breadcrumbs from a PHP array having 3 columns (id, path, name)?
PHP脚本本身是通过jQuery.ajax({...});
查询从Dynatree的onActivate事件处理程序调用的。
答案 2 :(得分:0)
Use the following function in place of the one from mar10's answer.
All child nodes are selected/unselected on parent node select/unselect.
onSelect: function (isSelected, node) {
node.visit(function (childNode) {
childNode.select(isSelected);
});
},