【问题标题】:HTML5 Drag and Drop issue with Cloning and replacing克隆和替换的 HTML5 拖放问题
【发布时间】:2015-02-14 05:56:20
【问题描述】:

感谢您查看我的问题。在这一点上,我一直在尝试解决这个问题,阅读所有可能的 HTML5 拖放参考,并尽可能多地阅读 stackflow 上的内容,但我就是想不通。

那么我的问题:

来源:https://jsfiddle.net/dzsk7311/3/

<div id="divLeft">
  <div id="divLeft1">
    <img src="http://icons.iconarchive.com/icons/designcontest/casino/96/Banana-icon.png" draggable="true" ondragstart="drag(event)" id="drag1" width="50" height="50">
  </div>
  <div id="divLeft2">
    <img src="http://icons.iconarchive.com/icons/rokey/smooth/128/apple-icon.png" draggable="true" ondragstart="drag(event)" id="drag2" width="50" height="50">
  </div>
</div>

<div id="divRight">
  <div id="divRight1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
  <div id="divRight2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
  <div id="divRight3" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
  <div id="divRight4" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
</div>

-

function allowDrop(ev) {
  ev.preventDefault();
}

function drag(ev) {
  ev.dataTransfer.setData("text", ev.target.id);
}

function drop(ev) {
   ev.preventDefault();
   var data = ev.dataTransfer.getData("text");
   var nodeCopy = document.getElementById(data).cloneNode(true);
   ev.target.appendChild(nodeCopy);
   ev.stopPropagation();
   return false;
}

我想要完成的事情:

  • 通过克隆将图像从divLeft 拖到divRight(实际上将拖到:divRight1, divRight2, divRight3, divRight4),以确保原始图像保留在原位以供再次使用。
  • 一旦图像被拖放到四个右侧 div 之一,允许它成为一个独立的图像,可以在四个 div 之间独立拖动,而无需克隆和与另一个图像交换位置。因此,如果我在rightDiv1rightDiv3 中有一张图片,然后我将rightDiv3 中的图片拖到rightDiv1,我希望它们只是交换位置。
  • 如果要将图像从 divLeft 拖放到“divRight”,请用新图像替换该位置中已存在的图像。

问题是什么:

  • 目前我的克隆工作没有问题,但如果我从左向右拖动新图像,它不会替换右侧的图像。
  • 我也无法将右侧的图像相互拖动。

我希望这一切都有意义,并且我非常感谢任何帮助,因为我一直在绞尽脑汁。我知道我提供的代码是有限的,但我向你保证,我已经尝试了尽可能多的东西,只是想回到一个好的起点寻求支持。

再次感谢大家。

【问题讨论】:

  • 可以提供jfiddle或者sn-p代码吗?
  • 嘿 Max,我在上面的帖子中做了,你看不到它们吗?不过,这里是 jsfiddle:来源:jsfiddle.net/dzsk7311/3。非常感谢您花时间和我一起研究这个问题。

标签: jquery html drag-and-drop


【解决方案1】:

我已经修改了你的函数来更新节点 ID

function drop(ev) {
  ev.preventDefault();
  var data = ev.dataTransfer.getData("text");
  var isLeft = 'drag1' == data || "drag2" == data;
  var nodeCopy = document.getElementById(data).cloneNode(true);
  nodeCopy.id = "img" + ev.target.id;
  if (!isLeft) {
    sourceNode = document.getElementById(data);
    sourceNode.parentNode.removeChild(sourceNode);
  }
  ev.target.appendChild(nodeCopy);
  ev.stopPropagation();
  return false;
}

DEMO

【讨论】:

  • 马克斯,非常感谢!这非常聪明,我什至没有接近这个。我正在使用node.appendchild,并试图实际附加innerHTML。我的问题的一部分,甚至在此修复之前就存在。从左到右掉落时,如何让苹果代替香蕉(或香蕉代替苹果)?该功能在正确的 div 中完美运行。但是从左向右拖动时,我无法弄清楚如何替换存在的内容。这是我目前唯一的问题。我能想出其他可能存在的问题。
  • 你只需要删除目标容器中的任何节点。
  • 完成了,谢谢!享受你一天的剩余时间。我没有足够的代表来投票给你,但一旦我这样做了,我会重新审视这个并这样做。
  • 你很亲密,和平。
猜你喜欢
  • 2018-05-13
  • 2011-01-07
  • 1970-01-01
  • 2011-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
相关资源
最近更新 更多