我的问题是基于这个例子,但有一些区别.. http://jsfiddle.net/raad/SSxdB/15/
我使用一个菜单,它有 3-4 个类别,每个类别有 4 个项目.. 所以我想将一个元素拖放到指定的 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 draggedOrNewNodeId = "dragged-"+data;
var theNode = document.getElementById(data);
var draggedNode = document.getElementById(draggedOrNewNodeId);
if (draggedNode != null) { ev.target.removeChild(draggedNode); }
var nodeCopy = theNode.cloneNode(true);
nodeCopy.id = draggedOrNewNodeId;
nodeCopy.setAttribute("class", "dragged");
nodeCopy.setAttribute("draggable", "false");
document.getElementById(data).style.display = "none";
remove_id = draggedOrNewNodeId + "_remove";
nodeCopy.innerHTML="<span class='undo' id='" + remove_id + "'>x</span>";
ev.target.appendChild(nodeCopy);
var remove = document.getElementsByClassName("undo").length;
for (i=0; i<remove; i++) {
var nodeToBeRemoved = /_remove$/;
var nodeToBeReplaced = /dragged-/;
deletedNode = remove_id.replace(nodeToBeRemoved, "");
restoredNode = deletedNode.replace(nodeToBeReplaced, "");
document.getElementsByClassName("undo")[i].onclick = function() {
elem = document.getElementById(deletedNode);deleted
elem.parentNode.removeChild(elem);
document.getElementById(restoredNode).style.display = "block";
}
}
}
这是“导致”我的问题的部分,如果已经放置了 2 个或移动 div,它们就会全部消失。另一个问题是,如果我将它插入到 allowDrop(ev) 函数中,它实际上确实删除了以前的元素,并且在放置新元素时放置了新元素..但是当元素超过 div 时它会删除它们..但是我希望在放置时完成..所以当我移动这段代码时要删除函数,它确实删除了先前输入的元素,但它“消失”了新元素..以及......无法说明为什么会这样......我也想建议替换 temp_node = document. getElementsByClassName("拖动")[0]; 更具体的(也许是来自指定 ev.target 的子节点?
tempNodeCheck = hasClass(ev.target, "dragged");
if (tempNodeCheck) {
var nodeToBeReplacedcopy = /dragged-/;
tempParentNode = ev.target.parentNode;
temp_node = document.getElementsByClassName("dragged")[0];
temp_node1 = document.getElementsByClassName("dragged")[0].id;
restoredNode = temp_node1.replace(nodeToBeReplacedcopy, "");
temp_node1.parentNode.removeChild(temp_node1);
document.getElementById(restoredNode).style.display = "block";
html看起来像这样
<div id="drag1" draggable="true" ondragstart="drag(event)"></div>
<div id="drag2" draggable="true" ondragstart="drag(event)"></div>
<div id="drag3" draggable="true" ondragstart="drag(event)"></div>
<div id="drag4" draggable="true" ondragstart="drag(event)"></div>
<div class="droparea" id="drop1" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="droparea" id="drop2" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="droparea" id="drop3" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="droparea" id="drop4" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
<div class="droparea" id="drop5" ondrop="drop(event)" ondragover="allowDrop(event)"></div>
这里是 jsfiddle 类型的http://jsfiddle.net/q5FAq/3/ 但我也注意到,如果删除的 div 包含 sth 在里面,它不会与 div 一起“移动”.. (目前在什么我试过我在每个 div 上都使用了背景图片,所以它并不明显..