我有一个 droppablediv#space
和一个 draggable 集合li.element
。当我li.element
在div#space
新ul.group
创建的 a 中拖动 a 时,将li.element
附加到 theul.group
并最终将其设为ul.group
droppable。
给定
我希望这些元素的行为如下:
- 当 an
li.element
被放入ul.group
不包含它的 中时,li.element
将被添加到ul.group
- 当 an
li.element
被放入包含它的那个中时,ul.group
将恢复到它的原始位置li.element
- 当 an
li.element
被放入div#space
(在 a 之外ul.group
)时,会创建一个新组,如上所述。
问题是当一个元素被放到一个ul.group
不接受它的元素上时,父元素div#space
会捕捉到这个事件并创建一个新组。
有ul.grpup
一个接受函数来检查 droppable 是否是一个元素以及它是否尚未被删除。
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
}
不幸的是,它似乎也破坏了原始元素的可拖动行为。为什么,哦,为什么?