image.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493
  1. (function () {
  2. var utils = UM.utils,
  3. browser = UM.browser,
  4. Base = {
  5. checkURL: function (url) {
  6. if(!url) return false;
  7. url = utils.trim(url);
  8. if (url.length <= 0) {
  9. return false;
  10. }
  11. if (url.search(/http:\/\/|https:\/\//) !== 0) {
  12. url += 'http://';
  13. }
  14. url=url.replace(/\?[\s\S]*$/,"");
  15. if (!/(.gif|.jpg|.jpeg|.png)$/i.test(url)) {
  16. return false;
  17. }
  18. return url;
  19. },
  20. getAllPic: function (sel, $w, editor) {
  21. var me = this,
  22. arr = [],
  23. $imgs = $(sel, $w);
  24. $.each($imgs, function (index, node) {
  25. $(node).removeAttr("width").removeAttr("height");
  26. // if (node.width > editor.options.initialFrameWidth) {
  27. // me.scale(node, editor.options.initialFrameWidth -
  28. // parseInt($(editor.body).css("padding-left")) -
  29. // parseInt($(editor.body).css("padding-right")));
  30. // }
  31. return arr.push({
  32. _src: node.src,
  33. src: node.src
  34. });
  35. });
  36. return arr;
  37. },
  38. scale: function (img, max, oWidth, oHeight) {
  39. var width = 0, height = 0, percent, ow = img.width || oWidth, oh = img.height || oHeight;
  40. if (ow > max || oh > max) {
  41. if (ow >= oh) {
  42. if (width = ow - max) {
  43. percent = (width / ow).toFixed(2);
  44. img.height = oh - oh * percent;
  45. img.width = max;
  46. }
  47. } else {
  48. if (height = oh - max) {
  49. percent = (height / oh).toFixed(2);
  50. img.width = ow - ow * percent;
  51. img.height = max;
  52. }
  53. }
  54. }
  55. return this;
  56. },
  57. close: function ($img) {
  58. $img.css({
  59. top: ($img.parent().height() - $img.height()) / 2,
  60. left: ($img.parent().width()-$img.width())/2
  61. }).prev().on("click",function () {
  62. if ( $(this).parent().remove().hasClass("edui-image-upload-item") ) {
  63. //显示图片计数-1
  64. Upload.showCount--;
  65. Upload.updateView();
  66. }
  67. });
  68. return this;
  69. },
  70. createImgBase64: function (img, file, $w) {
  71. if (browser.webkit) {
  72. //Chrome8+
  73. img.src = window.webkitURL.createObjectURL(file);
  74. } else if (browser.gecko) {
  75. //FF4+
  76. img.src = window.URL.createObjectURL(file);
  77. } else {
  78. //实例化file reader对象
  79. var reader = new FileReader();
  80. reader.onload = function (e) {
  81. img.src = this.result;
  82. $w.append(img);
  83. };
  84. reader.readAsDataURL(file);
  85. }
  86. },
  87. callback: function (editor, $w, url, state) {
  88. if (state == "SUCCESS") {
  89. //显示图片计数+1
  90. Upload.showCount++;
  91. var $img = $("<img src='" + editor.options.imagePath + url + "' class='edui-image-pic' />"),
  92. $item = $("<div class='edui-image-item edui-image-upload-item'><div class='edui-image-close'></div></div>").append($img);
  93. if ($(".edui-image-upload2", $w).length < 1) {
  94. $(".edui-image-content", $w).append($item);
  95. Upload.render(".edui-image-content", 2)
  96. .config(".edui-image-upload2");
  97. } else {
  98. $(".edui-image-upload2", $w).before($item).show();
  99. }
  100. $img.on("load", function () {
  101. Base.scale(this, 120);
  102. Base.close($(this));
  103. $(".edui-image-content", $w).focus();
  104. });
  105. } else {
  106. currentDialog.showTip( state );
  107. window.setTimeout( function () {
  108. currentDialog.hideTip();
  109. }, 3000 );
  110. }
  111. Upload.toggleMask();
  112. }
  113. };
  114. /*
  115. * 本地上传
  116. * */
  117. var Upload = {
  118. showCount: 0,
  119. uploadTpl: '<div class="edui-image-upload%%">' +
  120. '<span class="edui-image-icon"></span>' +
  121. '<form class="edui-image-form" method="post" enctype="multipart/form-data" target="up">' +
  122. '<input style=\"filter: alpha(opacity=0);\" class="edui-image-file" type="file" hidefocus name="upfile" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp"/>' +
  123. '</form>' +
  124. '</div>',
  125. init: function (editor, $w) {
  126. var me = this;
  127. me.editor = editor;
  128. me.dialog = $w;
  129. me.render(".edui-image-local", 1);
  130. me.config(".edui-image-upload1");
  131. me.submit();
  132. me.drag();
  133. $(".edui-image-upload1").hover(function () {
  134. $(".edui-image-icon", this).toggleClass("hover");
  135. });
  136. if (!(UM.browser.ie && UM.browser.version <= 9)) {
  137. $(".edui-image-dragTip", me.dialog).css("display", "block");
  138. }
  139. return me;
  140. },
  141. render: function (sel, t) {
  142. var me = this;
  143. $(sel, me.dialog).append($(me.uploadTpl.replace(/%%/g, t)));
  144. return me;
  145. },
  146. config: function (sel) {
  147. var me = this,
  148. url=me.editor.options.imageUrl;
  149. url=url + (url.indexOf("?") == -1 ? "?" : "&") + "editorid="+me.editor.id;//初始form提交地址;
  150. $("form", $(sel, me.dialog)).attr("action", url);
  151. return me;
  152. },
  153. uploadComplete: function(r){
  154. var me = this;
  155. try{
  156. var json = eval('('+r+')');
  157. Base.callback(me.editor, me.dialog, json.url, json.state);
  158. }catch (e){
  159. var lang = me.editor.getLang('image');
  160. Base.callback(me.editor, me.dialog, '', (lang && lang.uploadError) || 'Error!');
  161. }
  162. },
  163. submit: function (callback) {
  164. var me = this,
  165. input = $( '<input style="filter: alpha(opacity=0);" class="edui-image-file" type="file" hidefocus="" name="upfile" accept="image/gif,image/jpeg,image/png,image/jpg,image/bmp">'),
  166. input = input[0];
  167. $(me.dialog).delegate( ".edui-image-file", "change", function ( e ) {
  168. $(this).trigger("edui.file.change", [Upload, me, input, callback]);
  169. return;
  170. if ( !this.parentNode ) {
  171. return;
  172. }
  173. $('<iframe name="up" style="display: none"></iframe>').insertBefore(me.dialog).on('load', function(){
  174. var r = this.contentWindow.document.body.innerHTML;
  175. if(r == '')return;
  176. me.uploadComplete(r);
  177. $(this).unbind('load');
  178. $(this).remove();
  179. });
  180. $(this).parent()[0].submit();
  181. Upload.updateInput( input );
  182. me.toggleMask("Loading....");
  183. callback && callback();
  184. });
  185. return me;
  186. },
  187. //更新input
  188. updateInput: function ( inputField ) {
  189. $( ".edui-image-file", this.dialog ).each( function ( index, ele ) {
  190. ele.parentNode.replaceChild( inputField.cloneNode( true ), ele );
  191. } );
  192. },
  193. //更新上传框
  194. updateView: function () {
  195. if ( Upload.showCount !== 0 ) {
  196. return;
  197. }
  198. $(".edui-image-upload2", this.dialog).hide();
  199. $(".edui-image-dragTip", this.dialog).show();
  200. $(".edui-image-upload1", this.dialog).show();
  201. },
  202. drag: function () {
  203. var me = this;
  204. //做拽上传的支持
  205. if (!UM.browser.ie9below) {
  206. me.dialog.find('.edui-image-content').on('drop',function (e) {
  207. //获取文件列表
  208. var fileList = e.originalEvent.dataTransfer.files;
  209. var img = document.createElement('img');
  210. var hasImg = false;
  211. $.each(fileList, function (i, f) {
  212. if (/^image/.test(f.type)) {
  213. //创建图片的base64
  214. Base.createImgBase64(img, f, me.dialog);
  215. var xhr = new XMLHttpRequest();
  216. xhr.open("post", me.editor.getOpt('imageUrl') + "?type=ajax", true);
  217. xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest");
  218. //模拟数据
  219. var fd = new FormData();
  220. fd.append(me.editor.getOpt('imageFieldName'), f);
  221. xhr.send(fd);
  222. xhr.addEventListener('load', function (e) {
  223. var r = e.target.response, json;
  224. me.uploadComplete(r);
  225. if (i == fileList.length - 1) {
  226. $(img).remove()
  227. }
  228. });
  229. hasImg = true;
  230. }
  231. });
  232. if (hasImg) {
  233. e.preventDefault();
  234. me.toggleMask("Loading....");
  235. }
  236. }).on('dragover', function (e) {
  237. e.preventDefault();
  238. });
  239. }
  240. },
  241. toggleMask: function (html) {
  242. var me = this;
  243. var $mask = $(".edui-image-mask", me.dialog);
  244. if (html) {
  245. if (!(UM.browser.ie && UM.browser.version <= 9)) {
  246. $(".edui-image-dragTip", me.dialog).css( "display", "none" );
  247. }
  248. $(".edui-image-upload1", me.dialog).css( "display", "none" );
  249. $mask.addClass("edui-active").html(html);
  250. } else {
  251. $mask.removeClass("edui-active").html();
  252. if ( Upload.showCount > 0 ) {
  253. return me;
  254. }
  255. if (!(UM.browser.ie && UM.browser.version <= 9) ){
  256. $(".edui-image-dragTip", me.dialog).css("display", "block");
  257. }
  258. $(".edui-image-upload1", me.dialog).css( "display", "block" );
  259. }
  260. return me;
  261. }
  262. };
  263. /*
  264. * 网络图片
  265. * */
  266. var NetWork = {
  267. init: function (editor, $w) {
  268. var me = this;
  269. me.editor = editor;
  270. me.dialog = $w;
  271. me.initEvt();
  272. },
  273. initEvt: function () {
  274. var me = this,
  275. url,
  276. $ele = $(".edui-image-searchTxt", me.dialog);
  277. $(".edui-image-searchAdd", me.dialog).on("click", function () {
  278. url = Base.checkURL($ele.val());
  279. if (url) {
  280. $("<img src='" + url + "' class='edui-image-pic' />").on("load", function () {
  281. var $item = $("<div class='edui-image-item'><div class='edui-image-close'></div></div>").append(this);
  282. $(".edui-image-searchRes", me.dialog).append($item);
  283. Base.scale(this, 120);
  284. $item.width($(this).width());
  285. Base.close($(this));
  286. $ele.val("");
  287. });
  288. }
  289. })
  290. .hover(function () {
  291. $(this).toggleClass("hover");
  292. });
  293. }
  294. };
  295. /*
  296. * 选择图片
  297. * */
  298. var Select = {
  299. init: function (editor, $w) {
  300. var me = this;
  301. me.editor = editor;
  302. me.dialog = $w;
  303. me.initEvt();
  304. },
  305. initEvt: function () {
  306. var me = this;
  307. $(".edui-image-select", me.dialog).on("click", function () {
  308. parent.Fast.api.open("general/attachment/select?element_id=&multiple=true&mimetype=image/*", "选择", {
  309. callback: function (data) {
  310. var urlArr = data.url.split(/\,/);
  311. urlArr.forEach(function (item, index) {
  312. var url = Fast.api.cdnurl(item);
  313. $("<img src='" + url + "' class='edui-image-pic' />").on("load", function () {
  314. var $item = $("<div class='edui-image-item'><div class='edui-image-close'></div></div>").append(this);
  315. $(".edui-image-selectRes", me.dialog).append($item);
  316. Base.scale(this, 120);
  317. $item.width($(this).width());
  318. Base.close($(this));
  319. });
  320. });
  321. }
  322. });
  323. return false;
  324. });
  325. }
  326. };
  327. var $tab = null,
  328. currentDialog = null;
  329. UM.registerWidget('image', {
  330. tpl: "<link rel=\"stylesheet\" type=\"text/css\" href=\"<%=image_url%>image.css\">" +
  331. "<div class=\"edui-image-wrapper\">" +
  332. "<ul class=\"edui-tab-nav\">" +
  333. "<li class=\"edui-tab-item edui-active\"><a data-context=\".edui-image-local\" class=\"edui-tab-text\"><%=lang_tab_local%></a></li>" +
  334. "<li class=\"edui-tab-item\"><a data-context=\".edui-image-JimgSearch\" class=\"edui-tab-text\"><%=lang_tab_imgSearch%></a></li>" +
  335. "<li class=\"edui-tab-item\"><a data-context=\".edui-image-JimgSelect\" class=\"edui-tab-text\"><%=lang_tab_imgSelect%></a></li>" +
  336. "</ul>" +
  337. "<div class=\"edui-tab-content\">" +
  338. "<div class=\"edui-image-local edui-tab-pane edui-active\">" +
  339. "<div class=\"edui-image-content\"></div>" +
  340. "<div class=\"edui-image-mask\"></div>" +
  341. "<div class=\"edui-image-dragTip\"><%=lang_input_dragTip%></div>" +
  342. "</div>" +
  343. "<div class=\"edui-image-JimgSearch edui-tab-pane\">" +
  344. "<div class=\"edui-image-searchBar\">" +
  345. "<table><tr><td><input class=\"edui-image-searchTxt\" type=\"text\"></td>" +
  346. "<td><div class=\"edui-image-searchAdd\"><%=lang_btn_add%></div></td></tr></table>" +
  347. "</div>" +
  348. "<div class=\"edui-image-searchRes\"></div>" +
  349. "</div>" +
  350. "<div class=\"edui-image-JimgSelect edui-tab-pane\">" +
  351. "<div class=\"edui-image-selectBar\"><div class=\"edui-image-select\"><span class=\"edui-image-icon\"></span></div></div>" +
  352. "<div class=\"edui-image-selectRes\"></div>" +
  353. "<div class=\"edui-image-mask\"></div>" +
  354. "</div>" +
  355. "</div>" +
  356. "</div>",
  357. initContent: function (editor, $dialog) {
  358. var lang = editor.getLang('image')["static"],
  359. opt = $.extend({}, lang, {
  360. image_url: UMEDITOR_CONFIG.UMEDITOR_HOME_URL + 'dialogs/image/'
  361. });
  362. Upload.showCount = 0;
  363. if (lang) {
  364. var html = $.parseTmpl(this.tpl, opt);
  365. }
  366. currentDialog = $dialog.edui();
  367. this.root().html(html);
  368. },
  369. initEvent: function (editor, $w) {
  370. $tab = $.eduitab({selector: ".edui-image-wrapper"})
  371. .edui().on("beforeshow", function (e) {
  372. e.stopPropagation();
  373. });
  374. Upload.init(editor, $w);
  375. NetWork.init(editor, $w);
  376. Select.init(editor, $w);
  377. },
  378. buttons: {
  379. 'ok': {
  380. exec: function (editor, $w) {
  381. var sel = "",
  382. index = $tab.activate();
  383. if (index == 0) {
  384. sel = ".edui-image-content .edui-image-pic";
  385. } else if (index == 1) {
  386. sel = ".edui-image-searchRes .edui-image-pic";
  387. } else if (index == 2) {
  388. sel = ".edui-image-selectRes .edui-image-pic";
  389. }
  390. var list = Base.getAllPic(sel, $w, editor);
  391. if (index != -1) {
  392. editor.execCommand('insertimage', list);
  393. }
  394. }
  395. },
  396. 'cancel': {}
  397. },
  398. width: 700,
  399. height: 408
  400. }, function (editor, $w, url, state) {
  401. Base.callback(editor, $w, url, state)
  402. })
  403. })();