image.js 16 KB

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