[英]Why does the 'drop' event not fire on this web page?
Despite trawling the online tutorials to understand native HTML5 drag'n'drop I cannot understand why the 'drop' event wont fire for my basic html page. 尽管在线浏览教程以了解本机HTML5拖放,但我无法理解为什么'drop'事件不会触发我的基本html页面。
A fiddle is here - https://jsfiddle.net/carlv/0yeuce3u/ 这里有一个小提琴 - https://jsfiddle.net/carlv/0yeuce3u/
Code is as follows. 代码如下。 Html:
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>
and javascript to handle events is as follows: 和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);
});
When I try to drag a module block (red in fiddle) onto a target (white in fiddle) block, whilst I can see the dragenter and dragleave events firing, for some reason drop event doesnt fire the drop event listener on target element. 当我尝试将模块块(小提琴中的红色)拖动到目标(白色小提琴)块时,虽然我可以看到dragenter和dragleave事件触发,但由于某种原因,drop事件不会触发目标元素上的drop事件侦听器。 Any ideas ?
有任何想法吗 ?
You haven't defined the dragover
event. 您尚未定义
dragover
事件。 If you do it, it works fine. 如果你这样做,它工作正常。 Just use the same function as you use for the
dragenter
or define a simple one: 只需使用与
dragenter
相同的功能或定义一个简单的功能:
function handleDragOver(e) {
e.preventDefault();
}
....
col.addEventListener('dragover', handleDragEnter, false);
Once you do that, it drops fine. 一旦你这样做,它就会掉线。 You can see it working here (or on this JSFiddle ):
你可以看到它在这里工作(或在这个JSFiddle上 ):
function moduleDragStart(ev) { console.log(ev.target.id); ev.dataTransfer.setData("text", ev.target.id); } function handleDrop(e) { // this / e.target is current target element. e.preventDefault(); console.log('--'+e.target.id); } function handleDragEnter(e) { // this / e.target is the current hover target. e.preventDefault(); this.classList.add('over'); } function handleDragEnd(e) { // this/e.target is the source node. [].forEach.call(cols, function (col) { col.classList.remove('over'); }); } function handleDragLeave(e) { this.classList.remove('over'); // this / e.target is previous target element. } // NEW FUNCTION! function handleDragOver(e) { e.preventDefault(); } var cols = document.querySelectorAll('.target'); [].forEach.call(cols, function(col) { col.addEventListener('dragenter', handleDragEnter, false); col.addEventListener('dragleave', handleDragLeave, false); col.addEventListener('dragover', handleDragOver, false); col.addEventListener('drop', handleDrop, false); }); var mods = document.querySelectorAll('.module'); [].forEach.call(mods, function(mod){ mod.addEventListener('dragstart',moduleDragStart,false); // moved the dragend here, as it's applied to mod and not to col mod.addEventListener('dragend', handleDragEnd, false); });
html,body { height: 100%; margin: 0px; padding: 0px; } .module { height:50px; width:50px; background:red; float:left; margin:10px; } .target { float:left;height:100px; width:100px; background:white;margin:20px;border:1px solid;} .target.over { border: 2px dashed #000; } #contentBlock { width:100%; height:100%; } #fixedWidth{ width: 300px; float: left; background: blue; height:100%; } #theRest{ background: green; min-width:1000px; width:100%; height:100%; } #wrapper { overflow:scroll; height:100%; width:100%; float:left; } #contentHeader { width:100%; height:75px; background: orange; padding: 10px; } #logoBlock { height:75px; background: yellow; padding: 10px; } #userBlock { height:75px; background: white; padding: 10px; } #modulesBlock { background: yellow; padding: 10px; }
<div id="wrapper"> <div id="fixedWidth"> <div id="logoBlock">logoblock</div> <div id="userBlock">logoblock</div> <div id="modulesBlock"> <p>modulesBlock</p> <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="contentHeader">content header</div> <div id="contentBlock"> <div class="target" id="target1" ></div> <div class="target" id="target2" ></div> </div> </div> </div>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.