我正在开发一个项目,我将元素从第三方jQuery控件拖动到jQuery sortable,使用droppable和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");
}
});
});
答案 0 :(得分:22)
使用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);
}
}
}
答案 1 :(得分:17)
这样做怎么样?我认为使用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();
}
}
});
});