HTML5拖放(drag and drop)與plupload的懶人上傳


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拖放只是選擇文件的方式,省卻了尋找文件的麻煩。

 

本文為原創文章,轉載請保留原出處,方便溯源,如有錯誤地方,謝謝指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5014584.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM