如何确定 HTML5 拖放文件上传 API 的存在(如 FF3.6 中的那个)

Posted

技术标签:

【中文标题】如何确定 HTML5 拖放文件上传 API 的存在(如 FF3.6 中的那个)【英文标题】:How to determine presence of HTML5 drag'n'drop file upload API (like the one from FF3.6) 【发布时间】:2011-01-19 16:37:12 【问题描述】:

我正在编写一个应该支持 html5 文件拖放 API 的应用程序,就像here 中描述的那样。 我想对浏览器是否支持这种疯狂进行编程检查:) 目前可行的解决方案是检查浏览器是否提供 FileReader 类,如下所示:

  if (typeof(FileReader) == "undefined") 
    $("#dropbox").hide();
   else 
    // connect events
    $("#filebox").hide();
  

但这显然不是一个正确的类(我根本不使用那个类)。

有什么想法吗?

【问题讨论】:

【参考方案1】:

检查是否存在 FileReader 是解决此问题的正确方法。 FileReader 是File Api 的官方部分。我会将它与Modernizr 结合起来。拖放支持是slated for release 1.2。您应该能够在 GitHub 上获取源代码并立即开始使用它。 http://github.com/Modernizr/Modernizr/blob/master/modernizr.js

if (!!FileReader && Modernizr.draganddrop) 
  // sexy drag and drop action
 else 
  // no drag and drop support available :(

如果你还没有看过Dive into HTML5,你一定要看看Mark Pilgrim 在detecting HTML5 上的建议。

【讨论】:

我不确定这是否可行。它检查 div 对象中是否存在 ondrag、ondrop、ondragleave 等属性。这适用于 Chrome,但仍然不允许您将文件拖放到网站中。 reader = new FileReader(); if (reader && Modernizer.draganddrop) ... 需要测试一下。 更新了我的建议,包括检查 FileReader 对象,尽管 if(!!FileReader) 可能就足够了。 :) 我在 FF3.6 和 Chrome 中对此进行了测试,并且可以正常工作。 if (!!FileReader) 在 IE8 中抛出“FileReader is undefined”错误 @mattb,对于 IE8,您需要 window.FileReader。有关完整示例,请参阅我的答案。【参考方案2】:

我不得不对dshaw 的回答稍作改动以获得对 IE8 的支持:

if (!!window.FileReader && Modernizr.draganddrop) 
  // sexy drag and drop action
 else 
  // no drag and drop support available :(

你可以试试here

【讨论】:

IE9 中也需要 !!window.FileReader。 您可以包含Modernizr.filereader,它可以更好地覆盖所有浏览器。 也许我对 javascript 了解不够,但!! 有必要吗?声明!!window.FileReader不等于window.FileReader吗? @racl101 这是一种将对象类型强制转换为布尔值的晦涩方式......对于 JS 新手来说不是特别可读,抱歉! ***.com/questions/784929/…【参考方案3】:
if ("files" in DataTransfer.prototype) ...

【讨论】:

没有。原型是一个核心的 JS 编程结构。 en.wikipedia.org/wiki/JavaScript @konryd 请参阅mckoss.com/jscript/object.htm 以更好地探索 JS 对象原型。 不知道为什么,但是下面的代码在 Chrome 上不起作用 if ("files" in DataTransfer.prototype) alert('Drag Drop file support is there'); 它说... Uncaught ReferenceError :未定义数据传输。你能帮忙吗... webkit 不公开 DataTransfer 对象,请参阅github.com/Modernizr/Modernizr/issues#issue/57 为什么这被标记为正确,而实际上却不是?至少不能跨浏览器。【参考方案4】:

如果您根本不想处理 Modernizr,您可以复制它对拖放检测的作用:

var supportsDragAndDrop = function() 
    var div = document.createElement('div');
    return ('draggable' in div) || ('ondragstart' in div && 'ondrop' in div);

从 Modernizr GitHub 存储库获得:

https://github.com/Modernizr/Modernizr/blob/master/feature-detects/draganddrop.js

【讨论】:

【参考方案5】:

要么使用纯粹的 Modernizr 方法

if (Modernizr.filereader && Modernizr.draganddrop) 
  //sexy drag and drop action
 else 
   //no drag and drop support available :(
;

或直接使用底层 DOM 检查但带有异常处理

var featuresSupported = false;
try 
   if (!!(window.File && window.FileList && window.FileReader) && Modernizr.draganddrop)
     featuresSupported = true;
)
catch (err)



if (featuresSupported)
  <do sexy effects>
else
  <perform rollback to legacy stuff>

【讨论】:

【参考方案6】:

此代码在 IE8 中失败。 这可能会更好:

if (typeof(FileReader) === 'function' && Modernizr.draganddrop) 
  //sexy drag and drop action
 else 
   //no drag and drop support available :(
;

【讨论】:

【参考方案7】:
if (!window.File || !window.FileReader || !window.FileList || !window.Blob) 
  alert('The File APIs are not fully supported in this browser. Please upgrade your browser.');

【讨论】:

【参考方案8】:

它有点棘手。 ios7 报告它同时支持 FileReader 和拖放图片上传。由于我正在寻找一个更通用的文件上传,而我无法在 iOS 上完成,我需要另一个答案。

Modernizr 第 57 期here 讨论了这个问题。现在有了 Windows 8 和触摸和鼠标,它很棘手。 chriskeeble 中间有我成功使用的代码。它依赖于 Modernizr 和代理检测。

【讨论】:

以上是关于如何确定 HTML5 拖放文件上传 API 的存在(如 FF3.6 中的那个)的主要内容,如果未能解决你的问题,请参考以下文章

使用 HTML5/jQuery 上传拖放文件

html5拖放文件-提交整个表单时上传

HTML5拖放以使用本地htnl5文件上传目录[重复]

HTML5 在窗口之间拖放

HTML5 拖放 - 检测 Safari 中的文件夹(文件列表、文件)

.net的拖放文件上传插件?