FManager.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. /**
  2. * HTML5上传插件
  3. * @author yangjian<yangjian102621@gmail.com>
  4. * @version 1.0.1
  5. * @site https://git.oschina.net/blackfox/ajaxUpload
  6. */
  7. (function($) {
  8. //判断浏览器是否支持html5
  9. if ( typeof FormData == "undefined" )
  10. throw new Error("您当前的浏览器不支持HTML5,请先升级浏览器才能使用该上传插件!");
  11. //image crop
  12. $.fn.imageCrop = function(__width, __height) {
  13. $(this).on("load", function () {
  14. var width, height, left, top;
  15. var orgRate = this.width/this.height;
  16. var cropRate = __width/__height;
  17. if ( orgRate >= cropRate ) {
  18. height = __height;
  19. width = __width * orgRate;
  20. top = 0;
  21. left = (width - __width)/2;
  22. } else {
  23. width = __width;
  24. height = __height / orgRate;
  25. left = 0;
  26. //top = (height - __height)/2;
  27. top = 0;
  28. }
  29. $(this).css({
  30. "position" : "absolute",
  31. top : -top + "px",
  32. left : -left + "px",
  33. width : width + "px",
  34. height : height + "px"
  35. });
  36. });
  37. }
  38. //make element draggable
  39. $.fn.draggable = function(options) {
  40. var defaults = {
  41. handler : null
  42. }
  43. options = $.extend(defaults, options);
  44. var __self = this;
  45. $(options.handler).mousedown(function(e) {
  46. var offsetLeft = e.pageX - $(__self).position().left;
  47. var offsetTop = e.pageY - $(__self).position().top;
  48. $(document).mousemove(function(e) {
  49. //清除拖动鼠标的时候选择文本
  50. window.getSelection ? window.getSelection().removeAllRanges():document.selection.empty();
  51. $(__self).css({
  52. 'top' : e.pageY-offsetTop + 'px',
  53. 'left' : e.pageX-offsetLeft + 'px'
  54. });
  55. });
  56. }).mouseup(function() {
  57. $(document).unbind('mousemove');
  58. });
  59. }
  60. if ( Array.prototype.remove == undefined ) {
  61. Array.prototype.remove = function(item) {
  62. for ( var i = 0; i < this.length; i++ ) {
  63. if ( this[i] == item ) {
  64. this.splice(i, 1);
  65. break;
  66. }
  67. }
  68. }
  69. }
  70. if ( Array.prototype.uinque == undefined ) {
  71. Array.prototype.uinque = function() {
  72. var result = [], hash = {};
  73. for ( var i = 0, item; (item = this[i]) != null; i++ ) {
  74. if ( !hash[item] ) {
  75. result.push(item);
  76. hash[item] = true;
  77. }
  78. }
  79. return result;
  80. }
  81. }
  82. window.FManager = function(options) {
  83. options = $.extend({
  84. lang : {},
  85. list_url : null,
  86. data_type : "json",
  87. fileType : "image", //文件类型,默认是图片,可选flash,media,file
  88. top : 20,
  89. callback : function(data) {
  90. console.log(data);
  91. }
  92. }, options);
  93. var o = {};
  94. o.dialog = null;
  95. o.selectedList = new Array(); //the file queue upload successfully
  96. o.page = 1; //服务器图片列表页码
  97. o.marker = null, //七牛云上传的分页标识
  98. o.noRecord = false;
  99. //close the dialog
  100. o.close = function () {
  101. o.dialog.remove();
  102. try {JDialog.lock.hide();} catch (e) {}
  103. if (typeof options.close == 'function') {
  104. options.close();
  105. }
  106. }
  107. //create dialog
  108. function createDialog() {
  109. var builder = new StringBuilder();
  110. builder.append('<div class="uedbody ke-animated"><div class="ued_title">');
  111. builder.append('<div class="uedbar"><span>'+options.lang.title+'</span></div><div class="close_btn icon" title="'+options.lang.closeText+'"></div>');
  112. builder.append('</div><div class="wrapper"><div class="wra_body wra_body_server">');
  113. builder.append('<div class="tab-panel online"><div class="imagelist"><ul class="list clearfix"></ul><div class="no-data"></div></div></div>');
  114. builder.append('<div class="loading-icon"></div></div></div><div class="wra-btn-group">');
  115. builder.append('<div class="tip-text">'+options.lang.loadMoreData+'</div>')
  116. builder.append('<span class="btn btn-primary btn-confirm">'+options.lang.confirmBtnText+'</span>')
  117. builder.append('<span class="btn btn-default btn-cancel">'+options.lang.cancelBtnText+'</span></div></div>');
  118. o.dialog = $(builder.toString());
  119. $("body").append(o.dialog);
  120. if (options.top == 0) {
  121. options.top = ($(window).height() - o.dialog.height())/2;
  122. }
  123. o.dialog.css({
  124. left : ($(window).width() - o.dialog.width())/2 + "px",
  125. top : options.top + "px"
  126. });
  127. //给对话框添加拖拽事件
  128. o.dialog.draggable({handler : o.dialog.find(".ued_title")});
  129. loadFilesFromServer();
  130. }
  131. //绑定元素事件
  132. function bindEvent() {
  133. //关闭对话框
  134. G(".close_btn").on("click", function() {
  135. o.close();
  136. });
  137. //点击确认|取消按钮事件
  138. G(".btn-confirm").on("click", function() {
  139. options.callback(o.selectedList);
  140. o.close();
  141. });
  142. G(".btn-cancel").on("click", function() {
  143. o.close();
  144. });
  145. //当滚动条滚到底部时自动去加载图片
  146. G(".imagelist").on("scroll", function() {
  147. if ( this.scrollTop + this.clientHeight >= this.scrollHeight ) {
  148. loadFilesFromServer();
  149. }
  150. });
  151. }
  152. //query
  153. function G(query) {
  154. return o.dialog.find(query);
  155. }
  156. //从服务器上获取图片地址
  157. function loadFilesFromServer() {
  158. if ( !options.list_url ) {
  159. G(".online .no-data").html('<span class="error">'+options.lang.noListUrl+'</span>').show();
  160. return false;
  161. }
  162. if ( o.noRecord ) return false;
  163. G(".loading-icon").show(); //显示加载图标
  164. $.get(options.list_url, {
  165. page : o.page,
  166. marker : o.marker,
  167. fileType : options.fileType
  168. }, function(res) {
  169. G(".loading-icon").hide(); //隐藏加载图标
  170. if ( res.code == "000" ) {
  171. if (!res.data[0]) {
  172. G(".online .no-data").html(options.lang.noDataText).show();
  173. return;
  174. }
  175. o.page++;
  176. o.marker = res.extra; //存储marker
  177. appendFiles(res.data);
  178. } else {
  179. G(".online .no-data").text(options.lang.noDataText).show();
  180. o.noRecord = true;
  181. }
  182. }, "json");
  183. }
  184. //追加元素到图片列表
  185. function appendFiles(data) {
  186. $.each(data, function(idx, item) {
  187. var builder = new StringBuilder();
  188. builder.append('<li>');
  189. var extension = getFileExt(item.thumbURL);
  190. if ( extension == '' ) extension = "default";
  191. extension = extension.toLowerCase();
  192. //如果不是图片,则根据文件的后缀名去加载对应的缩略图
  193. var imgSize = item.width+'x'+item.height; //图片尺寸
  194. if ( "jpg|jpeg|gif|png|bmp".indexOf(extension) == -1 ) {
  195. imgSize = formatFileSize(item.filesize); //如果是文件则显示文件大小
  196. builder.append('<span class="icon-placeholder icon-default icon-'+extension+'" data-src="'+item.oriURL+'"></span>');
  197. } else {
  198. builder.append('<img src="'+item.thumbURL+'" data-src="'+item.oriURL+'" border="0">');
  199. }
  200. builder.append('<span class="ic"><em class="img-size">'+imgSize+'</em></span></li>');
  201. var $image = $(builder.toString());
  202. //绑定选择图片事件
  203. $image.find(".ic").on("click", function() {
  204. var src = $(this).prev().attr("data-src");
  205. var oldSrc = $('.selected:eq(0)').prev().attr("data-src");
  206. //多选
  207. // if ( $(this).hasClass("selected") ) {
  208. // $(this).removeClass("selected");
  209. // o.selectedList.remove(src);
  210. // } else {
  211. // $(this).addClass("selected");
  212. // o.selectedList.push(src);
  213. // }
  214. //这里暂时改成单选
  215. $('.selected:eq(0)').removeClass("selected"); //移除之前的选中的图片
  216. o.selectedList.remove(oldSrc);
  217. $(this).addClass("selected");
  218. o.selectedList.push(src);
  219. //console.log(o.selectedList);
  220. });
  221. //裁剪显示图片
  222. $image.find("img").imageCrop(113, 113);
  223. G(".imagelist .list").append($image);
  224. });
  225. }
  226. //获取文件后缀名
  227. function getFileExt(filename) {
  228. if ( !filename ) return false;
  229. var position = filename.lastIndexOf('.')
  230. if ( position != -1 ) {
  231. return filename.substr(position+1).toLowerCase();
  232. }
  233. return false;
  234. }
  235. //format file size(格式化文件大小)
  236. function formatFileSize(size) {
  237. if ( size/1048576 > 1 ) {
  238. return (size/1048576).toFixed(2)+"MB";
  239. } else {
  240. return (size/1024).toFixed(2)+"KB";
  241. }
  242. }
  243. //initialize dialog
  244. createDialog();
  245. bindEvent();
  246. return o;
  247. }; //end of JUpload
  248. //string builder
  249. var StringBuilder = function() {
  250. var buffer = new Array();
  251. StringBuilder.prototype.append = function(str) {
  252. buffer.push(str);
  253. }
  254. StringBuilder.prototype.toString = function () {
  255. return buffer.join("");
  256. }
  257. }
  258. })(jQuery);