【问题标题】:Jquery draggable & droppable event delegation: stop & dropJquery 可拖放事件委托:停止和拖放
【发布时间】:2016-04-08 07:38:43
【问题描述】:

我的问题是获取被放置元素的位置。
我在.draggable上使用stop:option 来获得新职位。

$('.elementsDiv').draggable({
  revert: 'invalid', //Revert when drop fails
  helper: 'clone', //Drag a clone
  stop: function() {
    //Dropped position.
    Stoppos = $(this).position();
  }
});

当拖动时,我想从它的父元素中删除元素,并将其附加到它的新父元素。
这是我用.droppable做的

$('.flakUp, .flakDown').droppable({
    accept: '.elementsDiv',
    drop: function (event, ui) {

        //get dragged element
        var draggedElement = $(ui.draggable);

        //get dropZone
        var dropZone = $(this); 

        //Remove element from list and append it to dropZone
        draggedElement.detach().appendTo(dropZone.position(Stoppos));

        //Make element draggable
        draggedElement.draggable();
    }
});

当我删除/追加时,新位置将在左上角。
所以我必须从.draggable 获取放置位置,并在.droppable 放置函数中使用它来将元素移动到放置它的位置。

这是我的问题开始的地方!
在控制台中我得到:Stoppos 未定义。
我猜 droppable-drop 在 draggable-stop 之前执行?!

我该如何解决这个问题?
由于索引问题,我需要创建一个克隆。因此我还需要删除/附加元素。

【问题讨论】:

    标签: javascript jquery css jquery-ui


    【解决方案1】:

    我建议使用传递的函数的属性。

    var stopPos = {};
    var stopOff = {};
    
    $('.elementsDiv').draggable({
      revert: 'invalid', //Revert when drop fails
      helper: 'clone', //Drag a clone
      stop: function(e, ui) {
        stopPos = ui.position;
        stopOff = ui.offest;
        console.log(stopPos, stopOff);
      }
    });
    

    这将为您提供助手的位置和偏移量作为{top, left} 对象。当您将助手附加到您的 droppable 中时,您可以稍后使用它们。

    $('.flakUp, .flakDown').droppable({
      accept: '.elementsDiv',
      drop: function (event, ui) {
        var draggedElement = $(ui.draggable);
        var dropZone = $(this); 
    
        //Remove element from list and append it to dropZone
        draggedElement.detach().appendTo(dropZone.position(stopPos));
    
         //Make element draggable
         draggedElement.draggable();
      }
    });
    

    因此,您的代码并没有表面上的错误,但请注意一件小事,就是在函数之外定义了变量 stopPosstopOff。最后应该是这样的:

      $(function(){
        var stopPos = {};
        var stopOff = {};
    
        $('.elementsDiv').draggable({
          revert: 'invalid', //Revert when drop fails
          helper: 'clone', //Drag a clone
          stop: function(e, ui) {
            stopPos = ui.position;
            stopOff = ui.offest;
            console.log(stopPos, stopOff);
          }
        });
    
        $('.flakUp, .flakDown').droppable({
          accept: '.elementsDiv',
          drop: function (event, ui) {
            var draggedElement = $(ui.draggable);
            var dropZone = $(this); 
    
            //Remove element from list and append it to dropZone
            draggedElement.detach().appendTo(dropZone.position(stopPos));
    
             //Make element draggable
             draggedElement.draggable();
          }
        });
      });
    

    在这种方法中,变量可以被两者访问。如果只在函数内部定义,其他函数无法访问。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多