首页 前端知识 HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (二)

HTML5 CSS3 经典案例:无插件拖拽上传图片 (支持预览与批量) (二)

2024-04-13 23:04:37 前端知识 前端哥 38 508 我要收藏

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(“

    ”);

    };

    /**

    • 判断是否已经上传文件了

    • @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 && ( u p l o a d E l e ) . w i d t h ( ( (_uploadEle).width(( (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 }

    })();

    注释写得很详细,这次没有直接使用字面量创建对象,因为我不希望使用者可以访问所有的方式和变量,使用了简单的闭包,可以看出几乎所有的方法和变量都是_开头,是因为我认为它们是私有的,我也没有公布出来,唯一公布的就是init方法,供使用者调用。整体方法也使用了命名空间,这样和其他伙伴写的js基本不做造成变量相同的问题。

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

    1、File对象也就是我们上面使用的:

    File

    1. lastModifiedDate: Thu Dec 26 2013 18:45:08 GMT+0800 (中国标准时间)

    2. name: “yt_key.png”

    3. size: 45524

    4. type: “image/png”

    5. webkitRelativePath: “”

    自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

    深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

    因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
    img
    img
    img
    img
    img
    img
    img

    既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

    由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

    如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
    img

    最后

    总而言之,成功是留给准备好的人的。无论是参加什么面试,都要做好充足的准备,注意好面试的礼仪和穿着,向面试官表现出自己的热忱与真诚就好。即使最后没有过关,也要做好经验的总结,为下一次面试做好充足准备。

    这里我为大家准备了一些我在面试后整理的面试专题资料,除了面试题,还总结出了互联网公司Android程序员面试涉及到的绝大部分面试题及答案,并整理做成了文档,以及系统的进阶学习视频资料分享给大家,希望能帮助到你面试前的复习,且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

    毕竟不管遇到什么样的面试官,去面试首先最主要的就是自己的实力,只要实力够硬,技术够强,就不怕面试拿不到offer!

    为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

    一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
    img
    也节省大家在网上搜索资料的时间来学习。**

    毕竟不管遇到什么样的面试官,去面试首先最主要的就是自己的实力,只要实力够硬,技术够强,就不怕面试拿不到offer!

    [外链图片转存中…(img-vQIV7RW2-1712846729994)]

    [外链图片转存中…(img-CxFpD3a5-1712846729995)]

    为什么某些人会一直比你优秀,是因为他本身就很优秀还一直在持续努力变得更优秀,而你是不是还在满足于现状内心在窃喜!希望读到这的您能点个小赞和关注下我,以后还会更新技术干货,谢谢您的支持!

    [外链图片转存中…(img-T0kDU3WF-1712846729995)]

    一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
    [外链图片转存中…(img-9F9s8Fhv-1712846729996)]

    转载请注明出处或者链接地址:https://www.qianduange.cn//article/4892.html
    标签
    评论
    发布的文章

    vue3生成聊天对话框功能

    2024-07-10 18:07:36

    json基本格式

    2024-07-08 09:07:01

    大家推荐的文章
    会员中心 联系我 留言建议 回顶部
    复制成功!