【问题标题】:Drag & Drop - DataTransfer object拖放 - 数据传输对象
【发布时间】:2016-01-29 22:52:48
【问题描述】:

我正在构建一个简单的拖放上传器,我想知道为什么当我 console.log(e) (DragEvent) 并查看它显示的 DragEvent.dataTransfer.files 时看不到我放置的文件空的,但是...如果我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>

【问题讨论】:

  • 在您单击控制台中的对象时,它可能已通过多个函数更改其属性。那么为什么你会期望它是一样的呢?如果以后需要,可以冻结、克隆或复制值。

标签: javascript html drag-and-drop drag


【解决方案1】:

拖动数据存储具有不同的模式,具体取决于您访问它的时间:

  • dragstart 事件中,它处于读/写 模式。
  • drop 事件中,它处于只读模式。
  • 在所有其他事件中,它都处于受保护模式。

    受保护的模式是这样定义的:

保护模式

对于所有其他事件。拖动数据存储中的格式和种类 可以枚举表示拖动数据的项目列表,但 数据本身不可用,无法添加新数据。

请看这里:https://html.spec.whatwg.org/multipage/interaction.html#the-drag-data-store

这意味着当您在控制台中访问dataTransfer 对象时,它不在dropdragstart 事件中,它处于受保护 模式,阻止您访问数据。

您可以查看fileList,因为当dataTransfer 可读时,您会在drop 事件上记录fileList。但是如果您登录e.dataTransfere,您将无法访问任何数据。

您可以在此处进行测试,即使在 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();
}
&lt;div id=droppable&gt;Drop a file&lt;/div&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-15
    • 2011-12-02
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多