【问题标题】:How can I select child node programmatically, in dynatree?如何在 dynatree 中以编程方式选择子节点?
【发布时间】:2010-05-13 13:12:13
【问题描述】:

我在我的应用程序中使用 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)

请帮我解决这个问题。我很想看到这个警报,非常感谢任何建议和帮助。

【问题讨论】:

    标签: javascript dynatree jquery-dynatree


    【解决方案1】:

    几乎没有经过测试,但您可以尝试以下方法:

    $(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,您提供给我的代码 sn-p 将选择模块 1.1 和模块 1.2,但我也希望选择模块 1.1 和模块 1.2 下的所有文档。再次感谢您的指导
    • 你确定吗? dtnode.visit() 应该遍历所有祖先,而不仅仅是直接子代。你用的是什么选择模式?
    【解决方案2】:

    虽然不是 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
    

    您可以从这个示例中汲取灵感,从所有子文档中检索您需要的字段并生成您的 HTML 输出。

    代码在这个线程中: Best way to generate text breadcrumbs from a PHP array having 3 columns (id, path, name)?

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

    【讨论】:

    • 我仍然想要的一件事是能够在单击其中一个面包屑时打开正确的节点(以编程方式生成 onLazyRead 和 onActivate 事件),就像在 Dynatree 中单击该节点一样。谁能让我走上正轨?
    • 作为对我之前评论的回答,这是有效的:&lt;a onclick="javascript:jQuery(\'#tree\').dynatree(\'getTree\').activateKey(\''.$id.'\');return false;" href="" &gt;one of the ancestor nodes&lt;/a&gt;
    【解决方案3】:

    使用以下函数代替来自mar10's 答案的函数。

    在父节点选择/取消选择时,所有子节点都被选择/取消选择。

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

    【讨论】:

      猜你喜欢
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-12
      • 1970-01-01
      • 2011-06-10
      • 2015-04-28
      • 1970-01-01
      相关资源
      最近更新 更多