【问题标题】:Creating multi-select elements with Kendo drag/drop使用 Kendo 拖放创建多选元素
【发布时间】:2013-12-09 21:20:52
【问题描述】:

我有一个我在这里尝试做的例子:http://jsbin.com/OwoYAlEQ/1/edit

这是我的 HTML:

<div class="draggable" id="person-one">person one</div>
<div class="draggable" id="person-two">person two</div>
<div class="draggable" id="person-three">person three</div>
<div class="draggable" id="person-four">person four</div>

<div class="droptarget" id="role-a">role a</div>
<div class="droptarget" id="role-b">role b</div>
<div class="droptarget" id="role-c">role c</div>
<div class="droptarget" id="role-d">role d</div>
<div class="droptarget" id="role-e">role e</div>

这是我的 JavaScript:

$(".draggable").kendoDraggable({
    group: "roles",
        hint: function(element) {
        return element.clone();
    },
    dragstart: draggableOnDragStart,
    dragend: draggableOnDragEnd
});
$(".droptarget").kendoDropTarget({ 
    group: "roles",
    dragenter: droptargetOnDragEnter,
    dragleave: droptargetOnDragLeave,
    drop: onDrop
});
function draggableOnDragStart(e) {
    $(".draggable").addClass("dragging");
}
function draggableOnDragEnd(e) {
    $(".draggable").removeClass("dragging");
}
function droptargetOnDragEnter(e) {
    $(".droptarget").addClass("drop");
}
function droptargetOnDragLeave(e) {
    $(".droptarget").removeClass("drop");
}
function onDrop(e) {
    e.draggable.destroy();
    e.draggable.element.remove();
    $(".droptarget").removeClass("drop");
    $(".draggable").removeClass("dragging");
}

问题是我希望能够使用 ctrl-click 从第一个可拖动列表中选择多个项目,然后能够将它们拖动到第二个列表中的任何可放置元素。我查看了http://docs.kendoui.com/api/framework/draggable 此处的文档,并没有看到多选可拖动元素的选项。

我正在考虑绕过剑道,只使用 jQuery,我在这里找到了几个我想要的方向的例子:jQuery Sortable - Select and Drag Multiple List Items 但是如果这可以使用剑道来完成,如果它更简单,那就太好了剑道是我们在项目中非常依赖的东西。

我的示例代码遇到的第二个问题是,在拖动时添加到可拖动项目的类被添加到所有可拖动项目,而不仅仅是选定的项目。放置目标区域也存在同样的问题——当使用可拖动元素将目标区域悬停在目标区域上时,我需要使其具有某种样式,但当前所有放置目标都获得了类。对这两件事的任何帮助都会很棒!谢谢

【问题讨论】:

  • 欢迎来到 SO!您能否编辑您的问题以包含 js bin 中的相关代码(本质上是所有的 JavaScript 和 HTML 的正文)?如果该 jsbin 链接断开,这对未来的人们将非常有帮助。
  • 谢谢 Derek,我现在和将来都会确保这样做 :)

标签: jquery kendo-ui


【解决方案1】:

Kendo 开箱即用的可拖动不支持此功能,但您可以自己实现。您可以在父元素上创建它并使用filter 选项,而不是为每个元素创建一个可拖动元素。

这应该让你开始(从你的示例代码修改):

HTML:

<div id='dragoptions'>
    <div class="draggable" id="person-one">person one</div>
    <div class="draggable" id="person-two">person two</div>
    <div class="draggable" id="person-three">person three</div>
    <div class="draggable" id="person-four">person four</div>
</div>

JavaScript:

$('.draggable').click(function (e) {
    if (e.ctrlKey) {
        $(this).toggleClass("dragoption");
    }
});

$("#dragoptions").kendoDraggable({
    filter: ".dragoption",
    group: "roles",
    hint: function (element) {
        var hint = $("#dragoptions").clone();
        hint.children().not(".dragoption").hide();
        return hint;
    },
    dragstart: draggableOnDragStart,
    dragend: draggableOnDragEnd
});

$(".droptarget").kendoDropTarget({
    group: "roles",
    dragenter: droptargetOnDragEnter,
    dragleave: droptargetOnDragLeave,
    drop: onDrop
});

function draggableOnDragStart(e) {
    e.sender.draggedElementGroup = $(".dragoption");
    $(e.currentTarget).addClass("dragging");
}

function draggableOnDragEnd(e) {
    $(".draggable").removeClass("dragging");
}

function droptargetOnDragEnter(e) {
    $(e.dropTarget).addClass("drop");
}

function droptargetOnDragLeave(e) {
    $(".droptarget").removeClass("drop");
}

function onDrop(e) {
    e.draggable.draggedElementGroup.remove();

    $(".droptarget").removeClass("drop");
}

demo here

如果您希望单个元素可以在不先控制单击它们的情况下进行拖动,您可以尝试将点击处理程序更改为:

$('.draggable').mousedown(function (e) {
    if (e.ctrlKey) {
        $(this).toggleClass("dragoption");
    } else if (!$(this).hasClass("dragoption")) {
        $(this).siblings().removeClass("dragoption");
        $(this).addClass("dragoption");
    }
});

See demo.

【讨论】:

  • 非常感谢拉尔斯!我现在要玩这个,看看我能不能让它做我想做的所有事情。
  • @simonfoust 不客气 - 如果我的解决方案适合您,请告诉我,如果您觉得有帮助,请考虑接受和/或支持我的回答。
  • 我玩弄了这个并最终取出了“拖动”类,因为我现在不需要它,因为我们有“拖动选项”类来设置选定项目的样式。这几乎正​​是我所寻找的,只有一个区别。我不知道如何在没有 ctrl-click 的情况下使单个项目可拖动。有时人们不需要选择多个项目。
  • @simonfoust 在我的回答中添加了一个建议
  • 谢谢!标记为答案:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
相关资源
最近更新 更多