jQuery UI Droppable and Sortable - 放置在正确的排序位置
Posted
技术标签:
【中文标题】jQuery UI Droppable and Sortable - 放置在正确的排序位置【英文标题】:jQuery UI Droppable and Sortable - dropping in the correct sort location 【发布时间】:2013-11-12 23:07:44 【问题描述】:我正在做一个项目,我正在使用 droppable 和 sortable 的组合将元素从 3rd 方 jQuery 控件拖动到 jQuery sortable。
这工作得很好,除了要添加的项目总是添加到可排序列表的底部,然后您必须将其作为单独的步骤移动到正确的位置。
是否可以将项目添加到您在列表中放置它的位置?
您可以在here 的 jQuery 购物卡可放置演示中看到此行为。这是相同代码的jsfiddle。当您将产品中的商品添加到底部的购物车时,它始终会添加到底部,即使您将其放在顶部附近也是如此。
这是 jQuery 代码:
$(function ()
$("#catalog").accordion();
$("#catalog li").draggable(
appendTo: "body",
helper: "clone"
);
$("#cart ol").droppable(
activeClass: "ui-state-default",
hoverClass: "ui-state-hover",
accept: ":not(.ui-sortable-helper)",
drop: function (event, ui)
$(this).find(".placeholder").remove();
$("<li></li>").text(ui.draggable.text()).appendTo(this);
).sortable(
items: "li:not(.placeholder)",
sort: function ()
$(this).removeClass("ui-state-default");
);
);
【问题讨论】:
【参考方案1】:使用droppable's
drop
事件的callback
将current top offset position of the draggable helper
与top offset
中已经存在或之前添加到droppable
中的每个元素进行比较
drop: function (event, ui)
if($(this).find(".placeholder").length>0) //add first element when cart is empty
$(this).find(".placeholder").remove();
$("<li></li>").text(ui.draggable.text()).appendTo(this);
else
var i=0; //used as flag to find out if element added or not
$(this).children('li').each(function()
if($(this).offset().top>=ui.offset.top) //compare
$("<li></li>").text(ui.draggable.text()).insertBefore($(this));
i=1;
return false; //break loop
)
if(i!=1) //if element dropped at the end of cart
$("<li></li>").text(ui.draggable.text()).appendTo(this);
DEMO WITH CODE
FULL SCREEN DEMO
【讨论】:
【参考方案2】:这样做怎么样?我认为同时使用 connectToSortable 和 connectWith 选项都有效。可能有一种更聪明的方法来隐藏/显示占位符,但这绝对有效。
$(function ()
$("#catalog").accordion();
$("#catalog li").draggable(
appendTo: "body",
helper: "clone",
connectToSortable: "#cart ol"
);
$("#cart ol").sortable(
items: "li:not(.placeholder)",
connectWith: "li",
sort: function ()
$(this).removeClass("ui-state-default");
,
over: function ()
//hides the placeholder when the item is over the sortable
$(".placeholder").hide();
,
out: function ()
if ($(this).children(":not(.placeholder)").length == 0)
//shows the placeholder again if there are no items in the list
$(".placeholder").show();
);
);
Work Demo in Fiddle
【讨论】:
+1 很棒的解决方案,因为它还包含一个占位符,这让用户可以清楚地看到他们选择的项目也在放置时进行排序。 很好的解决方案。但是,我使用的第 3 方控件没有实现来自 jQueryUI 的 connectTo,所以我无法使用它。我试图在我的问题中指出这一点,但没有详细说明,因此不会有太多关于控件本身的问题。感谢您的帮助。 这是一个很好的解决方案,但小提琴示例在我移出可放置区域后没有显示占位符。以上是关于jQuery UI Droppable and Sortable - 放置在正确的排序位置的主要内容,如果未能解决你的问题,请参考以下文章
使用 jquery-ui droppable 时,如何从 droppable 区域中删除已经删除的项目?
jQuery UI (Droppable):如果 droppable 具有相对/绝对的 css 位置,则可拖动元素不会放置在鼠标指针处
jQuery UI 的贪婪 droppable 无法按预期工作
如何在 jQuery UI 中使用 Draggable 和 Droppable 将拖动的 li 添加到可放置的 ui 中?