【问题标题】:How to get the ancestors of a JS tree node when it is selected?JS树节点选中时如何获取其祖先?
【发布时间】:2014-11-27 11:37:29
【问题描述】:

我正在获取子树名称,但我想获取其父节点名称的完整层次结构。

以下代码显示了我如何获取子节点并在特定的 div 元素中打印其值:

$(document).ready(function () {
    $('#bdeViewNew').on('changed.jstree', function (e, data) {
        var i, j, r = [];

        for (i = 0, j = data.selected.length; i < j; i++) {
            r.push(data.instance.get_node(data.selected[i]).text.trim());
            $('#treeBreadCrumbs').html(r.join(', '));
        }
    });
});

现在它打印子节点的值,例如Child a。但是如果树结构如下所示,我想要如下所示:

Parent
  Child 1
    Child a
    Child b
  Child 2
    Child c
    Child d

所以如果我点击 Child a 我希望我的 div 内容更新为

Parent > Child 1 > Child a

到目前为止,我只收到Child a。请告诉我如何获得正确的输出。

我尝试如下所示获取所有父节点的路径:

$(document).ready(function() {
$('#bdeViewNew').on('changed.jstree', function(e, data) {
var ids = data.inst.get_path('#bdeViewNew' + data.rslt.obj.attr('id'),true);
var names = data.inst.get_path('#bdeViewNew' + data.rslt.obj.attr('id'),false);
alert("Path [ID or Name] from root node to selected node = ID's = "+ids+" :: Name's = "+names);
 });
 });

但 get_path 仍然没有结果。我需要使用不同的 JS 或插件吗? attr('id') 的含义是什么,我应该传递那个 li 的 id 或其他东西,因为我没有正确理解这个语法。

添加我的jstree:

 <div id="bdeViewNew">
    <ul>


        <li id="bde" data-jstree='{"opened":true,"icon":"./images/tree.png"}'">
            Parent 1

            <ul>

                <li id="aaa" data-jstree='{"opened":true,"icon":"./images/tree.png"}'>
                    Child 1 <c:forEach items="${empInfo.empList}"
                        var="empValue">
                        <ul>
                            <li id="bbb" data-jstree='{"icon":"./images/tree.png"}' >${empValue.empName}</li>
                        </ul>
                    </c:forEach>
                </li>
            </ul>
            <ul>
                <li id="ccc" data-jstree='{"icon":"./images/tree.png"}'>Child 2
                    <c:forEach items="${imgInfo.imgList}"
                        var="imgValue">
                        <ul>
                            <li id="ddd" data-jstree='{"icon":"./images/tree.png"}'>${imgValue.imgName}</li>
                        </ul>
                    </c:forEach>
                </li>
            </ul>
        </li>
    </ul>
</div>

【问题讨论】:

  • 检查它的父母
  • @Manticore 我尝试使用一个函数来检查父节点,但它不工作如下: y=r.push(data.instance._get_parent(data.selected[i]).text);警报(y);如果您有任何其他有关功能的信息,请告诉我

标签: javascript jquery jstree


【解决方案1】:

这会很好用......它会得到完整的父母......

    $('#bdeViewNew').on('select_node.jstree', function (e, data) {
        var loMainSelected = data;
        uiGetParents(loMainSelected);
    });

    function uiGetParents(loSelectedNode) {
        try {
            var lnLevel = loSelectedNode.node.parents.length;
            var lsSelectedID = loSelectedNode.node.id;
            var loParent = $("#" + lsSelectedID);
            var lsParents =  loSelectedNode.node.text + ' >';
            for (var ln = 0; ln <= lnLevel -1 ; ln++) {
                var loParent = loParent.parent().parent();
                if (loParent.children()[1] != undefined) {
                    lsParents += loParent.children()[1].text + " > ";
                }
            }
            if (lsParents.length > 0) {
                lsParents = lsParents.substring(0, lsParents.length - 1);
            }
            alert(lsParents);
        }
        catch (err) {
            alert('Error in uiGetParents');
        }
    }

【讨论】:

  • 对于 (var ln = lnLevel -1; ln >= 0 ; ln--) { var loParent = loParent.parent().parent(); 是否正确if (loParent.children()[1] != undefined) { lsParents += loParent.children()[1].text + " > "; } } ??
  • 检查最新答案 sanjay.. 只是我将结果存储在数组中并反转数组。现在你会得到结果
  • 我也在使用它,但我在 loParent.children()[1].text 上未定义。你有什么想法?我正在使用 jsTree 3.1.1
  • @RavikumarRaman 嗨...这段代码非常适合我。我正在尝试将警报消息发布到 php 文件中……这根本不起作用。我在这里发了一个帖子stackoverflow.com/questions/48363615/…你能看看吗。
【解决方案2】:
var node=$('#drives_tree').jstree("get_selected", true);
$("#breadcrumbs").text($('#drives_tree').jstree().get_path(node[0], ' > '));

【讨论】:

  • 这似乎是迄今为止最好的答案。使用内置的 get_path 是获取面包屑的最简洁方法,无需依赖 DOM parent.parent.parent 调用。
  • 显然这是我找到的获取所选节点完整路径的最简单方法
【解决方案3】:

我们有直接的方法来获取父母信息。

  $('#bdeViewNew').on('select_node.jstree', function (e, data) {
        var loMainSelected = data;
        alert(loMainSelected.node.parents);
    });

它将返回 ["Child1", "Parent"] 。使用这种方法,我们可以让所有的父母都获得根。

【讨论】:

  • 非常感谢 Ravi 的回复,如果我想要节点名称,我会得到 ids,然后需要使用什么,他们是否可以通过任何方式获得像 Parent > child 这样的输出,正如我在顶部
  • Ravi 如果我只是在子 a 上进行选择,请告诉我是否有任何方法可以得到类似 [Parent > Child 1 > child a] 的输出。正如你所建议的那样,我正在获取该节点的 ID,但我想显示实际的节点名称。如果您有任何想法,请让我提前谢谢
  • 嗨,Sanjay,我们有替代方法。
  • 嗨 Sanjay,第 1 步:获取所选节点 ID 和所选节点级别第 2 步:使用节点 ID 获取当前父节点,如下所示(例如 $("#101000000892").parent() .parent() ) 步骤 2.2:下一级节点 ( $("#101000000892").parent().parent().parent().parent() ) 步骤 2.3 :在一个可变的 var loNode = $(" #101000000892").parent().parent();第 2.4 步:接下来你可以 loNode.parent().parent() 第 3 步:使用 for 循环你可以循环通过关卡直到到达 1。第 4 步:现在你可以得到全文了。
【解决方案4】:
function uiGetParents(loSelectedNode) {
    try {
        var loData = [];
        var lnLevel = loSelectedNode.node.parents.length;
        var lsSelectedID = loSelectedNode.node.id;
        var loParent = $("#" + lsSelectedID);
        var lsParents = loSelectedNode.node.text + ' >';
        for (var ln = 0; ln <= lnLevel - 1 ; ln++) {
            var loParent = loParent.parent().parent();
            if (loParent.children()[1] != undefined) {
                lsParents += loParent.children()[1].text + " > ";
                loData.push(loParent.children()[1].text);
            }
        }
        if (lsParents.length > 0) {
            lsParents = lsParents.substring(0, lsParents.length - 1);
        }
        alert(lsParents);
        alert(loData.reverse());
    }
    catch (err) {
        alert('Error in uiGetParents');
    }
}

存储在数组 loData 中的结果。只需反转数据并循环 loData 数组。你得到了你的输出

【讨论】:

【解决方案5】:

**

Step 1 : Get the Selected node Id and selected node level
        Step 2 : Using node id get the current parent like this ( ex.. $("#101000000892").parent().parent() )
            step 2.2 : Next level node ( $("#101000000892").parent().parent().parent().parent() )
            step 2.3 : stroe this in a vairable  var loNode = $("#101000000892").parent().parent();
            step 2.4 : Next you can  loNode.parent().parent()
        Step 3 : Using for loop u can loop through the level until reached 1.
        step 4 : Now you can get the full text .

**

【讨论】:

  • 嗨 ravi 感谢您的回答,但我已经尝试过这样来获取所选节点的 id,但它也给了我其父节点的 id。 $('#bdeViewNew li').click(function() { alert($(this).attr("id")); alert($(this).text()); });如果可能的话,您可以根据上述代码编写一些步骤,以便我正确理解它。以及如何让您提及第 1 步?如果可能,请编写步骤 1 的代码。
【解决方案6】:

试试这个,

使用 for 循环代替 angular.each。

你会得到一个包含所有节点文本的数组。

var breadcrumbArr = [selectedNode.node.text];

angular.forEach(selectedNode.node.parents, function(element, index) {
    if (element === '#') return;
    breadcrumbArr.push($('#'+element).find('a:first').text())
});

breadcrumbArr.reverse();

return breadcrumbArr;

【讨论】:

    【解决方案7】:

    打印 Parent > Child 的稍微不那么冗长的版本

    function uiGetParents(node) {
    try {
        var level = node.node.parents.length;
        var elem = $('#' + node.node.id);
        var text = node.node.text;
    
        for (var ln = 0; ln <= level - 1 ; ln++) {
            elem = elem.parent().parent();
    
            var child = elem.children()[1];
            if (child != undefined) {
                text = child.text + ' > ' + text;
            }
        }
    
        console.log(text);
    }
    catch (err) {
        console.log('Error in uiGetParents');
    }
    

    }

    【讨论】:

      【解决方案8】:
      var node = $tree.jstree().get_node(id),
          formatted_name = $tree.jstree().get_text(node);
      
          $.each(node.parents, function(key, parentId) {
              if ( parentId !== "#" ) {
                  var parent = $tree.jstree().get_node(parentId);
                  formatted_name = $tree.jstree().get_text(parent) + "->" + formatted_name;
              }
          });
      
         console.log(formatted_name);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-14
        相关资源
        最近更新 更多