jQuery 可放置区域中的可放置区域
jQuery droppable zone in droppable zone
我有一个名为 <ul class="droppable">
的可放置无序列表。在无序列表中,我动态生成了名为 <li class="placeholder"></li>
的列表项,它们也是可删除的。
将可拖动项目 放在 占位符之间时,一切正常。但是,当在 <li class="placeholder"></li>
本身上放置可拖动项时,可拖动项会附加到占位符和无序列表中。
所以我得到了它的双克隆。
Here's a jsfiddle 有一个直观的例子。我知道在我的页面上获得双重克隆是合乎逻辑的,但我不知道如何禁用它...
非常感谢任何帮助!
更新: 如果您将可拖动项目垂直拖动到可放置元素上,它们会自动附加吗?这怎么可能?
设法让它为你工作:
function dropping () {
$("li.placeholder").droppable({
accept: "li.to-drag",
hoverClass: "correct",
activeClass: "active",
revert: false,
tolerance: "pointer",
drop: function (event, ui) {
var dragging = ui.draggable.find("img");
$(this).append(dragging).addClass("dropped");
$(this).droppable('disable');
var day = $(ui.draggable).attr('data-id');
var index = $(event.target).index();
$(this).attr("data-id", day);
$(this).attr("date-order", index);
$(this).addClass("drop-"+ index);
$(this).attr("data-content", "");
注意: var dragging = ui.draggable.find("img");
此行使您在拖放时复制副本,因此您只需删除 clone();
。
它在目标位置创建了您拖动的项目的克隆。
现在请注意:
$("#dropzone").droppable({
accept: "li.to-drag",
revert: false,
tolerance: "pointer",
drop: function (event, ui) {
$(this).append(dragging);
//$("li.to-drag").addClass("placeholder");
$(this).droppable('disable');
}
});
}
占位符 class 的问题给您带来了麻烦。
希望这对您有所帮助。
您可以尝试解决此问题的一种方法是将所有行为移至您的 sortable
并仅使用 droppable
进行切换以确定您需要的行为。这样,您就可以在一个地方处理所有事情,这应该可以解决在同一元素上同时使用 sortable
和 droppable
的一些不良影响。像这样:
在您的 droppable 中,您将开关设置为 over
和 out
,并设置您需要的对象。
$("li.placeholder").droppable({
accept: "li.to-drag",
hoverClass: "correct",
activeClass: "active",
revert: false,
tolerance: "pointer",
over: function (e, ui) {
curDrag = ui.draggable;
curTarget = e.target;
curThis = $(this);
overSortable = true;
},
out: function (e, ui) {
overSortable = false;
},
drop: function (event, ui) {
}
});
然后,在 sortable
的 beforeStop
事件中,您检查变量 overSortable
是否为真,并在那里设置行为。所有涉及 ui.draggable、this 和 event.target 的内容都需要替换为您在 droppable 中设置的对象。一个更好的事件方法是创建一个函数来处理所有这些行为并将它们作为参数传递。
beforeStop: function (e, ui) {
if (overSortable) {
curDrag.addClass('placeholder');
var dragging = curDrag.find("img").remove();
curThis.append(dragging).addClass("dropped");
curThis.droppable('disable');
var day = curDrag.attr('data-id');
var index = $(curTarget).index();
//...
} else {
ui.item.addClass('placeholder')
}
仍有待调整,尚不完全清楚究竟应该发生什么以及何时发生,但这可以使工作变得更容易,而不是试图管理当你放下一个元素时触发的多个事件,你只管理一个.
我有一个名为 <ul class="droppable">
的可放置无序列表。在无序列表中,我动态生成了名为 <li class="placeholder"></li>
的列表项,它们也是可删除的。
将可拖动项目 放在 占位符之间时,一切正常。但是,当在 <li class="placeholder"></li>
本身上放置可拖动项时,可拖动项会附加到占位符和无序列表中。
所以我得到了它的双克隆。
Here's a jsfiddle 有一个直观的例子。我知道在我的页面上获得双重克隆是合乎逻辑的,但我不知道如何禁用它...
非常感谢任何帮助!
更新: 如果您将可拖动项目垂直拖动到可放置元素上,它们会自动附加吗?这怎么可能?
设法让它为你工作:
function dropping () {
$("li.placeholder").droppable({
accept: "li.to-drag",
hoverClass: "correct",
activeClass: "active",
revert: false,
tolerance: "pointer",
drop: function (event, ui) {
var dragging = ui.draggable.find("img");
$(this).append(dragging).addClass("dropped");
$(this).droppable('disable');
var day = $(ui.draggable).attr('data-id');
var index = $(event.target).index();
$(this).attr("data-id", day);
$(this).attr("date-order", index);
$(this).addClass("drop-"+ index);
$(this).attr("data-content", "");
注意: var dragging = ui.draggable.find("img");
此行使您在拖放时复制副本,因此您只需删除 clone();
。
它在目标位置创建了您拖动的项目的克隆。
现在请注意:
$("#dropzone").droppable({
accept: "li.to-drag",
revert: false,
tolerance: "pointer",
drop: function (event, ui) {
$(this).append(dragging);
//$("li.to-drag").addClass("placeholder");
$(this).droppable('disable');
}
});
}
占位符 class 的问题给您带来了麻烦。
希望这对您有所帮助。
您可以尝试解决此问题的一种方法是将所有行为移至您的 sortable
并仅使用 droppable
进行切换以确定您需要的行为。这样,您就可以在一个地方处理所有事情,这应该可以解决在同一元素上同时使用 sortable
和 droppable
的一些不良影响。像这样:
在您的 droppable 中,您将开关设置为 over
和 out
,并设置您需要的对象。
$("li.placeholder").droppable({
accept: "li.to-drag",
hoverClass: "correct",
activeClass: "active",
revert: false,
tolerance: "pointer",
over: function (e, ui) {
curDrag = ui.draggable;
curTarget = e.target;
curThis = $(this);
overSortable = true;
},
out: function (e, ui) {
overSortable = false;
},
drop: function (event, ui) {
}
});
然后,在 sortable
的 beforeStop
事件中,您检查变量 overSortable
是否为真,并在那里设置行为。所有涉及 ui.draggable、this 和 event.target 的内容都需要替换为您在 droppable 中设置的对象。一个更好的事件方法是创建一个函数来处理所有这些行为并将它们作为参数传递。
beforeStop: function (e, ui) {
if (overSortable) {
curDrag.addClass('placeholder');
var dragging = curDrag.find("img").remove();
curThis.append(dragging).addClass("dropped");
curThis.droppable('disable');
var day = curDrag.attr('data-id');
var index = $(curTarget).index();
//...
} else {
ui.item.addClass('placeholder')
}
仍有待调整,尚不完全清楚究竟应该发生什么以及何时发生,但这可以使工作变得更容易,而不是试图管理当你放下一个元素时触发的多个事件,你只管理一个.