在删除组件时,它会在droppable上多次添加它

时间:2014-07-15 12:15:15

标签: javascript jquery-ui jquery-ui-draggable jquery-ui-sortable jquery-ui-droppable

我正在使用返回<div>的自定义帮助方法,在删除<div>时多次添加它。请查看代码以更好地理解

var dropHelp = true;


$(".product").draggable({
revert: 'invalid',
cursorAt: { top: -12, left: -20 },
 connectToSortable: ".droppable",
helper: function(event) {
  return $('<div class="helper">Helper</div>');
}
});
$(".droppable").sortable({
  placeholder: "ui-state-highlight"
}).disableSelection();
$(".droppable").droppable({
drop: function(event, ui) {
    if(dropHelp){
       //clone and remove positioning from the helper element
       var newDiv = $(ui.helper).clone(false)
           .removeClass('ui-draggable-dragging')
           .css({position:'relative', left:0, top:0});            
       $(this).append(newDiv);

    //drop the draggable source element
    } else {
       $(this).append(ui.draggable);
    }
 }
 });

$('#dropDrag').click(function(){
dropHelp = !dropHelp;
});

这是HTML

<button id="dropDrag">Toggle drop "Helper" or "Draggable"</button><br/><br/><br/>

<div class="product">Product 1</div>
<div class="product">Product 2</div>
<div class="product">Product 3</div>

<div class="droppable">Drop Target</div>

完整的代码可以找到here

我发现如果我们删除了拖放中的connectToSortable属性,它将正常工作。但是我需要那个属性,而且我没有理解为什么在设置connectToSortable时它会以这种方式运行。

1 个答案:

答案 0 :(得分:2)

drop()被调用两次,因为connectToSortable也在触发drop()。 (可排序已经是可放置的)

我已经编辑了您的代码,以便使用receive sortable

功能获得相同的结果

<强> DEMO

var dropHelp = true;


  $(".product").draggable({
    revert: 'invalid',
    cursorAt: { top: -12, left: -20 },
     connectToSortable: ".droppable",
    helper: function(event) {
      return $('<div class="helper">Helper</div>');
    },
      stop: function(){
        $(this).css({opacity:1});
    },
       start: function(){
        $(this).css({opacity:0});
    },
  });
  $(".droppable").sortable({
      placeholder: "ui-state-highlight",
      receive: function(event, ui) {
          if(dropHelp){
           //clone and remove positioning from the helper element
           var newDiv = $(ui.helper).clone(false)
               .removeClass('ui-draggable-dragging')
               .css({position:'relative', left:0, top:0});            
           $(this).append(newDiv);

        //drop the draggable source element
        } else {
           $(this).append(ui.draggable);
        }

  }
  }).disableSelection();


$('#dropDrag').click(function(){
    dropHelp = !dropHelp;
});