When I make a draggable clone and drop it in a droppable I cannot drag it again

JqueryDrag and-DropCloneJquery Ui-DraggableJquery Ui-Droppable

Jquery Problem Overview


When I make a draggable clone and drop it in a droppable I cannot drag it again. How do I do that? Secondly I can only figure out how to us .append to add the clone to the droppable. But then it snaps to the top-left corner after any existing element and not the drop position.

$(document).ready(function() {
	$("#container").droppable({
		drop: function(event, ui) {
			$(this).append($(ui.draggable).clone());
		}
	});
	$(".product").draggable({
		helper: 'clone'
	});
});
</script>

<div id="container">
</div>
<div id="products">
	<img id="productid_1" src="images/pic1.jpg" class="product" alt="" title="" />
	<img id="productid_2" src="images/pic2.jpg" class="product" alt="" title="" />
	<img id="productid_3" src="images/pic3.jpg" class="product" alt="" title="" />
</div>

Jquery Solutions


Solution 1 - Jquery

One way to do it is:

$(document).ready(function() {
	$("#container").droppable({
		accept: '.product',
		drop: function(event, ui) {
			$(this).append($("ui.draggable").clone());
			$("#container .product").addClass("item");
			$(".item").removeClass("ui-draggable product");
			$(".item").draggable({
				containment: 'parent',
				grid: [150,150]
			});
		}
	});
	$(".product").draggable({
		helper: 'clone'
	});
});

But I'm not sure if it is nice and clean coding.

Solution 2 - Jquery

I found this question via Google. I couldn't keep the positions from snapping to the container either, until I changed 'ui.draggable' to 'ui.helper' when appending:

$(this).append($(ui.helper).clone());

Solution 3 - Jquery

For those trying to reposition the dropped item. Take a look here.

https://stackoverflow.com/questions/2100896/jquery-drag-drop-and-clone.

I actually had to use code that looks like

$(item).css('position', 'absolute');
$(item).css('top', ui.position.top - $(this).position().top);
$(item).css('left', ui.position.left - $(this).position().left);

to do it.

Solution 4 - Jquery

Here is my solution, it allows for dragging and dropping a clone, and then replacing it after as needed by another drag and drop. It also has a callback function parameter which passes back the dropped div object so that you can do something with the jquery selected div once dropped.

refreshDragDrop = function(dragClassName,dropDivId, callback) {
  $( "." + dragClassName ).draggable({
    connectToSortable: "#" + dropDivId,
    helper: "clone",
    revert: "invalid"
  });
  $("#" + dropDivId).droppable({
    accept: '.' + dragClassName,
    drop: function (event, ui) {
      var $this = $(this),
        maxItemsCount = 1;
      if ($this.children('div').length == maxItemsCount ){
        //too many item,just replace
        $(this).html($(ui.draggable).clone());
        //ui.sender.draggable('cancel');
      } else {
        $(this).append($(ui.draggable).clone());
      }
      if (typeof callback == "function") callback($this.children('div'));
    }
  });
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCudosView Question on Stackoverflow
Solution 1 - JqueryCudosView Answer on Stackoverflow
Solution 2 - JqueryBob NadlerView Answer on Stackoverflow
Solution 3 - JqueryradoView Answer on Stackoverflow
Solution 4 - JqueryDamon HoganView Answer on Stackoverflow