如何使用jQuery的drop事件上传从桌面拖动的文件?


Answers:


150

有点混乱(您需要处理至少3个事件),但可能。

首先,您需要为dragover和添加事件处理程序,dragenter并阻止此类事件的默认操作,例如:

$('#div').on(
    'dragover',
    function(e) {
        e.preventDefault();
        e.stopPropagation();
    }
)
$('#div').on(
    'dragenter',
    function(e) {
        e.preventDefault();
        e.stopPropagation();
    }
)

调用preventDefault这些事件实际上很重要,否则,某些浏览器可能永远不会触发该drop事件。

然后,您可以添加放置处理程序并使用以下命令访问放置的文件e.originalEvent.dataTransfer.files

$('#div').on(
    'drop',
    function(e){
        if(e.originalEvent.dataTransfer && e.originalEvent.dataTransfer.files.length) {
            e.preventDefault();
            e.stopPropagation();
            /*UPLOAD FILES HERE*/
            upload(e.originalEvent.dataTransfer.files);
        }
    }
);

现在,您可以从div中的桌面/浏览器/查找器中拖动文件并访问它们。

http://jsfiddle.net/fSA4N/5/


9
为什么需要抑制默认的拖动和拖动行为?
克里斯·马丁

2
当您开始将文件拖到浏览器中时,某些浏览器会做一些奇怪的事情。没必要。通过这些事件,您还可以添加一些不错的功能,例如突出显示必须将文件拖放到的div。
亚历克斯

是否有可能以某种方式使用e.originalEvent.dataTransfer.files并将其设置为文件输入?
ioleo

2
你说“不容易” ...?您的回复立即解决了我同样的问题!@loostro:可能的是有一个名为“ file”的“全局”变量,并使用$(':file')。change()icwetarget.files [0](对我有用),或者也许$('this ').val();
狮子座

3
除了“某些浏览器会做一些奇怪的事情”之外:如果您拖拽目标(例如,拖动图像文件),则某些浏览器(例如Firefox)的默认行为是在窗口中打开文件。为了避免这种情况,请将文档主体绑定到拖动和放置事件并取消它们(使用preventDefault / stopPropagation)。
David G
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.