javascript - Kendo TreeView 移动父节点以更改排序顺序,但不允许将父节点拖到子节点下

标签 javascript jquery kendo-ui telerik kendo-treeview

我有 Kendo TreeView,其中父节点有子节点。

我想要的规则是用户可以

  1. 将父节点拖动到当前位置的上方或下方,从而改变排序顺序
  2. 不允许将父节点拖到另一个父节点上
  3. 不允许将父节点拖到任何子节点上
  4. 允许将子节点项拖到另一个父节点下

我当然更喜欢 javascript 或 jquery

这段代码只是阻止所有父节点被拖动,因此这不是我想要的。有人有这方面的样本吗?

 $(".k-treeview").data("kendoTreeView").bind("dragstart", function (e) {
    if ($(e.sourceNode).parentsUntil(".k-treeview", ".k-item").length == 0) {
       e.preventDefault();
    }
});

更新答案

如果我将它放在我的 $(document).ready(function() { ...

中,似乎几乎所有代码都可以从答案中纠正

但是如果我将该代码放在 onDrop 下,则不会被调用。

例如

  var treeview = $("#treeview").kendoTreeView({
                                    expanded: true,
                                    dragAndDrop: true,
                                    select: onSelect,
                                    loadOnDemand: false,
                                    dataSource: homogeneous,
                                    dataTextField: "ReportGroupName",
                                    template: kendo.template($("#treeview-template").html()) //,
                                    ,
                                    onDrop: function(e) {
                                        kendoTreeView = $(".k-treeview").data("kendoTreeView");
                                        kendoTreeView.bind("drag", function (e) {

                                            //Check if we're trying to add the node as a child
                                            var dropAsChild = $(e.dropTarget).hasClass("k-in k-state-hover");

                                            var sourceDataItem = kendoTreeView.dataItem(e.sourceNode);
                                            var destinationDataItem = kendoTreeView.dataItem(e.dropTarget);

                                            if ($(e.sourceNode).is(e.dropTarget)) {
                                                //Dropping on itself
                                                e.setStatusClass("k-denied");
                                            } else if (destinationDataItem && !dropAsChild) {
                                                //Dropping as a sibling... that's ok if it's the same parent
                                                if (sourceDataItem.parent().uid != destinationDataItem.parent().uid) {
                                                    //Not the same parent
                                                    e.setStatusClass("k-denied");
                                                }
                                            } else {
                                                e.setStatusClass("k-denied");
                                            }
                                        });
                                    }

                                }).data("kendoTreeView");

图像 这是一个图像,红色箭头指向我要移动到另一个父级的子级(成为带有蓝色箭头的父级的子级)

enter image description here

最佳答案

dragstart 事件的问题在于,它不会为您提供放置目标,因为它位于事件序列的早期。

实现此目的的最佳方法是根据源节点和目标节点拒绝删除操作。您可以通过在传递给 drag 事件的事件对象上调用 setStatusClass(使用 k-denied)来完成此操作。

var treeview = $("#treeview").kendoTreeView({
    expanded: true,
    dragAndDrop: true,
    select: onSelect,
    loadOnDemand: false,
    dataSource: homogeneous,
    dataTextField: "ReportGroupName",
    template: kendo.template($("#treeview-template").html()),
    drag: function (e) {
        //Check if we're trying to add the node as a child
        var kendoTreeView = $("#treeview").data("kendoTreeView");
        var dropAsChild = $(e.dropTarget).hasClass("k-in k-state-hover");

        var sourceDataItem = kendoTreeView.dataItem(e.sourceNode);
        var destinationDataItem = kendoTreeView.dataItem(e.dropTarget);

        if ($(e.sourceNode).is(e.dropTarget)) {
            //Dropping on itself
            e.setStatusClass("k-denied");
        } else if (destinationDataItem && !dropAsChild) {
            //Dropping as a sibling... that's ok if it's the same parent
            if (sourceDataItem.parent().uid != destinationDataItem.parent().uid) {
                //Not the same parent
                e.setStatusClass("k-denied");
            }
        } else {
            e.setStatusClass("k-denied");
        }
    }
}).data("kendoTreeView");

我现在无法测试上面的代码,因此它们可能存在一些错误...我相信您仍然会理解其背后的逻辑。

关于javascript - Kendo TreeView 移动父节点以更改排序顺序,但不允许将父节点拖到子节点下,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36278670/

相关文章:

javascript - Highcharts:使用相同数据在多个图表上更新系列

javascript - 从自动完成列表中选择电子邮件时无法按住 div

jquery - 剑道网格: Slow performance issue

javascript - Kendo UI 网格 - 分组标题列

javascript - 在 Javascript 中禁用 Kendo DropDownList

javascript - 如何在 iPhone Safari 中获取触摸的 X/Y 位置?

javascript - HTML 背景图片加载

javascript - Script.aculo.us Drag 'n' Drop - 恢复 onEnd 条件

javascript - 检测点击是否不是某些特定的 div

javascript - Jquery 代码不适用于 Javascript 的 html 输出