fiximgclick.js 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. ///import core
  2. ///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小
  3. ///commandsName FixImgClick
  4. ///commandsTitle 修复chrome下图片不能点击的问题,出现八个角可改变大小
  5. //修复chrome下图片不能点击的问题,出现八个角可改变大小
  6. UE.plugins["fiximgclick"] = (function() {
  7. var elementUpdated = false;
  8. function Scale() {
  9. this.editor = null;
  10. this.resizer = null;
  11. this.cover = null;
  12. this.doc = document;
  13. this.prePos = { x: 0, y: 0 };
  14. this.startPos = { x: 0, y: 0 };
  15. }
  16. (function() {
  17. var rect = [
  18. //[left, top, width, height]
  19. [0, 0, -1, -1],
  20. [0, 0, 0, -1],
  21. [0, 0, 1, -1],
  22. [0, 0, -1, 0],
  23. [0, 0, 1, 0],
  24. [0, 0, -1, 1],
  25. [0, 0, 0, 1],
  26. [0, 0, 1, 1]
  27. ];
  28. Scale.prototype = {
  29. init: function(editor) {
  30. var me = this;
  31. me.editor = editor;
  32. me.startPos = this.prePos = { x: 0, y: 0 };
  33. me.dragId = -1;
  34. var hands = [],
  35. cover = (me.cover = document.createElement("div")),
  36. resizer = (me.resizer = document.createElement("div"));
  37. cover.id = me.editor.ui.id + "_imagescale_cover";
  38. cover.style.cssText =
  39. "position:absolute;display:none;z-index:" +
  40. me.editor.options.zIndex +
  41. ";filter:alpha(opacity=0); opacity:0;background:#CCC;";
  42. domUtils.on(cover, "mousedown click", function() {
  43. me.hide();
  44. });
  45. for (i = 0; i < 8; i++) {
  46. hands.push(
  47. '<span class="edui-editor-imagescale-hand' + i + '"></span>'
  48. );
  49. }
  50. resizer.id = me.editor.ui.id + "_imagescale";
  51. resizer.className = "edui-editor-imagescale";
  52. resizer.innerHTML = hands.join("");
  53. resizer.style.cssText +=
  54. ";display:none;border:1px solid #3b77ff;z-index:" +
  55. me.editor.options.zIndex +
  56. ";";
  57. me.editor.ui.getDom().appendChild(cover);
  58. me.editor.ui.getDom().appendChild(resizer);
  59. me.initStyle();
  60. me.initEvents();
  61. },
  62. initStyle: function() {
  63. utils.cssRule(
  64. "imagescale",
  65. ".edui-editor-imagescale{display:none;position:absolute;border:1px solid #38B2CE;cursor:hand;-webkit-box-sizing: content-box;-moz-box-sizing: content-box;box-sizing: content-box;}" +
  66. ".edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}" +
  67. ".edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}" +
  68. ".edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}" +
  69. ".edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}" +
  70. ".edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}" +
  71. ".edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}" +
  72. ".edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}" +
  73. ".edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}" +
  74. ".edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}"
  75. );
  76. },
  77. initEvents: function() {
  78. var me = this;
  79. me.startPos.x = me.startPos.y = 0;
  80. me.isDraging = false;
  81. },
  82. _eventHandler: function(e) {
  83. var me = this;
  84. switch (e.type) {
  85. case "mousedown":
  86. var hand = e.target || e.srcElement,
  87. hand;
  88. if (
  89. hand.className.indexOf("edui-editor-imagescale-hand") != -1 &&
  90. me.dragId == -1
  91. ) {
  92. me.dragId = hand.className.slice(-1);
  93. me.startPos.x = me.prePos.x = e.clientX;
  94. me.startPos.y = me.prePos.y = e.clientY;
  95. domUtils.on(me.doc, "mousemove", me.proxy(me._eventHandler, me));
  96. }
  97. break;
  98. case "mousemove":
  99. if (me.dragId != -1) {
  100. me.updateContainerStyle(me.dragId, {
  101. x: e.clientX - me.prePos.x,
  102. y: e.clientY - me.prePos.y
  103. });
  104. me.prePos.x = e.clientX;
  105. me.prePos.y = e.clientY;
  106. elementUpdated = true;
  107. me.updateTargetElement();
  108. }
  109. break;
  110. case "mouseup":
  111. if (me.dragId != -1) {
  112. me.updateContainerStyle(me.dragId, {
  113. x: e.clientX - me.prePos.x,
  114. y: e.clientY - me.prePos.y
  115. });
  116. me.updateTargetElement();
  117. if (me.target.parentNode) me.attachTo(me.target);
  118. me.dragId = -1;
  119. }
  120. domUtils.un(me.doc, "mousemove", me.proxy(me._eventHandler, me));
  121. //修复只是点击挪动点,但没有改变大小,不应该触发contentchange
  122. if (elementUpdated) {
  123. elementUpdated = false;
  124. me.editor.fireEvent("contentchange");
  125. }
  126. break;
  127. default:
  128. break;
  129. }
  130. },
  131. updateTargetElement: function() {
  132. var me = this;
  133. domUtils.setStyles(me.target, {
  134. width: me.resizer.style.width,
  135. height: me.resizer.style.height
  136. });
  137. me.target.width = parseInt(me.resizer.style.width);
  138. me.target.height = parseInt(me.resizer.style.height);
  139. me.attachTo(me.target);
  140. },
  141. updateContainerStyle: function(dir, offset) {
  142. var me = this,
  143. dom = me.resizer,
  144. tmp;
  145. if (rect[dir][0] != 0) {
  146. tmp = parseInt(dom.style.left) + offset.x;
  147. dom.style.left = me._validScaledProp("left", tmp) + "px";
  148. }
  149. if (rect[dir][1] != 0) {
  150. tmp = parseInt(dom.style.top) + offset.y;
  151. dom.style.top = me._validScaledProp("top", tmp) + "px";
  152. }
  153. if (rect[dir][2] != 0) {
  154. tmp = dom.clientWidth + rect[dir][2] * offset.x;
  155. dom.style.width = me._validScaledProp("width", tmp) + "px";
  156. }
  157. if (rect[dir][3] != 0) {
  158. tmp = dom.clientHeight + rect[dir][3] * offset.y;
  159. dom.style.height = me._validScaledProp("height", tmp) + "px";
  160. }
  161. },
  162. _validScaledProp: function(prop, value) {
  163. var ele = this.resizer,
  164. wrap = document;
  165. value = isNaN(value) ? 0 : value;
  166. switch (prop) {
  167. case "left":
  168. return value < 0
  169. ? 0
  170. : value + ele.clientWidth > wrap.clientWidth
  171. ? wrap.clientWidth - ele.clientWidth
  172. : value;
  173. case "top":
  174. return value < 0
  175. ? 0
  176. : value + ele.clientHeight > wrap.clientHeight
  177. ? wrap.clientHeight - ele.clientHeight
  178. : value;
  179. case "width":
  180. return value <= 0
  181. ? 1
  182. : value + ele.offsetLeft > wrap.clientWidth
  183. ? wrap.clientWidth - ele.offsetLeft
  184. : value;
  185. case "height":
  186. return value <= 0
  187. ? 1
  188. : value + ele.offsetTop > wrap.clientHeight
  189. ? wrap.clientHeight - ele.offsetTop
  190. : value;
  191. }
  192. },
  193. hideCover: function() {
  194. this.cover.style.display = "none";
  195. },
  196. showCover: function() {
  197. var me = this,
  198. editorPos = domUtils.getXY(me.editor.ui.getDom()),
  199. iframePos = domUtils.getXY(me.editor.iframe);
  200. domUtils.setStyles(me.cover, {
  201. width: me.editor.iframe.offsetWidth + "px",
  202. height: me.editor.iframe.offsetHeight + "px",
  203. top: iframePos.y - editorPos.y + "px",
  204. left: iframePos.x - editorPos.x + "px",
  205. position: "absolute",
  206. display: ""
  207. });
  208. },
  209. show: function(targetObj) {
  210. var me = this;
  211. me.resizer.style.display = "block";
  212. if (targetObj) me.attachTo(targetObj);
  213. domUtils.on(this.resizer, "mousedown", me.proxy(me._eventHandler, me));
  214. domUtils.on(me.doc, "mouseup", me.proxy(me._eventHandler, me));
  215. me.showCover();
  216. me.editor.fireEvent("afterscaleshow", me);
  217. me.editor.fireEvent("saveScene");
  218. },
  219. hide: function() {
  220. var me = this;
  221. me.hideCover();
  222. me.resizer.style.display = "none";
  223. domUtils.un(me.resizer, "mousedown", me.proxy(me._eventHandler, me));
  224. domUtils.un(me.doc, "mouseup", me.proxy(me._eventHandler, me));
  225. me.editor.fireEvent("afterscalehide", me);
  226. },
  227. proxy: function(fn, context) {
  228. return function(e) {
  229. return fn.apply(context || this, arguments);
  230. };
  231. },
  232. attachTo: function(targetObj) {
  233. var me = this,
  234. target = (me.target = targetObj),
  235. resizer = this.resizer,
  236. imgPos = domUtils.getXY(target),
  237. iframePos = domUtils.getXY(me.editor.iframe),
  238. editorPos = domUtils.getXY(resizer.parentNode);
  239. domUtils.setStyles(resizer, {
  240. width: target.width + "px",
  241. height: target.height + "px",
  242. left:
  243. iframePos.x +
  244. imgPos.x -
  245. me.editor.document.body.scrollLeft -
  246. editorPos.x -
  247. parseInt(resizer.style.borderLeftWidth) +
  248. "px",
  249. top:
  250. iframePos.y +
  251. imgPos.y -
  252. me.editor.document.body.scrollTop -
  253. editorPos.y -
  254. parseInt(resizer.style.borderTopWidth) +
  255. "px"
  256. });
  257. }
  258. };
  259. })();
  260. return function() {
  261. var me = this,
  262. imageScale;
  263. me.setOpt("imageScaleEnabled", true);
  264. if (!browser.ie && me.options.imageScaleEnabled) {
  265. me.addListener("click", function(type, e) {
  266. var range = me.selection.getRange(),
  267. img = range.getClosedNode();
  268. if (img && img.tagName == "IMG" && me.body.contentEditable != "false") {
  269. if (
  270. img.className.indexOf("edui-faked-music") != -1 ||
  271. img.getAttribute("anchorname") ||
  272. domUtils.hasClass(img, "loadingclass") ||
  273. domUtils.hasClass(img, "loaderrorclass")
  274. ) {
  275. return;
  276. }
  277. if (!imageScale) {
  278. imageScale = new Scale();
  279. imageScale.init(me);
  280. me.ui.getDom().appendChild(imageScale.resizer);
  281. var _keyDownHandler = function(e) {
  282. imageScale.hide();
  283. if (imageScale.target)
  284. me.selection.getRange().selectNode(imageScale.target).select();
  285. },
  286. _mouseDownHandler = function(e) {
  287. var ele = e.target || e.srcElement;
  288. if (
  289. ele &&
  290. (ele.className === undefined ||
  291. ele.className.indexOf("edui-editor-imagescale") == -1)
  292. ) {
  293. _keyDownHandler(e);
  294. }
  295. },
  296. timer;
  297. me.addListener("afterscaleshow", function(e) {
  298. me.addListener("beforekeydown", _keyDownHandler);
  299. me.addListener("beforemousedown", _mouseDownHandler);
  300. domUtils.on(document, "keydown", _keyDownHandler);
  301. domUtils.on(document, "mousedown", _mouseDownHandler);
  302. me.selection.getNative().removeAllRanges();
  303. });
  304. me.addListener("afterscalehide", function(e) {
  305. me.removeListener("beforekeydown", _keyDownHandler);
  306. me.removeListener("beforemousedown", _mouseDownHandler);
  307. domUtils.un(document, "keydown", _keyDownHandler);
  308. domUtils.un(document, "mousedown", _mouseDownHandler);
  309. var target = imageScale.target;
  310. if (target.parentNode) {
  311. me.selection.getRange().selectNode(target).select();
  312. }
  313. });
  314. //TODO 有iframe的情况,mousedown不能往下传。。
  315. domUtils.on(imageScale.resizer, "mousedown", function(e) {
  316. me.selection.getNative().removeAllRanges();
  317. var ele = e.target || e.srcElement;
  318. if (
  319. ele &&
  320. ele.className.indexOf("edui-editor-imagescale-hand") == -1
  321. ) {
  322. timer = setTimeout(function() {
  323. imageScale.hide();
  324. if (imageScale.target)
  325. me.selection.getRange().selectNode(ele).select();
  326. }, 200);
  327. }
  328. });
  329. domUtils.on(imageScale.resizer, "mouseup", function(e) {
  330. var ele = e.target || e.srcElement;
  331. if (
  332. ele &&
  333. ele.className.indexOf("edui-editor-imagescale-hand") == -1
  334. ) {
  335. clearTimeout(timer);
  336. }
  337. });
  338. }
  339. imageScale.show(img);
  340. } else {
  341. if (imageScale && imageScale.resizer.style.display != "none")
  342. imageScale.hide();
  343. }
  344. });
  345. }
  346. if (browser.webkit) {
  347. me.addListener("click", function(type, e) {
  348. if (e.target.tagName == "IMG" && me.body.contentEditable != "false") {
  349. var range = new dom.Range(me.document);
  350. range.selectNode(e.target).select();
  351. }
  352. });
  353. }
  354. };
  355. })();