【问题标题】:Detect file type on dragenter cross browser solution在 Dragenter 跨浏览器解决方案上检测文件类型
【发布时间】:2016-04-18 16:36:51
【问题描述】:

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

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

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

编辑:截至 2021 年底,此功能现在为 widely supported

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

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>

【问题讨论】:

  • 试过input type="file" ?

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


【解决方案1】:

tl;dr 版本:不能

编辑:截至 2021 年底,现在您可以,因为 Data​Transfer​.items 现在是 widely supported

引用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%;
}
&lt;p&gt;Try dropping a file.&lt;/p&gt;

有关拖放浏览器支持,请参阅caniuse.com

【讨论】:

  • 我不认为这能回答我的问题。目前我可以通过“DataTransfer.items”属性知道拖动事件(Chrome)中的文件类型。规范说:“DataTransfer.items 属性是拖动操作中数据传输项的列表。该列表包括操作中每个项目的一项,如果操作没有项目,则列表为空。”;但在其他浏览器中,此规范尚未应用。我的问题是今天是否有任何解决方法。另外,我的问题不是关于 drop 事件。我已经知道该怎么做。
  • @JonathanCalb 你根本做不到。正如我已经写过的,这将是一个安全问题。如果它在 Chrome 中工作(我怀疑;代码 sn-p 或没有发生),这是一个错误,而不是一个功能。
  • 添加了工作代码 sn-p。而且我不认为这是一个错误,如果您阅读规范,它会按照它说的去做。
  • @JonathanCalb 即使你是对的,我认为目前还没有跨浏览器的解决方案。
  • 这没有回答我的问题。您最终回应说您认为目前没有跨浏览器解决方案。如果这是你的最终答案,我需要你深入解释一下。
【解决方案2】:

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

【讨论】:

猜你喜欢
  • 2016-03-31
  • 2014-05-03
  • 1970-01-01
  • 2015-07-04
  • 2011-03-05
  • 2016-05-30
  • 2012-12-22
  • 2011-07-13
  • 2013-08-29
相关资源
最近更新 更多