image_editor.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. ;
  2. (function ($) {
  3. var defaults = {
  4. max_pics:8,
  5. browse_button: 'add_pic',
  6. container: 'container',
  7. drop_element: 'container',
  8. max_file_size: '10mb',
  9. dragdrop: true,
  10. chunk_size: '4mb',
  11. uptoken_url: site_root + '/index.php?r=site/Gettoken&type=1',
  12. domain: 'http://iyaya-neighborhood.u.qiniudn.com/',
  13. auto_start: true
  14. };
  15. var options = null;
  16. var privateVal = function() {
  17. return {
  18. post_lock:false,
  19. loading_pic: site_root + '/images/load_img.gif',//需要修改
  20. no_img : site_root + '/image/no_img.png',//需要修改
  21. runtimes: 'html5,html4,flash',
  22. thumb_suffix: '?imageView2/1/w/100/h/100',//缩略图的后缀
  23. fancy_js_url: site_root + '/js/fancybox/source/jquery.fancybox.js',
  24. fancy_css_url: site_root + '/js/fancybox/source/jquery.fancybox.css',
  25. ele_id:'',//显示图片编辑器的dom
  26. controllerHTML:'<div class="tip_layer"><div class="photo_list" style="display: block;"><ul><li class="on" id="add_pic"></li></ul><p class="text_tip">最多可上传options_max_pics张图片</p></div></div>',
  27. controllerCSS:'' +
  28. '.tip_layer {\
  29. position: relative;\
  30. color: #333;\
  31. }\
  32. .photo_list {\
  33. margin: 15px 10px;\
  34. padding-top: 5px;\
  35. }\
  36. .photo_list li {\
  37. float: left;\
  38. margin: 0 15px 15px 0;\
  39. position: relative;\
  40. }\
  41. .photo_list .on, .mask_lay{\
  42. width: 60px;\
  43. height: 60px;\
  44. }\
  45. .photo_cut {\
  46. width: 60px;\
  47. height: 60px;\
  48. overflow: hidden;\
  49. }\
  50. .photo_cut img {\
  51. min-width: 80px;\
  52. max-width: 80px;\
  53. }\
  54. .c_btn {\
  55. right: -10px;\
  56. top: -10px;\
  57. width: 25px;\
  58. height: 25px;\
  59. background: url(http://dzqun.gtimg.cn/quan/images/sprBg.png?t=) no-repeat;\
  60. background-size: 400px auto;\
  61. -webkit-background-size: 400px auto;\
  62. text-indent: -9999px;\
  63. position: absolute;\
  64. }\
  65. .photo_list .on {\
  66. background: #d9d9d9 url(http://dzqun.gtimg.cn/quan/images/sprBg.png?t=) no-repeat -244px -4px;\
  67. margin-right: 0;\
  68. cursor: pointer;\
  69. }\
  70. .mask_lay {\
  71. position: absolute;\
  72. left: 0;\
  73. top: 0;\
  74. -moz-opacity: 0.6;\
  75. opacity: 0.6;\
  76. background-color: #000;\
  77. }\
  78. .text_tip {\
  79. width: 100%;\
  80. line-height: 21px;\
  81. font-size: medium;\
  82. color: #afafaf;\
  83. clear: both;\
  84. }',
  85. extensions:"jpg,gif,png,jpeg"
  86. }
  87. } ();
  88. var privateFunction = {
  89. return_val:function(){
  90. },
  91. show_info:function(info){
  92. $.messager.show({
  93. title: '提示',
  94. msg: info,
  95. timeout: 3500,
  96. showType: 'slide'
  97. });
  98. },
  99. init_uploader:function(){
  100. var me = this;
  101. var uploader = new Qiniu.uploader({
  102. runtimes: privateVal.runtimes,
  103. chunk_size : '1mb',
  104. browse_button: options.browse_button,
  105. container: options.container,
  106. drop_element: options.drop_element,
  107. max_file_size: options.max_file_size,
  108. flash_swf_url: 'plupload/Moxie.swf',
  109. dragdrop: options.dragdrop,
  110. uptoken_url: options.uptoken_url,
  111. domain: options.domain,
  112. auto_start: true,
  113. //unique_names: true,
  114. // 默认 false,key为文件名。若开启该选项,SDK会为每个文件自动生成key(文件名)
  115. //save_key: true,
  116. // 默认 false。若在服务端生成uptoken的上传策略中指定了 `sava_key`,则开启,SDK在前端将不对key进行任何处理
  117. filters : {
  118. max_file_size: options.max_size,
  119. prevent_duplicates:true,
  120. mime_types: [
  121. {title : "Image files", extensions: privateVal.extensions}
  122. ]
  123. },
  124. resize: {
  125. width : 800,
  126. height : 600,
  127. quality : 90,
  128. crop: true
  129. },
  130. init: {
  131. FilesAdded: function(up, files) {
  132. var totalfiles = files.length + options.uploaded_pics.length;
  133. if (totalfiles > options.max_pics) {
  134. me.showInfo('最多只能上传'+options.max_pics+'张图片呢');
  135. //uploader.splice();
  136. return false;
  137. }
  138. plupload.each(files, function(file) {
  139. console.log(file);
  140. var loading_img = new Image();
  141. loading_img.src = privateVal.loading_pic;
  142. loading_img.onload = function(){
  143. var loading = '<li class="upload_loading"><div class="photo_cut"><img src="'+privateVal.loading_pic+'" width="60" height="60"/></div></li>';
  144. $('#'+options.browse_button).before(loading);
  145. }
  146. });
  147. },
  148. FileUploaded:function (up, file, info) {
  149. var res = $.parseJSON(info);
  150. var url = options.domain + encodeURI(res.key);
  151. var imageThumb = url+privateVal.thumb_suffix;
  152. console.log('info:');
  153. console.log(res.key);
  154. console.log('file:');
  155. console.log(file.id);
  156. var img = new Image();
  157. img.src = imageThumb;
  158. img.onload = function(){
  159. // var del_img = privateFunction.Del_img();
  160. $('.photo_list ul li.upload_loading').last().find('img').attr('src',imageThumb).parent().append('<a href="javascript:;" id="img_'+file.id+'" key="'+res.key+'" class="c_btn spr db " title="">关闭</a>').parent().removeClass('upload_loading');
  161. $('#img_'+file.id).on("click",function(){
  162. console.log($(this).prev().attr('init').replace(privateVal.thumb_suffix, ""));
  163. //console.log($(this).prev().attr('init').replace(privateVal.thumb_suffix, ""));
  164. //privateFunction.remove(options.uploaded_pics,($(this).prev().attr('src').replace(privateVal.thumb_suffix, "")));
  165. privateFunction.remove(options.uploaded_pics,($(this).prev().attr('init').replace(privateVal.thumb_suffix, "")));
  166. $(this).parent().parent().remove();
  167. return false;
  168. });
  169. };
  170. options.uploaded_pics.push(url);
  171. console.log(options.uploaded_pics);
  172. },
  173. 'Key': function(up, file) {
  174. // 若想在前端对每个文件的key进行个性化处理,可以配置该函数
  175. // 该配置必须要在 unique_names: false , save_key: false 时才生效
  176. var key = 'admin_'+Date.parse(new Date());
  177. // do something with key here
  178. return key;
  179. },
  180. UploadComplete:function(up, files){//所有上传成功
  181. //$('#success').show();
  182. },
  183. 'Error': function(up, err, errTip) {
  184. console.log(err);
  185. console.log(errTip);
  186. me.show_info('上传失败,请稍后再试');
  187. $('.photo_list ul li.upload_loading').last().remove();
  188. }
  189. }
  190. });
  191. },
  192. indexOf:function(arr,val) {
  193. for (var i = 0; i < arr.length; i++) {
  194. if (arr[i] == val) return i;
  195. }
  196. return -1;
  197. },
  198. remove:function(arr,val) {
  199. var index = privateFunction.indexOf(arr,val);
  200. if (index > -1) {
  201. arr.splice(index, 1);
  202. }
  203. console.log(arr);
  204. },
  205. include_fancybox:function(){$("<script>").attr({
  206. src: privateVal.fancy_js_url
  207. }).appendTo("head");
  208. $("<link>").attr({ rel: "stylesheet",
  209. type: "text/css",
  210. href: privateVal.fancy_css_url
  211. }).appendTo("head");
  212. },
  213. include_resource:function(){
  214. var resources = [site_root + '/js/plupload/plupload.full.min.js', site_root + '/js/qiniu.js'];
  215. for(r in resources){
  216. $("<script>").attr({
  217. src: resources[r]
  218. }).appendTo("head");
  219. }
  220. },
  221. createCSS: function() {
  222. var j = document.createElement("style");
  223. j.type = "text/css";
  224. j.innerHTML = privateVal.controllerCSS;
  225. document.getElementsByTagName("head")[0].appendChild(j);
  226. },
  227. createHTML: function() {
  228. $(".image_editor").remove();
  229. var j = document.createElement("div");
  230. j.id = "editor_" + new Date().getTime();
  231. j.className="image_editor";
  232. j.innerHTML = privateVal.controllerHTML.replace('options_max_pics',options.max_pics);
  233. $('#'+options.ele_id).before(j).css('padding-top',50);
  234. },
  235. init_events:function(){
  236. $('.photo_cut a.c_btn').on("click",function(){
  237. //alert('click');
  238. console.log($(this).prev().attr('init').replace(privateVal.thumb_suffix, ""));
  239. privateFunction.remove(options.uploaded_pics,$(this).prev().attr('init').replace(privateVal.thumb_suffix, ""));
  240. $(this).parent().parent().remove();
  241. return false;
  242. });
  243. },
  244. init_dom:function(){
  245. //var _class = (options["addClass"])?"photo_cut "+options.addClass:"photo_cut";
  246. for(var i in options.uploaded_pics){
  247. var img = new Image();
  248. img.src = options.uploaded_pics[i]+privateVal.thumb_suffix;
  249. img.id = options.uploaded_pics[i].substring(60,69).replace(/\.jpg$/,'')+new Date().getTime();
  250. var loading = '<li class="upload_loading"><div class="photo_cut"><img id="img_'+img.id+'" src="'+privateVal.loading_pic+'" init="'+options.uploaded_pics[i]+'"/></div></li>';
  251. if(options["fancyboxType"])
  252. {
  253. img.src = options.uploaded_pics[i];
  254. var loading = '<li class="upload_loading"><div class="photo_cut">'+
  255. '<a href="'+img.src+'" class="fancybox" rel="fancybox-textarea">'+
  256. '<img id="img_'+img.id+'" src="'+privateVal.loading_pic+'" init="'+options.uploaded_pics[i]+'" style="width: 100px;"/>'+
  257. '</a></div></li>';
  258. }
  259. $('#'+options.browse_button).before(loading);
  260. img.onload = function(){
  261. //var img_dom = '<li class="upload_loading"><div class="photo_cut"><img src="'+options.uploaded_pics[i]+'" /></div></li>';
  262. //$('#'+options.browse_button).before(img_dom);
  263. //$('.photo_list ul li.upload_loading').last().find('img').attr('src',this.src).parent().append('<a href="javascript:;" id="img_'+this.id+'" class="c_btn spr db " title="">关闭</a>').parent().removeClass('upload_loading');
  264. $("#img_"+this.id).attr('src',this.src);
  265. $("#img_"+this.id).parent().append('<a href="javascript:;" id="remove_'+this.id+'" class="c_btn spr db " title="">关闭</a>').parent().removeClass('upload_loading');
  266. $('#remove_'+this.id).on("click",function(){
  267. console.log($(this).prev().attr('init'));
  268. console.log($(this).prev().attr('init').replace(privateVal.thumb_suffix, ""));
  269. privateFunction.remove(options.uploaded_pics,$(this).prev().attr('init').replace(privateVal.thumb_suffix, ""));
  270. $(this).parent().parent().remove();
  271. return false;
  272. });
  273. }
  274. }
  275. },
  276. other_events:function()
  277. {
  278. if(options["readOnlyImg"])
  279. {
  280. $("#add_pic,.text_tip").remove();
  281. }
  282. }
  283. }
  284. var methods = {
  285. init: function(args) {
  286. options = $.extend(defaults, args);
  287. if(!options.uploaded_pics){
  288. privateFunction.show_info('uploaded_pics参数不能为空');
  289. }
  290. privateFunction.include_resource(); //加载QiNiu js
  291. privateFunction.createCSS();
  292. privateFunction.createHTML();
  293. if(options.include_fancybox==1)
  294. {
  295. privateFunction.include_fancybox();
  296. }
  297. if(options.uploaded_pics.length){
  298. // for(var x in options.uploaded_pics)
  299. // {
  300. // options.uploaded_pics[x] = encodeURI(options.uploaded_pics[x]);
  301. // //console.log(options.uploaded_pics[x]);
  302. // }
  303. // console.log(options.uploaded_pics);
  304. privateFunction.init_dom();
  305. }
  306. privateFunction.init_events();
  307. privateFunction.init_uploader();
  308. privateFunction.other_events();
  309. },
  310. pushYourFace:function(args)
  311. {
  312. // console.log(args);
  313. },
  314. getPics:function()
  315. {
  316. return options.uploaded_pics;
  317. }
  318. };
  319. $.fn.image_editor = function() {
  320. var method = arguments[0];
  321. if(methods[method]) {
  322. method = methods[method];
  323. } else if( typeof(method) == 'object' || !method ) {
  324. method = methods.init;
  325. } else {
  326. return this;
  327. }
  328. var args = arguments[1];
  329. return method.call(this,args);
  330. }
  331. if (typeof(site_root) == 'undefined'){
  332. site_root = 'http://admin.ddxq.mobi';
  333. }
  334. })(jQuery);