Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在动态树中以编程方式选择子节点?_Javascript_Dynatree_Jquery Dynatree - Fatal编程技术网

Javascript 如何在动态树中以编程方式选择子节点?

Javascript 如何在动态树中以编程方式选择子节点?,javascript,dynatree,jquery-dynatree,Javascript,Dynatree,Jquery Dynatree,我在应用程序中使用jQuery的动态树,我希望在选择父节点时以编程方式选择所有子节点。我的树的结构如下 <div id = "tree"> <ul> <li>package 1 <ul> <li>module 1.1 <ul> <li> document 1.1.1</li>

我在应用程序中使用jQuery的动态树,我希望在选择父节点时以编程方式选择所有子节点。我的树的结构如下

<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);
        }


    });
在ifflag条件下,我得到了用户选择的元素的所有子节点,它给出了可以从alertchild.length语句中看到的正确值。然后我运行循环以选择所有子项,但循环从不超出语句var x=child[I]的范围

我永远看不到alerti的语句被执行。上述语句的结果是,如果我选择包1,也会选择模块1.1和文档1.1.1,但它从不执行alerti语句-不会选择包1的其他子级。在我看来,当第一次执行child[i].selecttrue语句时,它也会触发其子语句的onselect事件,从而产生类似递归的事情

我的想法正确吗?无论递归是什么或它到底做了什么,它都不会完成循环并执行下一条指令alerti


请帮我解决这个问题。我非常希望看到这种提醒,非常感谢您的任何建议和帮助。

几乎未经测试,但您可以尝试以下方法:

$(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;
            }
        }

虽然我不是Dynatree内部功能的专家,但我编写了一些代码,为单击的节点及其所有子节点生成面包屑

在下面的示例中,单击edibles将输出:

edibles
edibles > fruits
edibles > fruits > apples
edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith
edible > vegetables
edible > vegetables > potatoes
edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith
单击绿苹果时会输出:

edibles
edibles > fruits
edibles > fruits > apples
edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith
edible > vegetables
edible > vegetables > potatoes
edibles > fruits > apples > green apples
edibles > fruits > apples > green apples > granny smith
您可以从这个示例中获得灵感,从所有子文档中检索所需的字段,并生成HTML输出

代码在此线程中:


PHP脚本本身通过jQuery.ajax{…}从Dynatree的onActivate事件处理程序调用;查询。

使用以下函数代替“答案”中的函数

在父节点选择/取消选择上选择/取消选择所有子节点

onSelect: function (isSelected, node) {
    node.visit(function (childNode) {
        childNode.select(isSelected);
    });
},

谢谢亲爱的,这是很大的帮助,但我想延长一点。如果单击软件包1,则u提供给我的代码片段将选择模块1.1和模块1.2,但我也希望选择模块1.1和模块1.2下的所有文档。再次感谢你的指导,你确定吗?dtnode.visit应该遍历所有祖先,而不仅仅是直接子代。您使用的是什么selectMode?我仍然希望能够在单击其中一个面包屑时以编程方式打开右节点generate onLazyRead和onActivate events,就像在Dynatree中单击该节点一样。谁能让我走上正确的道路?作为对我之前评论的回答,这是有效的: