You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

jQuery draggable克隆拖入dropzone后移动重复克隆的解决方法

解决拖放克隆元素后在Dropzone内移动重复克隆的问题

你的问题出在:克隆出来的元素依然带着.draggable类,而你给所有.draggable元素都绑定了draggable({helper:"clone"}),同时dropzone接受所有.draggable元素,所以移动克隆后的元素时,会再次触发drop事件生成新的克隆。

下面是两种可行的解决方法:

方案一:克隆后移除原始类,标记已拖入元素

直接给克隆后的元素去掉.draggable类,避免它被当作新的可拖入源,同时添加新类用于绑定普通拖拽行为:

.draggable{
    width: 100px;
    height: 100px;
    background-color: lightblue;
}
#dropZone{
    width:300px;
    height:300px;
    background:yellow;
    position:relative;
}
/* 可选:给拖入的元素加个样式区分 */
.dropped-element{
    cursor: move;
}
<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.js"></script>

<script>
$(document).ready(function(){
    // 仅给外部的原始draggable元素绑定带克隆的拖拽
    $( ".draggable" ).draggable({
        helper:"clone"
    });

    $( "#dropZone" ).droppable({
        accept: '.draggable', // 只接受外部的原始元素
        drop: function(event, ui){
            var obj = ui.draggable.clone()
                          .removeClass('draggable') // 移除原始类,避免触发重复克隆
                          .addClass('dropped-element'); // 标记为已拖入的元素
            $(this).append(obj);
            // 给拖入的元素绑定普通拖拽(不带克隆)
            obj.draggable();
        }
    });
});
</script>

<div id="dropZone" ></div>
<div class="draggable ui-widget-content">Drag me</div>

方案二:在drop事件里判断元素来源

如果需要保留.draggable类,可以通过判断元素的父容器,只允许外部的元素被克隆拖入:

<script src="https://code.jquery.com/jquery-3.6.0.js"></script>
<script src="https://code.jquery.com/ui/1.13.2/jquery-ui.js"></script>

<script>
$(document).ready(function(){
    $( ".draggable" ).draggable({
        helper:"clone"
    });

    $( "#dropZone" ).droppable({
        accept: '.draggable',
        drop: function(event, ui){
            // 仅当拖拽的元素来自dropzone外部时,才生成克隆
            if(!ui.draggable.parent().is('#dropZone')){
                var obj = ui.draggable.clone();
                $(this).append(obj);
                obj.draggable();
            }
        }
    });
});
</script>

<div id="dropZone" ></div>
<div class="draggable ui-widget-content">Drag me</div>

两种方案都能解决问题,方案一逻辑更清晰,彻底避免了误触发的可能;方案二则保留了原始类,适合需要复用.draggable样式的场景。

内容的提问来源于stack exchange,提问作者Hoover_Sweden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:41:31