【问题标题】:jstree select nodejstree选择节点
【发布时间】:2011-02-10 02:48:17
【问题描述】:

您好, 我正在使用 jsTree 来生成我的分层数据。 JsTree生成如下:

$(function() {
$("#industries").tree({
        data: {
            type: "json",
            opts: {
                url: "/Admin/GetIndustries/"
            }
        }
    });
});

它可以找到并且 jsonresult 类似于:

[{"attributes":[],"data":{"title":"Adwokaci, Notariusze","id":"1a051101-c3fa-48f2-b2e1-c60d1b67ea22"},"children":[{"attributes":[],"data":{"title":"Kancelarie adwokackie","id":"26d6cff1-3c7f-4a2f-bf5a-422e08127b43"

我的问题是:如何将选定节点的 ID 保存在某个隐藏字段中?我做这样的事情:

<script type="text/javascript">
    $("#industries").click(function() {
        var tree = $.tree.reference("industries");
        var t = $.tree.focused(); if (t.selected) t.selected; else alert("Select a node first");
        alert(t.id);

    });

但它不起作用。我进入“未定义”的警报窗口。有人可以帮帮我吗?

编辑: 我已将 jstree 实例更改如下:

$(function() {
$("#industries").tree({
        callback: {
            onselect: function(NODE, TREE_OBJ) {
                    alert(NODE.id);
                }
            },
        data: {
            type: "json",
            opts: {
                url: "/Admin/GetIndustries/"
            }
        }
    });
});

我得到空警报

【问题讨论】:

  • 如果您启用了 cookie 插件,一旦从 cookie 加载状态就会触发 select_node.jsTree 事件,我如何才能捕获只有在用户选择项目时才会触发的事件?

标签: jquery jstree


【解决方案1】:

或者只是绑定选择节点:

$("#industries").tree({
        callback: {
            onselect: function(NODE, TREE_OBJ) {
                    alert(NODE.id);
                }
            },
        data: {
            type: "json",
            opts: {
                url: "/Admin/GetIndustries/"
            }
        }
    })
.bind("select_node.jstree", function (NODE, REF_NODE) {
            var a = $.jstree._focused().get_selected();
        }
    });

尝试查看变量 a 的 ID 或 NODE。我实际上是使用 REF_NODE 来获取

【讨论】:

【解决方案2】:

我没有检查所有答案,但看到你没有选择任何答案,所以决定发布一个对我有用的方法

 $(function () {
        $("#demo1")
        .bind("select_node.jstree", function (event, data) {
                           var selectedObj = data.rslt.obj;
            alert(selectedObj.attr("id") + selectedObj.attr("data"));
             })

如果你想要节点的 id 和标题。希望这会有所帮助

【讨论】:

    【解决方案3】:

    您可以像这样在bind() 函数中使用它:

    .bind("check_node.jstree", function(e, data) {
        //console.log(data.rslt.obj.attr(\'id\'));
    
        if (data.rslt.obj !== undefined && data.rslt.obj.attr(\'id\') !== undefined) {
            jQuery.ajax({
                async: false,
                type: "POST",
                dataType: "json",
                url: "' . Yii::app()->createUrl('adsmanager/adsfields/ajaxappendcategory') . '",
                data: {
                    "id" : data.rslt.obj.attr(\'id\'),
                    "itemId" : "' . Yii::app()->getRequest()->getParam('id') . '",
                },
                success: function(r) {
                    if(r === undefined || r.status === undefined || !r.status) {
                        data.rslt.obj.removeClass(\'jstree-checked\');
                        data.rslt.obj.addClass(\'jstree-unchecked\');
                    } else {
                        niceBox(\'ok, checked\');
                    }
                }
            });
        }
    
        return true;
    });
    

    与取消选中操作相同。

    【讨论】:

      【解决方案4】:

      试试这里提到的回调:http://www.jstree.com/documentation

      它应该像这样工作:

      $("#industries").tree({
          //..... your other stuff .....
          callback: {
              onselect: function(NODE, TREE_OBJ) {
                            node_id = NODE.id;
                        }
          }
      });
      

      【讨论】:

      • ctrl+f 'callback' 0 个结果 ?????此外,不再支持此语法,因为它没有做任何事情。
      • @Drew 我有一段时间没用这个了,现在不能检查。如果您仍然卡住,请打开一个新问题 :)
      【解决方案5】:

      现在您已更改代码以使用 onselect 回调,您还有问题吗?我不知道您的编辑是否意味着您已经解决了问题。如果有,您应该将此问题标记为已回答。

      就我个人而言,我使用 onchange 而不是 onselect,但我确信两者都可以。您还可以考虑使用jquery's data() 功能将值与页面上的元素一起存储,而不是隐藏字段,除非您想提交包含该值的表单。

      但如果您需要将其保存到隐藏字段,请尝试以下操作:

      $("#industries").tree({
          //..... your other stuff .....
          callback: {
              onchange: function(NODE, TREE_OBJ) {
                   $("#hidden_field").val(NODE.id);
              }
          }
      });
      

      【讨论】:

        【解决方案6】:

        目前是否将 id 分配给任何 HTML 对象?

        在我的解决方案中,我在项目的属性上设置了 id,而不是在数据中,它在每个

      • 上设置了 id。像这样:
        [{"data":"Origination","attributes":{"id":"10"}",children":[
                             {"data":"New Connection","attributes":{"id":"11"}},
                             {"data":"Disconnection","attributes":{"id":"12"}},
                             {"data":"Load Change","attributes":{"id":"13"}},
                             {"data":"Corporate","attributes":{"id":"14"}}
                             ]}]
        

        并且具有渲染此 HTML 的效果(我也在使用 jsTree 复选框插件):

        <UL class=ltr sizcache="2" sizset="4">
          <LI id=10 class="  open" selected="false"><A class=undetermined href=""><INS>&nbsp;</INS>Origination</A>
          <UL sizcache="2" sizset="0">
            <LI id=11 class=leaf selected="false"><A href=""><INS>&nbsp;</INS>New Connection</A></LI>
            <LI id=12 class=leaf selected="true"><A class=checked href=""><INS>&nbsp;</INS>Disconnection</A></LI>
            <LI id=13 class=leaf selected="false"><A href=""><INS>&nbsp;</INS>Load Change</A></LI>
            <LI style="MARGIN-TOP: 0px" id=14 class="last leaf" selected="true"><A class=checked href=""><INS>&nbsp;</INS>Corporate</A></LI>
        
      • 【讨论】:

          【解决方案7】:

          与 Matt 一样,我也将 id 放在属性对象中,因此它会附加到 li 节点(从 Matt 复制的示例)。

          
          {"data":"Origination",
           "attributes":{"id":"10"},
           "children":[
             { "data":"New Connection",
               "attributes":{"id":"11"}
             },
             { "data":"Disconnection",
               "attributes":{"id":"12"}
             }
           ]
          }
          

          然后,在我的onselect函数中,我先将li节点包裹在jQuery中(函数参数不包裹),然后得到它的id。

          
              treeObject.callback = {
                  onselect: function(liNode, oTree) {
                      var id = $(liNode).attr('id');
                      var script = ComParentSet.getScript(id);
                      script.doXYZ();
                  }
              }
          

          【讨论】:

            【解决方案8】:
            $('#jstree-api').on('changed.jstree', function (e, data) {
                var objNode = data.instance.get_node(data.selected);
                var note;
                note = 'Selected Node Data(Id: <strong>' + objNode.id + '</strong>, Name: <strong>' + objNode.text + '</strong>)'; e = 'Selected Category(Id: <strong>' + objNode.id + '</strong>, Name: <strong id="api-data" data-parent="' + objNode.parent + '" data-id="' + objNode.id + '">' + objNode.text + '</strong>)';
            
                $('#footer-api').html(note);
            });
            

            这将为您获取所选节点的详细信息。

            Here is a series of article如果你使用的是jsTree,你应该关注。

            【讨论】:

              猜你喜欢
              • 2021-04-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-19
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多