当前位置:Gxlcms > html代码 > HTML5/CSS3经典案例-无插件拖拽上传图片(二)

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

时间:2021-07-01 10:21:17 帮助过:35人阅读

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

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

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

效果图1:


效果图2:

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

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


  1. <span style="font-size:12px;"><body>
  2. <p id="uploadBox">
  3. </p>
  4. <p id="template" class="hidden">
  5. <li>
  6. <img src=""/>
  7. <span class="progress"></span>
  8. <span class="percentage"></span>
  9. </li>
  10. </p>
  11. </body></span>

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

Js代码:

  1. <span style="font-size:12px;">/**
  2. * User: zhy
  3. * Date: 14-6-16
  4. * Time: 下午11:06
  5. */
  6. var ZhangHongyang = {};
  7. ZhangHongyang.html5upload = (function ()
  8. {
  9. var _ID_UPLOAD_BOX = "uploadBox";
  10. var _CLASS_PROGRESS = "progress";
  11. var _CLASS_PERCENTAGE = "percentage";
  12. var _tip_no_drag = "将文件拖拽至此区域,即可上传!";
  13. var _tip_drag_over = "释放鼠标立即上传!";
  14. var _uploadEle = null;
  15. /**
  16. * 初始化对象与事件
  17. * @private
  18. */
  19. function _init()
  20. {
  21. _uploadEle = document.getElementById(_ID_UPLOAD_BOX);
  22. _uploadEle.ondragenter = _onDragEnter;
  23. _uploadEle.ondragover = _onDragOver;
  24. _uploadEle.ondragleave = _onDragLeave;
  25. _uploadEle.ondrop = _onDrop;
  26. _setStatusNoDrag();
  27. };
  28. /**
  29. * 正在拖拽状态
  30. * @private
  31. */
  32. function _setDragOverStatus()
  33. {
  34. if (_checkContatinsElements())return;
  35. _uploadEle.innerText = _tip_drag_over;
  36. _uploadEle.style.border = "2px dashed #777";
  37. $(_uploadEle).css({lineHeight: $(_uploadEle).height() + "px"});
  38. }
  39. /**
  40. * 初始化状态
  41. * @private
  42. */
  43. function _setStatusNoDrag()
  44. {
  45. if (_checkContatinsElements())return;
  46. _uploadEle.innerText = _tip_no_drag;
  47. _uploadEle.style.border = "2px dashed #777";
  48. $(_uploadEle).css({lineHeight: $(_uploadEle).height() + "px"});
  49. }
  50. /**
  51. * 上传文件
  52. * @private
  53. */
  54. function _setDropStatus()
  55. {
  56. if (_checkContatinsElements())return;
  57. _uploadEle.innerText = "";
  58. _uploadEle.style.border = "1px solid #444";
  59. $(_uploadEle).css({lineHeight: "1em"});
  60. $(_uploadEle).append("<ul></ul>");
  61. };
  62. /**
  63. * 判断是否已经上传文件了
  64. * @private
  65. */
  66. function _checkContatinsElements()
  67. {
  68. return !!$(_uploadEle).find("li").size();
  69. }
  70. /**
  71. * 当ondragenter触发
  72. * @private
  73. */
  74. function _onDragEnter(ev)
  75. {
  76. _setDragOverStatus();
  77. }
  78. /**
  79. * 当ondargmove触发
  80. * @private
  81. */
  82. function _onDragOver(ev)
  83. {
  84. //ondragover中必须组织事件的默认行为,默认地,无法将数据/元素放置到其他元素中。
  85. ev.preventDefault();
  86. }
  87. /**
  88. * 当dragleave触发
  89. * @private
  90. */
  91. function _onDragLeave(ev)
  92. {
  93. _setStatusNoDrag();
  94. }
  95. /**
  96. * ondrop触发
  97. * @private
  98. */
  99. function _onDrop(ev)
  100. {
  101. //drop 事件的默认行为是以链接形式打开,所以也需要阻止其默认行为。
  102. ev.preventDefault();
  103. _setDropStatus();
  104. //拿到拖入的文件
  105. var files = ev.dataTransfer.files;
  106. var len = files.length;
  107. for (var i = 0; i < len; i++)
  108. {
  109. //页面上显示需要上传的文件
  110. _showUploadFile(files[i]);
  111. }
  112. }
  113. /**
  114. * 页面上显示需要上传的文件
  115. * @private
  116. */
  117. function _showUploadFile(file)
  118. {
  119. var reader = new FileReader();
  120. // console.log(file)
  121. // console.log(reader);
  122. //判断文件类型
  123. if (file.type.match(/image*/))
  124. {
  125. reader.onload = function (e)
  126. {
  127. var formData = new FormData();
  128. var li = $("#template li").clone();
  129. var img = li.find("img");
  130. var progress = li.find(".progress");
  131. var percentage = li.find(".percentage");
  132. percentage.text("0%");
  133. img.attr("src", e.target.result);
  134. $("ul", $(_uploadEle)).append(li);
  135. $(_uploadEle).find("li").size() == 10 && $(_uploadEle).width(($(_uploadEle).width() + 8) + "px").css("overflow", "auto");
  136. formData.append("uploadFile", file);
  137. //上传文件到服务器
  138. _uploadToServer(formData, li, progress, percentage);
  139. };
  140. reader.readAsDataURL(file);
  141. }
  142. else
  143. {
  144. console.log("此" + file.name + "不是图片文件!");
  145. }
  146. }
  147. /**
  148. * 上传文件到服务器
  149. * @private
  150. */
  151. function _uploadToServer(formData, li, progress, percentage)
  152. {
  153. var xhr = new XMLHttpRequest();
  154. xhr.open("POST", "http://localhost:8080/strurts2fileupload/uploadAction", true);
  155. xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest', 'Content-Type', 'multipart/form-data;');
  156. //HTML5新增的API,存储了上传过程中的信息
  157. xhr.upload.onprogress = function (e)
  158. {
  159. var percent = 0;
  160. if (e.lengthComputable)
  161. {
  162. //更新页面显示效果
  163. percent = 100 * e.loaded / e.total;
  164. progress.height(percent );
  165. percentage.text(percent + "%");
  166. percent >= 100 && li.addClass("done");
  167. }
  168. };
  169. xhr.send(formData);
  170. }
  171. //把init方法公布出去
  172. return{
  173. init: _init }
  174. })();
  175. </span>


注释写得很详细,这次没有直接使用字面量创建对象,因为我不希望使用者可以访问所有的方式和变量,使用了简单的闭包,可以看出几乎所有的方法和变量都是_开头,是因为我认为它们是私有的,我也没有公布出来,唯一公布的就是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 有兴趣的可以去一个一个查看。

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

  1. <span style="font-size:12px;"> <script type="text/javascript" src="jquery-1.8.3.js"></script>
  2. <script type="text/javascript" src="js/html5upload.js"></script>
  3. <script type="text/javascript">
  4. window.onload = function ()
  5. {
  6. ZhangHongyang.html5upload.init();
  7. }
  8. ;
  9. </script></span>

以上就是HTML5/CSS3 经典案例-无插件拖拽上传图片(二) 的详细内容,更多请关注Gxl网其它相关文章!

人气教程排行