0

0

HTML5/CSS3 经典案例-无插件拖拽上传图片(二)

黄舟

黄舟

发布时间:2017-03-09 16:38:29

|

2316人浏览过

|

来源于php中文网

原创

上一篇已经实现了这个项目的整体的html和css:

HTML5/CSS3 经典案例-无插件拖拽上传图片(一)

这篇博客直接在上篇的基础上完成,最终效果:

效果图1:


效果图2:

好了,请允许我把图片贴了两遍,方便大家看效果了~

可以看出我们的图片的li的html其实还是挺复杂的,于是我把html文档做了一些修改:




  • @@##@@
  • 可以看到我把li的显示,独立写到了一个p#template,默认是hidden的,这样做的好处是什么呢?避免我们每上传一个文件,在js中出现大量的创建元素与赋属性的代码,一般设计比较复杂的html元素的生成,建议使用这种方式,可以简化代码,也利于我们代码的后期维护。

    Js代码:

    /**
     * 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("
      "); }; /** * 判断是否已经上传文件了 * @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 } })();


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

      立即学习前端免费学习笔记(深入)”;

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

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

      File

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

      2. name"yt_key.png"

        Multiavatar
        Multiavatar

        Multiavatar是一个免费开源的多元文化头像生成器,可以生成高达120亿个虚拟头像

        下载
      3. size45524

      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 有兴趣的可以去一个一个查看。

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

          
          
      
          
      HTML5/CSS3 经典案例-无插件拖拽上传图片(二)

      相关文章

      HTML速学教程(入门课程)
      HTML速学教程(入门课程)

      HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!

      下载

      相关标签:

      本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

      热门AI工具

      更多
      DeepSeek
      DeepSeek

      幻方量化公司旗下的开源大模型平台

      豆包大模型
      豆包大模型

      字节跳动自主研发的一系列大型语言模型

      通义千问
      通义千问

      阿里巴巴推出的全能AI助手

      腾讯元宝
      腾讯元宝

      腾讯混元平台推出的AI助手

      文心一言
      文心一言

      文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

      讯飞写作
      讯飞写作

      基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

      即梦AI
      即梦AI

      一站式AI创作平台,免费AI图片和视频生成。

      ChatGPT
      ChatGPT

      最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

      相关专题

      更多
      2026赚钱平台入口大全
      2026赚钱平台入口大全

      2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

      33

      2026.01.31

      高干文在线阅读网站大全
      高干文在线阅读网站大全

      汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

      32

      2026.01.31

      无需付费的漫画app大全
      无需付费的漫画app大全

      想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

      36

      2026.01.31

      漫画免费在线观看地址大全
      漫画免费在线观看地址大全

      想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

      7

      2026.01.31

      漫画防走失登陆入口大全
      漫画防走失登陆入口大全

      2026最新漫画防走失登录入口合集,汇总多个稳定可用网址,助你畅享高清无广告漫画阅读体验。阅读专题下面的文章了解更多详细内容。

      11

      2026.01.31

      php多线程怎么实现
      php多线程怎么实现

      PHP本身不支持原生多线程,但可通过扩展如pthreads、Swoole或结合多进程、协程等方式实现并发处理。阅读专题下面的文章了解更多详细内容。

      1

      2026.01.31

      php如何运行环境
      php如何运行环境

      本合集详细介绍PHP运行环境的搭建与配置方法,涵盖Windows、Linux及Mac系统下的安装步骤、常见问题及解决方案。阅读专题下面的文章了解更多详细内容。

      0

      2026.01.31

      php环境变量如何设置
      php环境变量如何设置

      本合集详细讲解PHP环境变量的设置方法,涵盖Windows、Linux及常见服务器环境配置技巧,助你快速掌握环境变量的正确配置。阅读专题下面的文章了解更多详细内容。

      0

      2026.01.31

      php图片如何上传
      php图片如何上传

      本合集涵盖PHP图片上传的核心方法、安全处理及常见问题解决方案,适合初学者与进阶开发者。阅读专题下面的文章了解更多详细内容。

      2

      2026.01.31

      热门下载

      更多
      网站特效
      /
      网站源码
      /
      网站素材
      /
      前端模板

      精品课程

      更多
      相关推荐
      /
      热门推荐
      /
      最新课程
      HTML5/CSS3/JavaScript/ES6入门课程
      HTML5/CSS3/JavaScript/ES6入门课程

      共102课时 | 6.8万人学习

      HTML+CSS基础与实战
      HTML+CSS基础与实战

      共132课时 | 9.9万人学习

      前端开发(基础+实战项目合集)
      前端开发(基础+实战项目合集)

      共60课时 | 3.9万人学习

      关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
      php中文网:公益在线php培训,帮助PHP学习者快速成长!
      关注服务号 技术交流群
      PHP中文网订阅号
      每天精选资源文章推送

      Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号