HTML5 CSS3 經典案例:無插件拖拽上傳圖片 (支持預覽與批量) (二) HTML5 CSS3 經典案例:無插件拖拽上傳圖片 (支持預覽與批量) (一)

jopen 8年前發布 | 40K 次閱讀 前端技術

轉載請標明出處:http://blog.csdn.net/lmj623565791/article/details/31513065

上一篇已經實現了這個項目的整體的HTML和CSS:

HTML5 CSS3 經典案例:無插件拖拽上傳圖片 (支持預覽與批量) (一)

這篇博客直接在上篇的基礎上完成,最終效果:

效果圖1:


效果圖2:

好了,請允許我把圖片貼了兩遍,方便大家看效果了~

可以看出我們的圖片的li的html其實還是挺復雜的,于是我把html文檔做了一些修改:

<span style="font-size:12px;"><body>

<div id="uploadBox"> </div>

<div id="template" class="hidden"> <li> <img src=""/> <span class="progress"></span> <span class="percentage"></span> </li> </div> </body></span></pre> 可以看到我把li的顯示,獨立寫到了一個div#template,默認是hidden的,這樣做的好處是什么呢?避免我們每上傳一個文件,在js中出現大量的創建元素與賦屬性的代碼,一般設計比較復雜的html元素的生成,建議使用這種方式,可以簡化代碼,也利于我們代碼的后期維護。

Js代碼:

<span style="font-size:12px;">/**

  • User: zhy
  • Date: 14-6-16
  • Time: 下午11:06 */ var ZhangHongyang = {}; ZhangHongyang.html5upload = (function () { var _ID_UPLOAD_BOX = "uploadBox"; var _CLASS_PROGRESS = "progress"; var _CLASS_PERCENTAGE = "percentage";

    var _tip_no_drag = "將文件拖拽至此區域,即可上傳!"; var _tip_drag_over = "釋放鼠標立即上傳!";

    var _uploadEle = null;

    /**

    • 初始化對象與事件
    • @private */ function _init() { _uploadEle = document.getElementById(_ID_UPLOAD_BOX); _uploadEle.ondragenter = _onDragEnter; _uploadEle.ondragover = _onDragOver; _uploadEle.ondragleave = _onDragLeave; _uploadEle.ondrop = _onDrop; _setStatusNoDrag();

      };

/**
 * 正在拖拽狀態
 * @private
 */
function _setDragOverStatus()
{
    if (_checkContatinsElements())return;
    _uploadEle.innerText = _tip_drag_over;
    _uploadEle.style.border = "2px dashed #777";
    $(_uploadEle).css({lineHeight: $(_uploadEle).height() + "px"});
}

/**
 * 初始化狀態
 * @private
 */
function _setStatusNoDrag()
{
    if (_checkContatinsElements())return;
    _uploadEle.innerText = _tip_no_drag;
    _uploadEle.style.border = "2px dashed #777";
    $(_uploadEle).css({lineHeight: $(_uploadEle).height() + "px"});
}

/**
 * 上傳文件
 * @private
 */
function _setDropStatus()
{

    if (_checkContatinsElements())return;
    _uploadEle.innerText = "";
    _uploadEle.style.border = "1px solid #444";
    $(_uploadEle).css({lineHeight: "1em"});
    $(_uploadEle).append("<ul></ul>");

};


/**
 * 判斷是否已經上傳文件了
 * @private
 */
function _checkContatinsElements()
{
    return !!$(_uploadEle).find("li").size();

}
/**
 * 當ondragenter觸發
 * @private
 */
function _onDragEnter(ev)
{
    _setDragOverStatus();
}
/**
 * 當ondargmove觸發
 * @private
 */
function _onDragOver(ev)
{
    //ondragover中必須組織事件的默認行為,默認地,無法將數據/元素放置到其他元素中。
    ev.preventDefault();

}
/**
 * 當dragleave觸發
 * @private
 */
function _onDragLeave(ev)
{
    _setStatusNoDrag();
}

/**
 * ondrop觸發
 * @private
 */
function _onDrop(ev)
{
    //drop 事件的默認行為是以鏈接形式打開,所以也需要阻止其默認行為。
    ev.preventDefault();
    _setDropStatus();

    //拿到拖入的文件
    var files = ev.dataTransfer.files;
    var len = files.length;
    for (var i = 0; i < len; i++)
    {
        //頁面上顯示需要上傳的文件
        _showUploadFile(files[i]);
    }
}
/**
 * 頁面上顯示需要上傳的文件
 * @private
 */
function _showUploadFile(file)
{
    var reader = new FileReader();

// console.log(file) // console.log(reader);

    //判斷文件類型
    if (file.type.match(/image*/))
    {
        reader.onload = function (e)
        {
            var formData = new FormData();

            var li = $("#template li").clone();
            var img = li.find("img");
            var progress = li.find(".progress");
            var percentage = li.find(".percentage");
            percentage.text("0%");
            img.attr("src", e.target.result);
            $("ul", $(_uploadEle)).append(li);
            $(_uploadEle).find("li").size() == 10 && $(_uploadEle).width(($(_uploadEle).width() + 8) + "px").css("overflow", "auto");
            formData.append("uploadFile", file);

            //上傳文件到服務器
            _uploadToServer(formData, li, progress, percentage);

        };
        reader.readAsDataURL(file);
    }
    else
    {
        console.log("此" + file.name + "不是圖片文件!");
    }
}

/**
 * 上傳文件到服務器
 * @private
 */
function _uploadToServer(formData, li, progress, percentage)
{
    var xhr = new XMLHttpRequest();
    xhr.open("POST", "http://localhost:8080/strurts2fileupload/uploadAction", true);
    xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest', 'Content-Type', 'multipart/form-data;');

    //HTML5新增的API,存儲了上傳過程中的信息
    xhr.upload.onprogress = function (e)
    {
        var percent = 0;
        if (e.lengthComputable)
        {
            //更新頁面顯示效果
            percent = 100 * e.loaded / e.total;
            progress.height(percent );
            percentage.text(percent + "%");
            percent >= 100 && li.addClass("done");
        }
    };
    xhr.send(formData);
}


//把init方法公布出去
return{
    init: _init }


})(); </span></pre>
注釋寫得很詳細,這次沒有直接使用字面量創建對象,因為我不希望使用者可以訪問所有的方式和變量,使用了簡單的閉包,可以看出幾乎所有的方法和變量都是_開頭,是因為我認為它們是私有的,我也沒有公布出來,唯一公布的就是init方法,供使用者調用。整體方法也使用了命名空間,這樣和其他伙伴寫的js基本不做造成變量相同的問題。
</div>


上面的js中用到了HTML FileApi,這里介紹一下:

1、File對象也就是我們上面使用的:
File

</div>

  1. lastModifiedDateThu Dec 26 2013 18:45:08 GMT+0800 (中國標準時間)
  2. name"yt_key.png"
  3. size45524
  4. type"image/png"
  5. webkitRelativePath""
  6. __proto__File
可以看到包含上面的一些屬性,也就是說,如果使用支持html5的瀏覽器,給input=type設置onchange事件,用戶選擇圖片或者文件后,就可以做出圖片的顯示或者文件大小和類型的判斷。</div>

2、FileReader主要用于異步讀取文件內容,注意是異步的,上例我們使用了它的readAsDataURL的方法,關于DataUri的知識可以自己去百度下。
另外還提供了:readAsText用于讀取文本;readAsArrayBuffer和readAsBinaryString方法;
還提供了一些事件:onloadstart, onload, onprogress ,onerror , onloaded , onabort 有興趣的可以去一個一個查看。

最后頁面調用,大功告成:

<span style="font-size:12px;">    <script type="text/javascript" src="jquery-1.8.3.js"></script>
    <script type="text/javascript" src="js/html5upload.js"></script>

<script type="text/javascript">

    window.onload = function ()
    {
        ZhangHongyang.html5upload.init();
    }
    ;

</script></span></pre> 




歡迎大家指點~


源碼點擊下載




</div>

來自: http://blog.csdn.net//lmj623565791/article/details/31513065

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!