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

  • 当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: “”

  6. __proto__: File

可以看到包含上面的一些属性,也就是说,如果使用支持html5的浏览器,给input=type设置onchange事件,用户选择图片或者文件后,就可以做出图片的显示或者文件大小和类型的判断。

2、FileReader主要用于异步读取文件内容,注意是异步的,上例我们使用了它的readAsDataURL的方法,关于DataUri的知识可以自己去百度下。

另外还提供了:readAsText用于读取文本;readAsArrayBuffer和readAsBinaryString方法;

还提供了一些事件:onloadstart, onload, onprogress ,onerror , onloaded , onabort 有兴趣的可以去一个一个查看。

最后页面调用,大功告成:

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

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

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

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

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

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

最后

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

前端视频资料:

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

整理了一些学习文档资料出来是给大家的。知识点涉及比较全面,包括但不限于前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等

[外链图片转存中…(img-9gfKuA9A-1712671853149)]

前端视频资料:
[外链图片转存中…(img-4U1GFRbX-1712671853149)]

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

  • 24
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值