【发布时间】:2018-06-30 07:48:04
【问题描述】:
我被这个 DOM 异常困住了。我有 div 元素和一个按钮 - 当用户单击按钮时,会选择一个随机 div,在该 div 上附加另一个 div。这另一个 div 有一个设置了背景颜色的类。换句话说,当用户点击按钮时,一个随机的 div 容器会被另一个随机颜色的 div 填充。然后我希望用户能够将这个新创建的彩色 div 拖到一个空的 div 上。这就是问题所在。这是我的标记:
<div class="row">
<div class="empty border"></div>
<div class="empty border"></div>
<div class="empty border"></div>
<div class="empty border"></div>
<div class="empty border"></div>
<div class="empty border"></div>
</div>
单击按钮后(添加了一个新的 div)如下所示:
<div class="row">
<div class="empty border"></div>
<div class="empty border">
<div class="filled" draggable="true" id="test
style="background-color: rgb(242, 202, 185);"></div>
</div>
<div class="empty border"></div>
<div class="empty border"></div>
<div class="empty border"></div>
<div class="empty border"></div>
</div>
所以,当“填充”的 div 被放入 dropzone(一个空的 div)时,我得到了这个未捕获的异常。这是我的 JS:
const prepareForDrag = () => {
let divElements = Array.from(document.getElementsByTagName('div'));
let emptyCubes = divElements.filter(cube => cube.classList.contains('empty'));
let filledCubes = divElements.filter(cube => cube.classList.contains('filled'));
emptyCubes.forEach(function (cube) {
cube.addEventListener('dragover', dragOver);
cube.addEventListener('drop', drop);
})
filledCubes.forEach(function (cube) {
cube.addEventListener('dragstart', dragStart);
})
function dragStart (e) {
emptyCubes.forEach(cube => cube.classList.add('dropzone-border'));
e.dataTransfer.setData('text/plain', e.target.getAttribute('id'));
}
function dragOver (e) {
e.preventDefault();
}
function drop (e) {
let coloredCube = e.dataTransfer.getData('text/plain');
e.target.appendChild(document.getElementById(coloredCube));
emptyCubes.forEach(cube => cube.classList.remove('dropzone-border'));
}
}
我清楚地理解的是,当我释放鼠标按钮时,它会尝试同时附加父 div 和“填充”一个,但我真的找不到解决方案。任何帮助和残酷的批评将不胜感激:)
【问题讨论】:
标签: javascript html css drag-and-drop