【发布时间】:2015-10-10 06:57:33
【问题描述】:
尽管浏览了在线教程以了解原生 HTML5 拖放,但我无法理解为什么我的基本 html 页面不会触发 'drop' 事件。
这里有一个小提琴 - https://jsfiddle.net/carlv/0yeuce3u/
代码如下。 html:
<div id="wrapper">
<div id="fixedWidth">
<div id="modulesBlock">
<div id="mod1" class="module" draggable="true" ></div>
<div id="mod2" class="module" draggable="true" ></div>
<div id="mod3" class="module" draggable="true" ></div>
<div id="mod4" class="module" draggable="true" ></div>
<div id="mod5" class="module" draggable="true" ></div>
<div id="mod6" class="module" draggable="true" ></div>
<div id="mod7" class="module" draggable="true" ></div>
<div id="mod8" class="module" draggable="true"></div>
<div id="mod9" class="module" draggable="true" ></div>
<div id="mod10" class="module" draggable="true"></div>
</div>
</div>
<div id="theRest">
<div id="contentBlock">
<div class="target" id="target1" ></div>
<div class="target" id="target2" ></div>
</div>
</div>
</div>
和javascript处理事件如下:
function moduleDragStart(ev) {
console.log(ev.target.id);
ev.dataTransfer.setData("text", ev.target.id);
}
function handleDrop(e) {
e.preventDefault();
console.log('drop onto --'+e.target.id);
}
function handleDragEnter(e) {
console.log('target dragenter ='+e.target.id);
e.preventDefault();
this.classList.add('over');
}
function handleDragEnd(e) {
[].forEach.call(cols, function (col) {
col.classList.remove('over');
});
}
function handleDragLeave(e) {
this.classList.remove('over');
}
var cols = document.querySelectorAll('.target');
[].forEach.call(cols, function(col) {
col.addEventListener('dragenter', handleDragEnter, false);
col.addEventListener('dragleave', handleDragLeave, false);
col.addEventListener('dragend', handleDragEnd, false);
col.addEventListener('drop', handleDrop, false);
});
var mods = document.querySelectorAll('.module');
[].forEach.call(mods, function(mod){
mod.addEventListener('dragstart',moduleDragStart,false);
});
当我尝试将模块块(小提琴中的红色)拖到目标(小提琴中的白色)块上时,虽然我可以看到 dragenter 和 dragleave 事件正在触发,但由于某种原因,drop 事件不会触发目标上的 drop 事件侦听器元素。有什么想法吗?
【问题讨论】:
标签: javascript html drag-and-drop