FManager.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  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 ( !window.applicationCache )
  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. multiple: false,
  90. callback: function (data) {
  91. console.log(data);
  92. }
  93. }, options);
  94. var o = {};
  95. o.dialog = null;
  96. o.selectedList = new Array(); //the file queue upload successfully
  97. o.page = 1; //服务器图片列表页码
  98. o.marker = null, //七牛云上传的分页标识
  99. o.noRecord = false;
  100. //close the dialog
  101. o.close = function () {
  102. o.dialog.remove();
  103. try {
  104. JDialog.lock.hide();
  105. } catch (e) {
  106. }
  107. if (typeof options.close == 'function') {
  108. options.close();
  109. }
  110. }
  111. //create dialog
  112. function createDialog() {
  113. var builder = new StringBuilder();
  114. builder.append('<div class="uedbody ke-animated"><div class="ued_title">');
  115. builder.append('<div class="uedbar"><span>' + options.lang.title + '</span></div><div class="close_btn icon" title="' + options.lang.closeText + '"></div>');
  116. builder.append('</div><div class="wrapper"><div class="wra_body wra_body_server">');
  117. builder.append('<div class="tab-panel online"><div class="imagelist"><ul class="list clearfix"></ul><div class="no-data"></div></div></div>');
  118. builder.append('<div class="loading-icon"></div></div></div><div class="wra-btn-group">');
  119. builder.append('<div class="tip-text">' + options.lang.loadMoreData + '</div>')
  120. builder.append('<span class="btn btn-primary btn-confirm">' + options.lang.confirmBtnText + '</span>')
  121. builder.append('<span class="btn btn-default btn-cancel">' + options.lang.cancelBtnText + '</span></div></div>');
  122. o.dialog = $(builder.toString());
  123. $("body").append(o.dialog);
  124. if (options.top == 0) {
  125. options.top = ($(window).height() - o.dialog.height()) / 2;
  126. }
  127. o.dialog.css({
  128. left: ($(window).width() - o.dialog.width()) / 2 + "px",
  129. top: options.top + "px"
  130. });
  131. //给对话框添加拖拽事件
  132. o.dialog.draggable({handler: o.dialog.find(".ued_title")});
  133. loadFilesFromServer();
  134. }
  135. //绑定元素事件
  136. function bindEvent() {
  137. //关闭对话框
  138. G(".close_btn").on("click", function () {
  139. o.close();
  140. });
  141. //点击确认|取消按钮事件
  142. G(".btn-confirm").on("click", function () {
  143. options.callback(o.selectedList);
  144. o.close();
  145. });
  146. G(".btn-cancel").on("click", function () {
  147. o.close();
  148. });
  149. //当滚动条滚到底部时自动去加载图片
  150. G(".imagelist").on("scroll", function () {
  151. if (this.scrollTop + this.clientHeight >= this.scrollHeight) {
  152. loadFilesFromServer();
  153. }
  154. });
  155. }
  156. //query
  157. function G(query) {
  158. return o.dialog.find(query);
  159. }
  160. //从服务器上获取图片地址
  161. function loadFilesFromServer() {
  162. if (!options.list_url) {
  163. G(".online .no-data").html('<span class="error">' + options.lang.noListUrl + '</span>').show();
  164. return false;
  165. }
  166. if (o.noRecord) return false;
  167. G(".loading-icon").show(); //显示加载图标
  168. $.get(options.list_url, {
  169. page: o.page,
  170. marker: o.marker,
  171. fileType: options.fileType
  172. }, function (res) {
  173. G(".loading-icon").hide(); //隐藏加载图标
  174. if (res.code == "000") {
  175. if (!res.data[0]) {
  176. G(".online .no-data").html(options.lang.noDataText).show();
  177. return;
  178. }
  179. o.page++;
  180. o.marker = res.extra; //存储marker
  181. appendFiles(res.data);
  182. } else {
  183. G(".online .no-data").text(options.lang.noDataText).show();
  184. o.noRecord = true;
  185. }
  186. }, "json");
  187. }
  188. //追加元素到图片列表
  189. function appendFiles(data) {
  190. $.each(data, function (idx, item) {
  191. var builder = new StringBuilder();
  192. builder.append('<li>');
  193. var extension = getFileExt(item.thumbURL);
  194. if (extension == '') extension = "default";
  195. extension = extension.toLowerCase();
  196. //如果不是图片,则根据文件的后缀名去加载对应的缩略图
  197. var imgSize = item.width + 'x' + item.height; //图片尺寸
  198. if ("jpg|jpeg|gif|png|bmp".indexOf(extension) == -1) {
  199. imgSize = formatFileSize(item.filesize); //如果是文件则显示文件大小
  200. builder.append('<span class="icon-placeholder icon-default icon-' + extension + '" data-src="' + item.oriURL + '"></span>');
  201. } else {
  202. builder.append('<img src="' + item.thumbURL + '" data-src="' + item.oriURL + '" border="0">');
  203. }
  204. builder.append('<span class="ic"><em class="img-size">' + imgSize + '</em></span></li>');
  205. var $image = $(builder.toString());
  206. //绑定选择图片事件
  207. $image.find(".ic").on("click", function () {
  208. var src = $(this).prev().attr("data-src");
  209. var oldSrc = $('.selected:eq(0)').prev().attr("data-src");
  210. if (options.multiple) {
  211. //多选
  212. if ($(this).hasClass("selected")) {
  213. $(this).removeClass("selected");
  214. o.selectedList.remove(src);
  215. } else {
  216. $(this).addClass("selected");
  217. o.selectedList.push(src);
  218. }
  219. } else {
  220. //这里暂时改成单选
  221. $('.selected:eq(0)').removeClass("selected"); //移除之前的选中的图片
  222. o.selectedList.remove(oldSrc);
  223. $(this).addClass("selected");
  224. o.selectedList.push(src);
  225. }
  226. //console.log(o.selectedList);
  227. });
  228. //裁剪显示图片
  229. $image.find("img").imageCrop(113, 113);
  230. G(".imagelist .list").append($image);
  231. });
  232. }
  233. //获取文件后缀名
  234. function getFileExt(filename) {
  235. if (!filename) return false;
  236. var position = filename.lastIndexOf('.')
  237. if (position != -1) {
  238. return filename.substr(position + 1).toLowerCase();
  239. }
  240. return false;
  241. }
  242. //format file size(格式化文件大小)
  243. function formatFileSize(size) {
  244. if (size / 1048576 > 1) {
  245. return (size / 1048576).toFixed(2) + "MB";
  246. } else {
  247. return (size / 1024).toFixed(2) + "KB";
  248. }
  249. }
  250. //initialize dialog
  251. createDialog();
  252. bindEvent();
  253. return o;
  254. }; //end of JUpload
  255. //string builder
  256. var StringBuilder = function () {
  257. var buffer = new Array();
  258. StringBuilder.prototype.append = function (str) {
  259. buffer.push(str);
  260. }
  261. StringBuilder.prototype.toString = function () {
  262. return buffer.join("");
  263. }
  264. }
  265. })(jQuery);