检测dragenter跨浏览器解决方案上的文件类型

时间:2016-01-13 15:54:08

标签: javascript html5 drag-and-drop cross-browser

我正在为此寻找跨浏览器解决方案。我提前告诉你,我不想知道是否只是一个文件,因为我找到了解决方案。我想知道文件基本上是音频,图像还是视频。在Chrome中,当您触发dragenter事件时,您可以从此处获取该数据:

ev.originalEvent.dataTransfer.items[0].type;

但是在Firefox,Safari和IE中,“items”规范尚未应用: https://developer.mozilla.org/en-US/docs/Web/API/DataTransfer/items

在这些浏览器中,您只能看到“文件”属性:

ev.originalEvent.dataTransfer.files[0];

但是dragenter files[0]是空的。我如何解决这个问题,以了解这些其他浏览器中的文件类型?

示例(仅适用于Chrome):

$(document).on('dragenter', '.drop-zone', function(ev) {
  var e = ev.originalEvent;
  e.dataTransfer.dropEffect = 'copy';
  var file = e.dataTransfer.items[0];
  var type = file.type.slice(0, file.type.indexOf('/'));
  $(ev.target).html(type);
});

$(document).on('dragleave', '.drop-zone', function(ev) {
  $(ev.target).html('Drag your file over here to know the type, no need to drop it');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="drop-zone">Drag your file over here to know the type, no need to drop it</div>

2 个答案:

答案 0 :(得分:7)

tl;博士版无法

引用this answer

  

DRAG_OVER没有权利在拖动事件中查看数据。

它适用于dragoverdragenter个事件。

为什么呢?那么,这将是一个严重的隐私问题。想象一下,你有一个MP3文件,由于某种原因你想在浏览器中打开。您可以通过拖动它并放在浏览器标签栏上来完成此操作,如下所示:

在拖放过程中,您将文件拖到当前所在页面上,当然您不希望此页面知道有关此文件的任何信息。这就是为什么在实际删除拖动文件之前无法获取有关拖动文件的信息的原因。

但是,您可以检查drop事件的文件类型:

"drop dragover".split(" ").forEach(function(eventName) {
  document.addEventListener(eventName, function(event) {
    event.preventDefault();
  });
});
document.addEventListener("drop", function(event) {
  console.log(event.dataTransfer.files[0].type);
});
html, body {
  height: 100%;
}
<p>Try dropping a file.</p>

对于拖放式浏览器支持,请参阅caniuse.com

答案 1 :(得分:0)

Data​Transfer​.items似乎是唯一的可能性。 It is now supported on Firefox,只有Safari和IE不支持。