限制 jQuery 可拖动项与兄弟元素重叠/碰撞

Posted

技术标签:

【中文标题】限制 jQuery 可拖动项与兄弟元素重叠/碰撞【英文标题】:Restrict jQuery draggable items from overlapping/colliding with sibling elements 【发布时间】:2012-07-12 05:22:31 【问题描述】:

我需要使用 jQuery UI 通过一些额外的限制来限制可拖动对象的包含区域。我需要防止可拖动元素与同一容器中的其他元素重叠。我需要允许在“moveInHere”区域而不是“butNotHere”区域移动。有可能吗?

<div id="moveInHere">

    <div id="dragMe"> </div>

    <div id="butNotHere"> </div>

</div>


<script type="text/javascript">

    $("#dragMe").draggable(
        containment: "#moveInHere"
    );

</script>

【问题讨论】:

【参考方案1】:

编辑:新解决方案

我为此找到了一个名为 JQuery UI Draggable Collision 的插件。使用它,实现您想要的功能变得微不足道。请参阅以下 jsFiddle 示例:http://jsfiddle.net/q3x8w03y/1/(它使用 1.0.2 版的 JQuery UI Draggable Collision,以及 JQuery 1.7.2 和 JQueryUI 1.1.18。)

代码如下:

$("#dragMe").draggable(
    obstacle: "#butNotHere",
    preventCollision: true,
    containment: "#moveInHere"
);

旧解决方案

以下应该有效。不过,它有一个小故障。一旦 div 发生碰撞,您必须“重新抓取”您拖动的 div,这可能有点烦人。也许其他人会知道如何解决这个问题。可以看我的jsFiddle例子here:http://jsfiddle.net/MrAdE/8/

var prevOffset, curOffset;
$("#dragMe").draggable(
    drag: function(e,ui) 
        prevOffset= curOffset;
        curOffset= $.extend(,ui.offset);
        return true;
    
);

$("#butNotHere").droppable(
    greedy: true,
    over: function(e,ui) 
        ui.helper.offset(curOffset= prevOffset).trigger("mouseup");
    ,
    tolerance: "touch"
);​

【讨论】:

+1 巧妙地使用droppableover事件触发mouseup 您知道您的新解决方案是否与 JQuery 1.10 兼容?我遇到了错误。 这个 jsfiddle 不再工作了。答案应更新版本等详细信息 @Kukeltje JSFiddle 删除了我为示例上传的第三方文件。看起来你不能再上传第三方文件了,所以我把它们嵌入到了 JavaScript 部分。这是新示例:jsfiddle.net/q3x8w03y/1 我会用版本更新答案。 新解决方案不适用于 jQuery UI 1.10 及更高版本【参考方案2】:

这让我费了不少心思。基本上我在要避免的元素上创建了一个droppable,然后在拖动结束时设置一个布尔值。然后,我在未记录的还原函数覆盖中使用它来取消删除。仅当#dragMe 完全超过#butNotHere 时才有效:

$(document).ready(function()
    var shouldCancel = false;
    $('#dragMe').draggable(
        containment: '#moveInHere',
        revert: function()
            if (shouldCancel) 
                shouldCancel = false;
                return true;
             else 
                return false;
            
        
    );
    $('#butNotHere').droppable(
        over: function()
            shouldCancel = true;
        ,
        out: function()
            shouldCancel = false;
        
    );
);

查看工作演示并随意使用它:http://jsfiddle.net/H59Nb/31/

【讨论】:

以上是关于限制 jQuery 可拖动项与兄弟元素重叠/碰撞的主要内容,如果未能解决你的问题,请参考以下文章

ui jquery 可拖动元素

jQuery UI – 可拖动的“捕捉”事件

jQuery可拖动问题

包含到父级的JQuery Draggable和额外的一个

JQuery Draggable 包含到父级和一些额外的

jquery draggable - 删除拖动元素