【发布时间】:2011-10-22 00:45:18
【问题描述】:
我有一个可放置的div#space 和一组可拖动的li.element。当我在div#space 中拖动li.element 时,会创建一个新的ul.group,li.element 会附加到ul.group,最后ul.group 可以放置。
给定
我希望这些元素的行为如下:
- 当
li.element被丢弃在不包含它的ul.group中时,li.element将被添加到ul.group - 当
li.element被放到确实包含它的ul.group中时,li.element将恢复到原来的位置 - 当
li.element被删除到div#space(在ul.group之外)时,如上所述会创建一个新组。
问题在于,当一个元素被放到不接受它的 ul.group 上时,父级 div#space 将捕获该事件并创建一个新组。
ul.grpup 有一个 accept 函数,用于检查 droppable 是否为 element 以及它是否尚未被删除。
newULGroup.droppable({
drop: ...
accept: function(ui)
{
var isElement = ui.hasClass('element')
var elementId = '.' + ui.data().id
var isAlreadyPresent = $(this).find(elementId).length > 0
return isElement && (!isAlreadyPresent)
},
greedy: true
});
如果不是通过接受所有内容并忽略丢弃处理程序中的内容,您将如何实现此行为? (我没试过,但我想这会起作用)
编辑
尝试修复它
我修补了 jquery-ui-1.8.4.js 以将事件传递给接受函数。现在我可以使用$(event).stopPropagation() 停止传播,但我必须手动将可拖动助手动画返回到其原始位置以模拟恢复,然后将其从 dom 中移除。
accept: function(ui, event)
{
var isCriteria = ui.hasClass('criteria')
var criteriaId = '.' + ui.data().id
var isAlreadyPresent = $(this).find(criteriaId).length > 0
var accepted = isCriteria && (!isAlreadyPresent)
if (event && !accepted)
{
$(event.target).animate(ui.offset(), {complete: function() {$(this).remove()}})
$(event).stopPropagation()
}
return accepted
}
不幸的是,它似乎也破坏了原始元素的 draggable 行为。为什么,哦,为什么?
【问题讨论】:
-
我快到了:我修补了 jQuery 代码以将事件传递给接受函数。在那里我打电话给
$(event).stopPropagate(),但它也停止了可拖动的助手以恢复到原始位置。所以我对其进行了动画处理并在之后删除了......但现在原来的li.element不再是可拖动的了!!!救命!
标签: jquery-ui jquery-ui-draggable jquery-ui-droppable