javascript - Jquery drag drop revert to original position and div on double click -
i have drag-and-drop items, intended dragged 1 div
, dropped div
. capture original position of each item in hidden fields when created.
i want items go original div
, location on dblclick
, relocate inside drop target div
.
any ideas?
<div id="cardpiles"> <div id="d1" class="draggable" ondblclick="rev(this)">1</div> <div id="d2" class="draggable" ondblclick="rev(this)">2</div> <div id="d3" class="draggable" ondblclick="rev(this)">3</div> <div id="d4" class="draggable" ondblclick="rev(this)">4</div> <div id="d5" class="draggable" ondblclick="rev(this)">5</div> <div id="d6" class="draggable" ondblclick="rev(this)">6</div> </div>
function rev(me) { var b = $(me).text(); var h = $('#h' + b).text(); var s = h.split(','); var top = s[0]; var left =s[1]; $(me).parent().css({ position: 'relative' }); //tried absolute $(me).css({top:top,left:left,position:'absolute' }); }
here possible answer. if not fit use case, edit post more details.
working example: https://jsfiddle.net/twisty/u1rd9dpg/6/
html
<div id="cardpiles"> <div id="d1" class="draggable ui-widget-content" data-origin="">1</div> <div id="d2" class="draggable ui-widget-content" data-origin="">2</div> <div id="d3" class="draggable ui-widget-content" data-origin="">3</div> <div id="d4" class="draggable ui-widget-content" data-origin="">4</div> <div id="d5" class="draggable ui-widget-content" data-origin="">5</div> <div id="d6" class="draggable ui-widget-content" data-origin="">6</div> </div> <div id="carddrop"> </div>
jquery
function rev(me) { console.log("doubleclick detected."); var pos = me.data("origin"); console.log("returning to: ", pos); var $o = me.clone(); $o.draggable({ cursor: "move", start: log }); me.remove(); if ($("#cardpiles div").length == 0) { $("#cardpiles").append($o); return true; } $("#cardpiles .draggable").each(function(k, v) { var txt = parseint($(v).text()); if ($o.data("order") < txt) { $(v).before($o); return false; } else { $("#cardpiles").append($o); } }); } function log(e, ui) { var pos = ui.offset; var $ob = $("#" + ui.helper.attr("id")); pos.order = parseint(ui.helper.text()); $ob.attr("data-top", pos.top); $ob.attr("data-left", pos.left); $ob.attr("data-order", pos.order); $ob.attr("data-origin", [pos.top, pos.left, pos.order].join(",")); console.log("dragstart position: ", pos); console.log("logged: " + [$ob.data("top"), $ob.data("left"), $ob.data("order")].join(",")); } $(function() { $(".draggable").draggable({ cursor: "move", start: log }); $("#carddrop").on("dblclick", ".dropped", function() { console.log("origin found: ", $(this).data("origin"), $(this).data("top")); rev($(this)); }); $("#carddrop").droppable({ accept: "#cardpiles div", activeclass: "ui-state-highlight", drop: function(e, ui) { var $drop = ui.draggable.clone(); console.log("dropped. origin: ", $drop.data("origin")); $drop.removeattr("style"); $drop.addclass("dropped"); $(this).append($drop); ui.draggable.remove(); var c = $("#carddrop div").length; } }).sortable({ revert: true }); });
i'm not sure if need in css or not, went based on order , let css define how appear in list.
when drag
starts, log origin details various data attributes. allows them retrieved later when there interaction element.
when drop
happens, clone original , append clone. not have this, yet me, helps me identify whats happening. since it's no longer draggable
, remove class, added dropped
able more catch double click event.
when dblclick
fires on our object, clone again, , re-append back. make .draggable()
again too. hunt next item's number , fit in underneath.
if text within not easy order that, add order
attribute or populate data-order
attribute. can when it's dragged or read id... not sure might work best you.
you can on , on , drag of them out of #cardpile
if like.
Comments
Post a Comment