我正在构建一个简单的拖放上传器,我想知道为什么当我console.log(e)
(DragEvent)并查看DragEvent.dataTransfer.files
时,我看不到我拖放的文件,它显示为空,但。。。如果I console.log(e.dataTransfer.files)
,它将显示丢弃的文件。
//代码
<!DOCTYPE html>
<html>
<head>
<script>
document.addEventListener("DOMContentLoaded", init);
function init(){
var dropbox = document.getElementById('dropbox');
dropbox.addEventListener('dragover', drag.over);
dropbox.addEventListener('drop', drag.drop);
}
var drag = {
"over": function(e){
e.preventDefault();
},
"drop": function(e){
e.preventDefault();
console.log(e); //NO FILES SHOWN
console.log(e.dataTransfer.files); //FILES in FileList Object
}
};
</script>
<style>
body{
margin: 0 !important;
height: 100vh;
width: 100vw;
display: flex;
justify-content: center;
}
#dropbox{
height: 400px;
width: 400px;
align-self: center;
background-color: #0089C4;
border-radius: .3em;
border: 1px dashed black;
-webkit-box-shadow: 0px 2px 7px rgba(0, 0, 0, 0.40);
box-shadow: 0px 2px 7px rgba(0, 0, 0, 0.40);
}
</style>
</head>
<body>
<div id="dropbox"></div>
</body>
</html>
拖动数据存储根据您访问它的时间有不同的模式:
- 在
dragstart
事件中,它处于读/写模式 - 在
drop
事件中,它处于只读模式 -
在所有其他事件中,它都处于保护模式。
受保护模式是这样定义的:
保护模式
对于所有其他活动。拖动数据存储中的格式和种类可以枚举表示拖动数据的项目列表,但是数据本身不可用,并且不能添加任何新数据。
请参见此处:https://html.spec.whatwg.org/multipage/interaction.html#the-拖动数据存储
这意味着,当您访问控制台中的dataTransfer
对象时,该对象不在drop
或dragstart
事件中,它处于保护模式,阻止您访问数据。
您可以查看fileList
,因为当dataTransfer
可读时,您将fileList
记录在drop
事件上。但如果您登录e.dataTransfer
或e
,您将无法访问任何数据。
你可以在这里测试,即使在dragover
上,你也无法访问dataTransfer
:中的内容
document.querySelector('#droppable').ondragover = function(e) {
console.log('on dragover files are', e.dataTransfer.files)
e.preventDefault();
}
document.querySelector('#droppable').ondrop = function(e) {
console.log('on drop files are', e.dataTransfer.files)
e.preventDefault();
}
<div id=droppable>Drop a file</div>