I'm building a simple drag n' drop uploader and I'm wondering why I can't see the file(s) I drop when I console.log(e)
(DragEvent) and look at the DragEvent.dataTransfer.files
it shows up empty, but... if I console.log(e.dataTransfer.files)
it will show the dropped file(s).
//CODE
<!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>
The drag data store has different modes depending on when you access it:
dragstart
event it's on read/write mode.drop
event, it's in read only mode.And on all other events, it's in protected mode.
Protected mode is defined this way:
See here: https://html.spec.whatwg.org/multipage/interaction.html#the-drag-data-store
That means that when you access the
dataTransfer
object in your console, which is not ondrop
ordragstart
event, it's in protected mode, preventing you from accessing the data.You can view the
fileList
because you log thefileList
ondrop
event whendataTransfer
is readable. But if you loge.dataTransfer
ore
, you won't be able to access any data.You can test here, even on
dragover
you can't access what's indataTransfer
: