ホームページ  >  記事  >  ウェブフロントエンド  >  HTML5/CSS3 の古典的なケース - プラグインを使用せずにドラッグ アンド ドロップで画像をアップロード (2)

HTML5/CSS3 の古典的なケース - プラグインを使用せずにドラッグ アンド ドロップで画像をアップロード (2)

黄舟
黄舟オリジナル
2017-03-09 16:38:292084ブラウズ

前の記事では、このプロジェクトの全体的な HTML と CSS を実装しました:

HTML5/CSS3 の古典的なケース - 画像をアップロードするためにプラグインのドラッグ アンド ドロップを使用しない (1)

このブログ前の記事に基づいて完成、最終エフェクト:

レンダリング 1:


レンダリング 2:

わかりました、許可してください写真を投稿するために、効果をみんなに見てもらうために 2 回行いました~

私たちの写真 li の HTML は実際には非常に複雑であることがわかります。そのため、HTML ドキュメントにいくつかの変更を加えました:


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

<p id="uploadBox">
</p>

<p id="template" class="hidden">
    <li>
        <img src=""/>
        <span class="progress"></span>
        <span class="percentage"></span>
    </li>
</p>
</body></span>

ご覧のとおり、li の表示を p#template に独立して書きました。これを行う利点は何ですか?ファイルをアップロードするたびに 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(&#39;X-Requested-With&#39;, &#39;XMLHttpRequest&#39;, &#39;Content-Type&#39;, &#39;multipart/form-data;&#39;);

        //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>


今回は、ユーザーがすべてのメソッドと変数にアクセスできるようにしたくないため、リテラルを直接使用せず、単純なクロージャを使用しました。ほとんどすべてのメソッドと変数が _ で始まることがわかります。これは、それらがプライベートであると考えており、公開されていないのは、ユーザーが呼び出す init メソッドだけであるためです。メソッド全体でも名前空間を使用しているため、他のパートナーが作成した JS は基本的に変数と同じ問題を引き起こしません。


HTML FileApi は上記の js で使用されています:


1. File オブジェクトは上で使用したものです:


lastModifiedDate

:
  1. Thu Dec 26 2013 18:45:08 GMT+0800 (中国標準時)

    name

    :
  2. "yt_key.png"

    サイズ

    :
  3. 45524

    type

    :
  4. "image/png"

    webkitRelativePath

    : ""
  5. __proto__:

    ファイル
  6. 上記の属性のいくつかが含まれていることがわかります。つまり、HTML5 をサポートするブラウザを使用している場合は、input=type に onchange イベントを設定し、ユーザーが画像またはファイルを選択した後、画像やファイルのサイズと種類の判定を表示できます。

    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>


以上がHTML5/CSS3 の古典的なケース - プラグインを使用せずにドラッグ アンド ドロップで画像をアップロード (2)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。