【发布时间】:2013-04-09 12:36:11
【问题描述】:
我的问题是基于这个例子,但有一些区别.. 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("dragged")[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 上使用背景图像,所以它并不明显。 .
【问题讨论】:
-
试着用几句话来解释你的问题,人们没有时间听你所有的故事。抱歉,这很难听,但这是事实。
-
我试图尽可能彻底地解释问题所在......我将编辑答案只是为了删除编辑过的部分......
标签: javascript html drag-and-drop draggable droppable