Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery ui 如果内部Dropable不接受Dragable,则防止drop事件传播到父级_Jquery Ui_Jquery Ui Draggable_Jquery Ui Droppable - Fatal编程技术网

Jquery ui 如果内部Dropable不接受Dragable,则防止drop事件传播到父级

Jquery ui 如果内部Dropable不接受Dragable,则防止drop事件传播到父级,jquery-ui,jquery-ui-draggable,jquery-ui-droppable,Jquery Ui,Jquery Ui Draggable,Jquery Ui Droppable,我有一个可拖放的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
和一组可拖放的
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
    将恢复到它的原始位置
  • li.元素
    被放入
    div#space
    (在
    ul.组
    之外)时,如上所述,将创建一个新组
  • 问题是,当一个元素被丢弃在一个不接受它的
    ul.group
    上时,父
    div#space
    将捕获该事件并创建一个新的组

    ul.grpup
    有一个accept函数,用于检查可删除项是否为元素以及是否尚未删除

    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
    });
    
    如果不是接受所有内容并忽略drop处理程序中的内容,您将如何实现此行为?(我还没试过,但我想那会管用的)


    编辑

    试图修复它 我修补了jquery-ui-1.8.4.js以将事件传递给accept函数。现在,我可以使用
    $(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
    }
    

    不幸的是,它似乎也破坏了原始元素的可拖动行为。为什么,为什么?

    我设法实现了类似的行为,尽管使用了未记录的jQuery.ui特性

    如果您查看
    jquery.ui.draggable
    实现(至少对于v1.8.16),那么
    revert
    选项也可以是一个函数。它具有
    为可拖动元素,单个参数为接受拖放的可拖放对象,返回值为
    布尔值
    ,用于指示是否恢复可拖动对象

    所以在你的情况下,你需要

  • 让您的
    div#space
    ul.group
    始终接受投递并保持贪婪
  • 仅当ul.group
    drop
    处理程序和流程项目不在该组中时,才检查该项目
  • 在draggable
    revert
    功能中执行类似的检查,如果它已经在组中,则恢复自身

  • 尽管使用了未记录的jQuery.ui特性,我还是设法实现了类似的行为

    如果您查看
    jquery.ui.draggable
    实现(至少对于v1.8.16),那么
    revert
    选项也可以是一个函数。它具有
    为可拖动元素,单个参数为接受拖放的可拖放对象,返回值为
    布尔值
    ,用于指示是否恢复可拖动对象

    所以在你的情况下,你需要

  • 让您的
    div#space
    ul.group
    始终接受投递并保持贪婪
  • 仅当ul.group
    drop
    处理程序和流程项目不在该组中时,才检查该项目
  • 在draggable
    revert
    功能中执行类似的检查,如果它已经在组中,则恢复自身

  • 我差不多做到了:我修补了jQuery代码以将事件传递给accept函数。在那里,我调用了
    $(event).stopPropagate()
    ,但它也停止了可拖动的辅助对象以恢复到原始位置。所以我设置了它的动画,并在。。。但是现在原来的
    li.element
    已经不能拖动了!!!救命啊!我差不多做到了:我修补了jQuery代码以将事件传递给accept函数。在那里,我调用了
    $(event).stopPropagate()
    ,但它也停止了可拖动的辅助对象以恢复到原始位置。所以我设置了它的动画,并在。。。但是现在原来的
    li.element
    已经不能拖动了!!!救命啊!