不阻止ondragover默认事件就无法触发ondrop函数
下面通过代码演示这个过程
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>HTML 5中的拖放</title>
<style type="text/css">
.div1{
width:440px;
height:240px;
background-color:#CCC;
float:left;
}
.div2{
width:440px;
height:240px;
background-color:#CCC;
float:left;
margin-left:50px;
}
.div3{
width:440px;
height:240px;
background-color:#CCC;
margin-top:5px;
}
.clear{
clear: both;
}
</style>
<script type="text/javascript">
function drag(e){
e.dataTransfer.setData("text/plain",e.target.id);
}
function drop(e){
console.log(3);
let data=e.dataTransfer.getData("text");
e.target.appendChild(document.getElementById(data));
}
//不阻止ondragover的默认动作
function allowDrop(){
console.log(1);
}
//阻止ondragover的默认动作
function allowDrop2(e){
e.preventDefault();
console.log(2);
}
</script>
</head>
<body>
<div class="div1">
<p id="p1" ondragstart="drag(event)" draggable="true">drop</p>
</div>
<div class="div2" ondrop="drop(event)" ondragover="allowDrop(event)">
<h2>不阻止默认事件</h2><hr/>
</div>
<div class="clear"></div>
<div class="div3" ondrop="drop(event)" ondragover="allowDrop2(event)">
<h2>阻止默认事件</h2><hr/>
</div>
</body>
</html>
运行结果
当拖动drop到不阻止默认事件发生的框中时,通过控制台我们发现执行了ondragover的
触发函数allowDrop()但没有执行ondrop的触发函数drop(e)。
当拖动drop到阻止默认事件发生的框中时,在ondragover触发函数allowDrop2()中阻止了ondragover默认事件的发生,此时ondrop执行了触发函数drop()。
总结
当我们将,<p>标签的内容拖动到指定位置并松开鼠标时,在这一时刻会先触发一个ondragover事件然后才会触发ondrop事件,但在ondragover中的默认动作(就如同<a>标签的默认跳转动作一样)可能会阻止ondrop事件的发生(不清楚具体原因),此时需要调用event.preventDefault(当ondragover事件被触发时会先执行被赋予的触发函数然后才会执行默认动作)阻止默认动作的执行.