Select/deselect fancytree 插件上具有相同 ID 的所有节点

Select/deselect all node with same ID on fancytree plugin

我正在尝试创建公司结构。 一名员工可以在两个部门任职,但这是具有相同 ID 的同一员工 id = employee1

正在检查项目是否被选中或取消选中,这正在运行。

我对具有相同 ID 的节点有疑问。

When selected node with id employee1, I want select/deselect all node where is id employee1.

提前致谢。

<div id="companyEmplyee">
    <ul>
        <li class="folder" id="company1">Company
            <ul>
                <li class="folder" id="sector1">Sector 1
                    <ul>
                        <li class="emplyee1">Emplyee 1</li>  
                        <li id="emplyee2">Emplyee 2</li>        
                    </ul>
                </li>
                <li class="folder" id="sector2">Sector 2
                    <ul>
                        <li class="emplyee1">Emplyee 1</li>  
                        <li id="emplyee35">Emplyee 35</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>                                                   
</div>

<script type="text/javascript">
    $(function () {
        var tree = $("#companyEmplyee").fancytree({
            checkbox: true,
            selectMode: 2,
            keyPathSeparator: "/",

            clones: {
                highlightClones: true
            },
            select: function (event, data) {
                var s = data.tree.getNodeByKey(data.node.key);
                var s3 = s.key;
                var s2 = $.map(data.tree.getSelectedNodes(), function (node) {//                                                                        
                    return node.key;
                });

                if ($.inArray(s3, s2) == -1) {//                                                                      
                    $("tr#" + s3).addClass("deleted");
                    //DESELECTED
                    $('table#tblID tr#' + s.key).remove();
                    alert(s.key + ' DESELECT');

                }

                else {
                    //SELECTED
                    alert(s.key + ' SELECT');
                }
            }
        });
    });
</script>

id 在同一个文档中应该是唯一的,使用通用的 class emplyee1 代替:

<div id="companyEmplyee">
    <ul>
        <li class="folder" id="company1">Company
            <ul>
                <li class="folder" id="sector1">Sector 1
                    <ul>
                        <li class="emplyee1">Emplyee 1</li>  
                        <li id="emplyee2">Emplyee 2</li>        
                    </ul>
                </li>
                <li class="folder" id="sector2">Sector 2
                    <ul>
                        <li class="emplyee1">Emplyee 1</li>  
                        <li id="emplyee35">Emplyee 35</li>
                    </ul>
                </li>
            </ul>
        </li>
    </ul>                                                   
</div>

或者使用唯一 ID,就像您在 fancytree documentation 中看到的那样,密钥(节点 ID)应该是唯一的:

Node id (must be unique inside the tree)


更新:

尝试使用以下技巧:

select: function (event, data) {
    if(data.node.extraClasses!=''){
      if( $(data.node.li).find('.fancytree-node').hasClass('fancytree-selected') )
            $('.'+data.node.extraClasses).addClass('fancytree-selected');
      else
            $('.'+data.node.extraClasses).removeClass('fancytree-selected');
  }
}

Working example.

希望这对您有所帮助。

重复的 ID 在 HTML 中无效,违反规范并导致问题。

https://www.w3.org/TR/2011/WD-html5-20110525/elements.html#the-id-attribute

分配 类 而不是 ids。

如之前的回答所述,Fancytree 中不允许重复的节点键(HTML 中也不允许重复的 ID)。

由于在一棵树中有多个对象实例是很常见的场景,所以有一个概念'clones'。

基本上,您包括 clones 扩展名并将员工 ID 作为 refKey 而不是 key 传递,例如

<li data-refKey="emplyee1">Emplyee 1</li>  

您还需要启用扩展:

$("#tree").fancytree({
    extensions: ["clones"],
    checkbox: true,
    selectMode: 2,
    ...

之后,您可以像这样访问相关实例:

select: function(event, data) {
    var nodes = data.node.getCloneList();
    ...
},

详情请看这里:https://github.com/mar10/fancytree/wiki/ExtClones 和示例 http://wwwendt.de/tech/fancytree/demo/sample-ext-clones.html