Firefox 3.6 中的文件拖放

之前的帖子 中,我们向您展示了如何使用 input 元素上传多个文件。在 Firefox 3.6 中,您可以让用户将文件直接拖放到网页中,而无需通过文件选择器。

演示

如果您正在运行最新的 Firefox 3.6 测试版,请查看我们的 拖放交互式演示。它展示了两种技术:拖放 API文件 API

拖放事件

要使用拖放,您首先需要告诉浏览器给定元素可以处理已放置的对象并会对放置操作做出响应,使用 dragoverdrop 事件。

您还需要阻止浏览器的默认行为,即仅在浏览器窗口中加载已放置的对象。

dropzone.addEventListener("dragover", function(event) {
  event.preventDefault();
}, true);
dropzone.addEventListener("drop", function(event) {
  event.preventDefault();
  // Ready to do something with the dropped object
}, true);

您可能还想使用 dragenterdragleave 事件来通知拖动会话何时开始或停止。

您的元素现在已准备好使用 drop 事件接收文件。

操作文件

drop 事件中,您可以使用 DataTransfer 对象的 files 属性访问文件。

dropzone.addEventListener("drop", function(event) {
  event.preventDefault();
  // Ready to do something with the dropped object
  var allTheFiles = event.dataTransfer.files;
  alert("You've just dropped " + allTheFiles.length + " files");
}, true);

访问文件后,文件 API 允许您执行更多操作,例如将文件解析为二进制数组,或通过将文件读取为 DataURL 来显示图像预览。

当然,您仍然可以使用 拖放 API 拖放除文件以外的数据(例如文本、URL、远程图像等)。

关于 Paul Rouget

Paul 是一位 Firefox 开发人员。

更多 Paul Rouget 的文章…


32 条评论

  1. Gilberto Ramos

    太棒了!!!

    2009 年 12 月 14 日 下午 12:47

  2. Jose

    是否可以反过来拖放。例如,一个文件列表,就像在一个 FTP 列表中,选择它们(可能使用一个复选框),然后将它们拖放到 Finder/Windows 资源管理器中?

    2009 年 12 月 14 日 下午 2:12

  3. Yehuda B.

    这是我创建的另一个通过拖放上传文件的演示

    观看屏幕截图(无声音):http://vimeo.com/6055152

    使用 Firefox 3.6 自行尝试:http://yehudab.com/apps/drag-n-drop/demo.html

    2009 年 12 月 14 日 下午 2:22

  4. Fritz

    我迫不及待地想看看这些将被用于什么。我脑子里有很多可能性,但我相信有人会想出超出我最大想象力的用途。

    2009 年 12 月 14 日 下午 3:12

  5. K

    dragover 上的 preventDefault 实际上并不需要吧?这里没有它也能正常工作。

    2009 年 12 月 15 日 上午 1:25

  6. paul

    @K 是的,至少在 Linux + Gnome 下是必须的。

    2009 年 12 月 15 日 上午 4:13

  7. Aditya

    太棒了。但从另一方面,我理解我们必须处理一个糟糕的 API,才能让它按预期工作。
    希望 Firefox 能推出它最好的产品。

    2009 年 12 月 15 日 上午 11:02

  8. […] 在之前的帖子中,我们展示了如何通过 input 标签或通过拖放机制访问文件。在这两种情况下,您都可以使用 XMLHttpRequest 上传文件,并按照上传 […]

    2009 年 12 月 28 日 下午 5:51

  9. […] Firefox 3.6 中的文件拖放 (hacks.mozilla.org) […]

    2010 年 1 月 5 日 上午 8:42

  10. […] Zanimiv 功能,将在下一个 Firefox 中推出。 […]

    2010 年 1 月 13 日 上午 4:22

  11. Aurélio

    我想知道以下内容;我在 Firefox 3.5 之上安装了 Firefox 3.6,是否会发生任何错误或冲突?Firefox 3.6 已经可以安装插件了吗?帮助……(注意,我不懂英语)

    2010 年 1 月 20 日 上午 7:12

  12. […] 将正确文件拖放到浏览区域。文件拖放应该像本教程一样,但我的服务器不支持 SVG 媒体类型,因此您只能看到工作 […]

    2010 年 1 月 24 日 下午 7:57

  13. […] 拖放 https://hacks.mozilla.ac.cn/2009/12/file-drag-and-drop-in-firefox-3-6/ […]

    2010 年 1 月 26 日 上午 4:30

  14. Michael Butler

    谢谢谢谢谢谢 Mozilla!继续实施这些杀手级功能,我们最终将终结 IE(或迫使他们跟上竞争步伐)。迫不及待地想在新的网站上尝试拖放上传!

    2010 年 2 月 4 日 下午 4:16

  15. bond

    嗨,我是一名 PHP Web 开发人员,当我想到使用此功能时,我想到我的用户能够将图像拖放到一个简单的网页上,以将其上传到服务器并创建一个图片库!
    您是否知道目前有使用这些功能的代码?

    谢谢!!

    2010 年 2 月 20 日 上午 7:46

  16. […] 从桌面拖放文件 […]

    2010 年 2 月 24 日 上午 6:19

  17. […] 从桌面拖放文件 3.6 […]

    2010 年 3 月 5 日 上午 2:14

  18. qwazix

    我使用此功能和其他关于此主题的优秀示例创建了一个开源项目,该项目旨在成为拖放上传的完整解决方案。访问 http://dragdropupload.sourceforge.net

    2010 年 4 月 15 日 上午 7:06

  19. another_sam

    在 Google Docs 上请求此功能
    http://docs.google.com/support/bin/request.py?contact_type=featuresuggest

    2010 年 4 月 16 日 下午 1:33

  20. Elixon

    嗯。如何创建新的 DataTransfer 对象?我想将拖放功能添加到我的所见即所得编辑器中。我可以捕获放置并上传图像,但我希望重置 event.dataTransfer 对象并用指向已上传图像的 HTML IMG 标签填充它,或者重新分派带有 HTML IMG 文本/html 数据的新“放置”事件……在 FF3.6 中是否有可能实现这样的功能?

    2010 年 4 月 30 日 下午 3:29

  21. Edmond

    是否可以捕获已放置的文件并将其分配给文件输入,以便在提交表单时可以稍后上传它?

    2010 年 6 月 15 日 上午 5:50

  22. […] HTML5 拖放:可以将网页中的项目拖放到其他地方,或者将桌面上的图像直接拖放到浏览器中。 […]

    2010 年 7 月 7 日 上午 9:04

  23. […] Firefox 3.6 中的文件拖放,2009 年 12 月 14 日,Paul […]

    2010 年 7 月 7 日 上午 9:21

  24. Komrade Killjoy

    *咳嗽*

    https://addons.mozilla.org/en-US/firefox/addon/2190/

    2010 年 7 月 28 日 上午 5:46

  25. pd

    这是一个很棒的演示。MDC 上的文档不够好。hacks.mozilla.org 是天降福音。

    但是!您能继续推出一个上传演示吗?开放式 Web 需要拖放、开始上传、显示进度、在适当位置预览图像的功能。据我所知,Flash 可以做到这一点,现在开放式 Web 也应该拥有这样的功能。

    此外,这个演示可以重新创建和调整,以包含多个拖放吗?

    2010 年 8 月 9 日 下午 11:13

  26. luokai

    请给我演示代码,求求你了,谢谢

    2011 年 1 月 4 日 上午 1:11

  27. Dave Merrill

    很抱歉,它又可以正常工作了;我什么都没做,只是重启了电脑。昨天安装 RC1 后,行为如我所述。今天我在安装 IE9 后重启了电脑(我知道,工作需要……),拖放上传又可以正常工作了。很奇怪。

    抱歉打扰大家,

    Dave

    2011 年 3 月 17 日 上午 5:05

  28. lionel

    这个演示在 ff4 或 Chrome 10 上运行得不好。显然拖出事件被意外触发了(至少我不知道为什么)

    有人知道这个问题吗?

    2011 年 4 月 13 日 上午 6:01

  29. renato

    我发现很难让它与 Firefox 5.0 中的 Google Gears(拖放)兼容。我决定将此代码放在 div booster 中

    2011 年 5 月 26 日 上午 12:56

  30. Sitebase

    太酷了。处理文件上传的好方法。

    2011 年 10 月 28 日 上午 1:54

  31. […] 较旧的文章 […]

    2012年4月13日 上午4:20

  32. ling

    我无法访问源文件。这个演示有github仓库吗?

    2012年7月1日 上午0:23

本文评论已关闭。