将节点从jstree拖到外部div元素上,然后在删除时执行操作

时间:2011-05-19 13:55:42

标签: jquery drag-and-drop jstree

我有一个jstree工作,现在希望能够将某些类型的节点拖动到外部div元素(包含由highcharts生成的图表)。我实际上并不希望从树中删除节点,也不想要节点的副本。我只想要删除节点以使用节点的ID更新图表。

我想我可以计算出图表更新位,但这是使用jstree进行拖放的过程我发现有点令人困惑。另外,我只希望某些类型的节点可以拖动(任何属性为rel =“ds”)。

我正在苦苦挣扎,并没有走得太远。这是我必须去的地方:

$("#statstree").jstree({ 
       "json_data" : {
                "ajax" : {
                    "url" : "test.json",
                    "data" : function (n) { 
                        return { id : n.attr ? n.attr("id") : 0 }; 
                    },
                    "progressive_render" : true
                }
            },
            "types" : {
                "valid_children" : [ "root" ],
                "types" : {
                    "folder" : {
                        "icon" : { 
                            "image" : "images/folder.png" 
                        },
                        "valid_children" : [ "default" ],
                        //"max_depth" : 2,
                        "hover_node" : true,
                        "show_checkboxes" : false
                    },
                    "default" : {
                        "icon" : { 
                            "image" : "images/folder.png"
                        },
                        "valid_children" : [ "default" ]
                    },
                    "hover_node" : false
                }
            },
            "themes" : {
                "theme" : "classic",
                "dots" : false,
                "icons" : true
            },
            "core" : { "html_titles" : true },

            "dnd" : {
                "drop_target" : "#test_area",
                "drop_finish" : function (data) {
                    if(data.o.attr("rel") === "ds") {
                      //update chart with new data here?
                      //using data.o.attr("id")
                    }
                }
            },
            "crrm" : { move : { check_move : function (m) { return false; } } },

            "plugins" : ["themes","json_data","dnd","ui","types","crrm"]
        });

我在某处读到绑定'before.jstree'事件可以帮助阻止某些节点被拖动(以及crrm位)。但我认为我做错了。似乎“start_drag”无法访问data.args [0]:

$("#statstree").bind("before.jstree", function (e, data) {
            if(data.func === "start_drag" && data.args[0].parent("li").attr("rel") != "ds") {
                e.stopImmediatePropagation();
                return false;
            }
        });

任何人都有任何想法如何才能完成这项任务?

干杯:)

编辑:我已经解决了如何阻止非'ds'节点被丢弃的问题:

"drag_check" : function (data) {
                    if(data.r.attr("rel") != "ds") {
                        return false;
                    }
                    return { 
                        after : false, 
                        before : false, 
                        inside : true 
                    };
                }

我现在要改进我的问题:

如果我有多个drop_targets,如何获取目标ID? “drop_target”:“#testarea1,#testarea2”

编辑2

多哈,在我走的时候回答我的问题!而且我现在已经坐了好几年了。这一切都在我身边闪过:

data.r.attr( “ID”)

编辑3

现在唯一剩下的问题是,尽管所有没有rel =“ds”属性的节点都不能“丢弃”到外部div / chart中,但当它们悬停在外部div / chart上时,它们仍会显示一个jstree绿色勾号图标允许的区域。任何想法如何阻止这种情况发生?

1 个答案:

答案 0 :(得分:1)

检查valid_children选项。