【问题标题】:jstree 3 - dnd - limit dropping to certain nodejstree 3 - dnd - 限制下降到某个节点
【发布时间】:2014-06-06 13:25:24
【问题描述】:

使用 jstree 我想限制我的树的深度,不允许丢弃在某些节点上。

这是我的(简化的)代码:

$('#tree').jstree({
    "plugins":["dnd"],
    "core":{
        "check_callback":true
    },
    "dnd":{
        "copy":false
    }
}).on("move_node.jstree", function(node,nodes){
    console.log("node : "+nodes.node.id);
    console.log("parent : "+nodes.node.parent);
    console.log("position : "+nodes.position);
});

我找到了关于旧版本但不是 jstree 3 的文档

我尝试了一个经典的 return false;在 move_node 函数的某些条件下 - 它不会改变任何东西。 所以我想我的问题很简单:如何在某些条件下禁用 move_node - 最好的方法是不允许在某些节点上拖动(即不显示它们前面的三角形 - 以及一个红十字而不是绿色标记) 当然,这个节点仍然是可拖动的,并且可以像任何其他节点一样工作。

【问题讨论】:

    标签: jquery drag-and-drop jstree


    【解决方案1】:

    在使用“类型”插件的jsTree中,您可以限制删除到某些节点,您可以在其中指定任何节点并通过设置“max_children”、“ max_depth”,“valid_children”。

    检查此Demo 以供参考。

    在最新的 jsTree v3+ 中,这个“类型”插件在 dnd 插件中没有完全实现。

    如果你看到源代码行号5036(在dnd插件中),有cmets之类的,

    // TODO: now check works by checking for each node individually, how about max_children, unique, etc?
    // TODO: drop somewhere else - maybe demo only?
    

    因此需要等待jsTree的下一个版本。

    【讨论】:

      【解决方案2】:

      This 答案应该是您问题的解决方案。

      您应该使用check_callback 函数来实现选择性地将节点从一个父节点删除到另一个父节点。

      【讨论】:

        【解决方案3】:

        另一种解决方案是编写一个jstree插件,例如:

        $.jstree.plugins.myPlugin = function (options, parent) {
        
            this.check = function (chk, obj, par, pos, more) {
                if(parent.check.call(this, chk, obj, par, pos, more) === false) { return false; }
                if ( 'put here your condition to block dropping' ) {return false}
                return true;
                };
        
            };
        

        然后在创建 jstree 实例时将 'myPlugin' 添加到插件列表中。

        【讨论】: