【问题标题】:drag div is creating more divs拖动 div 正在创建更多 div
【发布时间】:2016-03-04 19:09:15
【问题描述】:

我正在尝试拖动一些 .draggable div 并放入 .droppable div。

我有一个工作示例 (http://jsfiddle.net/amrezfq1/),但我有两个问题:

第一个问题:当我拖动 .draggable div 并放入 .droppable div 时,.draggable div 不会停留在我放置的位置,它总是在 div 的左侧对齐。 (我认为这是因为 append(),但不知道如何解决这个问题)

第二个问题:我想拖动我放在里面的 div。 droppable div,但是当我这样做时,每次我在 .droppable 中拖动一个 div 时,它都会再创建一个 .draggable div。

你能帮忙把这个工作正常吗?

jQuery:

$(function () {
    $(".draggable").draggable({
        helper: 'clone',
        revert: 'invalid'
    });
    $(".droppable").droppable({
        drop:function(event,ui){
            var element=$(ui.draggable).clone();
            $(this).append(element);
            $(element).draggable();  
        }
    });
});

【问题讨论】:

    标签: javascript jquery html jquery-ui


    【解决方案1】:

    试试这个。删除元素后,我添加了一个名为 dragged 的类。这避免了在同一元素上进一步调用 drop 事件。还提取了被删除元素的 offset() 来设置它的位置。

    更新:我已更改代码以使用 ui.offset.left 和 $(this).offset().left 的差异提取左边距。不幸的是,没有使用相同的逻辑提取顶部边距。所以我添加了我自己的计算来动态确定它。

    var itemsCount = 0;
    var factor = 1.1;
    
    $(function () {
        $(".draggable").draggable({
            helper: 'clone',
          revert: 'invalid'
        });
        $(".droppable").droppable({
            drop:function(event,ui){
                 if(!$(ui.draggable).hasClass("dragged")){
                    var element = $(ui.draggable).clone();                
                    $(element).css({"left": ui.offset.left - $(this).offset().left});
                    if(itemsCount > 0)
                    {
                     var adjustedHeight = ($('.ui-draggable').css("height").replace("px","") * itemsCount * factor);   
                     $(element).css({"top" : ui.offset.top - ($(this).offset().top + adjustedHeight)}); 
                    }
                    $(element).addClass("dragged");
                    $(element).draggable(); 
                    $(this).append(element);
                    itemsCount++;
                 }
            }
        });
    });
    

    例如:http://jsfiddle.net/amrezfq1/3/

    【讨论】:

    • 谢谢,您的解决方案有效,只有一个问题!被拖到 .droppable 的第一个 .draggable div 保持在我们放置的位置,但是如果您拖动第二个 .draggable div,则第二个 .draggable div 总是下降到 .droppable 中放置的第一个 .draggable div 之下。
    • 我已经更新了解决方案和小提琴链接。请按照更新部分进行操作。
    【解决方案2】:

    位置关闭的原因是因为您正在克隆可拖动元素,而您实际定位的元素是助手。您可以通过克隆帮助程序而不是实际的可拖动对象来解决此问题。

    要解决重复问题,您可以使用 droppable 的 accept 选项来确保接受的可拖动对象不在 droppable 中,如下所示:

    $(function() {
      $(".draggable").draggable({
        helper: 'clone',
        revert: 'invalid'
      });
      $(".droppable").droppable({
        accept: ':not(.droppable > .draggable)',
        drop: function(event, ui) {
          var element = ui.helper.clone();
          $(this).append(element);
          $(element).draggable({
            containment: this
          });
        }
      });
    });
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <script src="//code.jquery.com/ui/1.9.2/jquery-ui.js"></script>
    <div class="draggable">draggabel</div>
    <div class="droppable">droppable</div>

    【讨论】:

    • 感谢您的回答。它工作正常。但是,当您将 div .draggable 拖动到 .droppable 时,您可以将该 div 拖动到黄色 div 之外,但我不希望这样。我只想移动黄色 div 内的 div!
    • @ProjecT 你可以使用containment 选项。顺便说一句,我在原始问题中没有看到任何这样的观点。一旦您在本网站获得答案,不鼓励提出新的要求。这是一个Q&amp;A 网站,如果您想根据答案做进一步的事情,请做一些研究,如果您之后遇到问题,请提出不同的问题...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多