HTML5拖放能夠將本地的文件拖放到頁面上,plupload又是很好的文件上傳插件,而今天就將兩者結合,做了個文件拖拽上傳的功能。
簡述HTML5拖放
拖放是HTML5標准的一部分,任何元素都能夠拖放,也能夠將本地的文件拖放到頁面上。
設置元素可拖放
為了使元素可拖動,把 draggable 屬性設置為 true
<img draggable="true" />
拖放事件
有7個拖放事件可以捕獲,如下:
dragstart:開始拖元素觸發
dragenter:元素拖進可drop元素(綁定drop事件的元素)時觸發
dragover:當元素拖動到drop元素上時觸發
drop:當元素放下到drop元素觸發
dragleave :當元素離開drop元素時觸發
drag:每次元素被拖動時會觸發
dragend:放開拖動元素時觸發
完成一次拖放的事件過程是: dragstart –> dragenter –> dragover –> drop –> dragend
瀏覽器支持
Internet Explorer 9、Firefox、Opera 12、Chrome 以及 Safari 5 支持拖放。
拖拽上傳實現
先阻止頁面默認的拖放行為,不然頁面會被拖放的文件替換了。
//阻止瀏覽器默認行為 document.addEventListener( "dragleave", function(e) { e.preventDefault(); }, false); document.addEventListener( "drop", function(e) { e.preventDefault(); }, false); document.addEventListener( "dragenter", function(e) { e.preventDefault(); }, false); document.addEventListener( "dragover", function(e) { e.preventDefault(); }, false);
初始化plupload
var uploader = new plupload.Uploader({ runtimes : 'html5,flash,silverlight,html4', browse_button : iElement, //一個觸發的元素,寫一個隱藏的元素就行 url : config.path.storePutFile, flash_swf_url : 'lib/plupload-2.1.8/js/Moxie.swf', silverlight_xap_url : 'lib/plupload-2.1.8/js/Moxie.xap', multiple_queues : false, multi_selection : true, init : { FilesAdded : function(up, files) { this.start(); }, //上傳進度 UploadProgress : function(up, file) { console.log("UploadProgress--------------------------------------"); }, FileUploaded : function(up, file, info) { console.log("FileUploaded--------------------------------------"); }, Error : function(up, err) { console.log(err); } } });
設置drop區域
當文件拖放到drop區域時,就能觸發上傳。
var box = element; //drop區域的DOM元素 box.addEventListener("drop", function (e) { var up = uploader; //plupload的實例對象 var fileList = e.dataTransfer.files; //獲取文件對象 //檢測是否是拖拽文件到頁面的操作 if (fileList.length == 0) { return false; } for(var i = 0; i < fileList.length; i++){ var reader = new FileReader(); reader.onload = function(e) { up.addFile(file[i]); }; reader.onerror = function(e){ alert('目前只能上傳文件'); } reader.readAsDataURL(file[i]); } }, false);
注意
在addFile到plupload實例時,我加了一層FileReader的讀取,是因為HTML5的File對象有問題。HTML5 File對象在接收到文件夾的時候,不能辨別文件夾。例如你上傳一個命名為“123.jpg”的文件夾,HTML5 File會認為這是個圖片(囧,它是去截取后綴名去做文件類型判斷的),而這會導致plupload上傳失敗。所以我加一層FileReader,當是文件夾時候,會觸發onerror,是文件時就觸發onload,addFile之后觸發上傳行為。
總結
上傳之所以借助pluoload,是因為它本身支持HTML5上傳,而且還提供了上傳進度、上傳失敗回調等功能,可以節省很多功夫(當然可以自己做上傳)。而HTML5拖放只是選擇文件的方式,省卻了尋找文件的麻煩。
本文為原創文章,轉載請保留原出處,方便溯源,如有錯誤地方,謝謝指正。