fiximgclick.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315
  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 = 'position:absolute;display:none;z-index:' + (me.editor.options.zIndex) + ';filter:alpha(opacity=0); opacity:0;background:#CCC;';
  39. domUtils.on(cover, 'mousedown click', function () {
  40. me.hide();
  41. });
  42. for (i = 0; i < 8; i++) {
  43. hands.push('<span class="edui-editor-imagescale-hand' + i + '"></span>');
  44. }
  45. resizer.id = me.editor.ui.id + '_imagescale';
  46. resizer.className = 'edui-editor-imagescale';
  47. resizer.innerHTML = hands.join('');
  48. resizer.style.cssText += ';display:none;border:1px solid #3b77ff;z-index:' + (me.editor.options.zIndex) + ';';
  49. me.editor.ui.getDom().appendChild(cover);
  50. me.editor.ui.getDom().appendChild(resizer);
  51. me.initStyle();
  52. me.initEvents();
  53. },
  54. initStyle: function () {
  55. utils.cssRule('imagescale', '.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;}' +
  56. '.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}'
  57. + '.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}'
  58. + '.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}'
  59. + '.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}'
  60. + '.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}'
  61. + '.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}'
  62. + '.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}'
  63. + '.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}'
  64. + '.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}');
  65. },
  66. initEvents: function () {
  67. var me = this;
  68. me.startPos.x = me.startPos.y = 0;
  69. me.isDraging = false;
  70. },
  71. _eventHandler: function (e) {
  72. var me = this;
  73. switch (e.type) {
  74. case 'mousedown':
  75. var hand = e.target || e.srcElement, hand;
  76. if (hand.className.indexOf('edui-editor-imagescale-hand') != -1 && me.dragId == -1) {
  77. me.dragId = hand.className.slice(-1);
  78. me.startPos.x = me.prePos.x = e.clientX;
  79. me.startPos.y = me.prePos.y = e.clientY;
  80. domUtils.on(me.doc,'mousemove', me.proxy(me._eventHandler, me));
  81. }
  82. break;
  83. case 'mousemove':
  84. if (me.dragId != -1) {
  85. me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y});
  86. me.prePos.x = e.clientX;
  87. me.prePos.y = e.clientY;
  88. elementUpdated = true;
  89. me.updateTargetElement();
  90. }
  91. break;
  92. case 'mouseup':
  93. if (me.dragId != -1) {
  94. me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y});
  95. me.updateTargetElement();
  96. if (me.target.parentNode) me.attachTo(me.target);
  97. me.dragId = -1;
  98. }
  99. domUtils.un(me.doc,'mousemove', me.proxy(me._eventHandler, me));
  100. //修复只是点击挪动点,但没有改变大小,不应该触发contentchange
  101. if(elementUpdated){
  102. elementUpdated = false;
  103. me.editor.fireEvent('contentchange');
  104. }
  105. break;
  106. default:
  107. break;
  108. }
  109. },
  110. updateTargetElement: function () {
  111. var me = this;
  112. domUtils.setStyles(me.target, {
  113. 'width': me.resizer.style.width,
  114. 'height': me.resizer.style.height
  115. });
  116. me.target.width = parseInt(me.resizer.style.width);
  117. me.target.height = parseInt(me.resizer.style.height);
  118. me.attachTo(me.target);
  119. },
  120. updateContainerStyle: function (dir, offset) {
  121. var me = this,
  122. dom = me.resizer, tmp;
  123. if (rect[dir][0] != 0) {
  124. tmp = parseInt(dom.style.left) + offset.x;
  125. dom.style.left = me._validScaledProp('left', tmp) + 'px';
  126. }
  127. if (rect[dir][1] != 0) {
  128. tmp = parseInt(dom.style.top) + offset.y;
  129. dom.style.top = me._validScaledProp('top', tmp) + 'px';
  130. }
  131. if (rect[dir][2] != 0) {
  132. tmp = dom.clientWidth + rect[dir][2] * offset.x;
  133. dom.style.width = me._validScaledProp('width', tmp) + 'px';
  134. }
  135. if (rect[dir][3] != 0) {
  136. tmp = dom.clientHeight + rect[dir][3] * offset.y;
  137. dom.style.height = me._validScaledProp('height', tmp) + 'px';
  138. }
  139. },
  140. _validScaledProp: function (prop, value) {
  141. var ele = this.resizer,
  142. wrap = document;
  143. value = isNaN(value) ? 0 : value;
  144. switch (prop) {
  145. case 'left':
  146. return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value;
  147. case 'top':
  148. return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value;
  149. case 'width':
  150. return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value;
  151. case 'height':
  152. return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value;
  153. }
  154. },
  155. hideCover: function () {
  156. this.cover.style.display = 'none';
  157. },
  158. showCover: function () {
  159. var me = this,
  160. editorPos = domUtils.getXY(me.editor.ui.getDom()),
  161. iframePos = domUtils.getXY(me.editor.iframe);
  162. domUtils.setStyles(me.cover, {
  163. 'width': me.editor.iframe.offsetWidth + 'px',
  164. 'height': me.editor.iframe.offsetHeight + 'px',
  165. 'top': iframePos.y - editorPos.y + 'px',
  166. 'left': iframePos.x - editorPos.x + 'px',
  167. 'position': 'absolute',
  168. 'display': ''
  169. })
  170. },
  171. show: function (targetObj) {
  172. var me = this;
  173. me.resizer.style.display = 'block';
  174. if(targetObj) me.attachTo(targetObj);
  175. domUtils.on(this.resizer, 'mousedown', me.proxy(me._eventHandler, me));
  176. domUtils.on(me.doc, 'mouseup', me.proxy(me._eventHandler, me));
  177. me.showCover();
  178. me.editor.fireEvent('afterscaleshow', me);
  179. me.editor.fireEvent('saveScene');
  180. },
  181. hide: function () {
  182. var me = this;
  183. me.hideCover();
  184. me.resizer.style.display = 'none';
  185. domUtils.un(me.resizer, 'mousedown', me.proxy(me._eventHandler, me));
  186. domUtils.un(me.doc, 'mouseup', me.proxy(me._eventHandler, me));
  187. me.editor.fireEvent('afterscalehide', me);
  188. },
  189. proxy: function( fn, context ) {
  190. return function(e) {
  191. return fn.apply( context || this, arguments);
  192. };
  193. },
  194. attachTo: function (targetObj) {
  195. var me = this,
  196. target = me.target = targetObj,
  197. resizer = this.resizer,
  198. imgPos = domUtils.getXY(target),
  199. iframePos = domUtils.getXY(me.editor.iframe),
  200. editorPos = domUtils.getXY(resizer.parentNode);
  201. domUtils.setStyles(resizer, {
  202. 'width': target.width + 'px',
  203. 'height': target.height + 'px',
  204. 'left': iframePos.x + imgPos.x - me.editor.document.body.scrollLeft - editorPos.x - parseInt(resizer.style.borderLeftWidth) + 'px',
  205. 'top': iframePos.y + imgPos.y - me.editor.document.body.scrollTop - editorPos.y - parseInt(resizer.style.borderTopWidth) + 'px'
  206. });
  207. }
  208. }
  209. })();
  210. return function () {
  211. var me = this,
  212. imageScale;
  213. me.setOpt('imageScaleEnabled', true);
  214. if ( !browser.ie && me.options.imageScaleEnabled) {
  215. me.addListener('click', function (type, e) {
  216. var range = me.selection.getRange(),
  217. img = range.getClosedNode();
  218. if (img && img.tagName == 'IMG' && me.body.contentEditable!="false") {
  219. if (img.className.indexOf("edui-faked-music") != -1 ||
  220. img.getAttribute("anchorname") ||
  221. domUtils.hasClass(img, 'loadingclass') ||
  222. domUtils.hasClass(img, 'loaderrorclass')) { return }
  223. if (!imageScale) {
  224. imageScale = new Scale();
  225. imageScale.init(me);
  226. me.ui.getDom().appendChild(imageScale.resizer);
  227. var _keyDownHandler = function (e) {
  228. imageScale.hide();
  229. if(imageScale.target) me.selection.getRange().selectNode(imageScale.target).select();
  230. }, _mouseDownHandler = function (e) {
  231. var ele = e.target || e.srcElement;
  232. if (ele && (ele.className===undefined || ele.className.indexOf('edui-editor-imagescale') == -1)) {
  233. _keyDownHandler(e);
  234. }
  235. }, timer;
  236. me.addListener('afterscaleshow', function (e) {
  237. me.addListener('beforekeydown', _keyDownHandler);
  238. me.addListener('beforemousedown', _mouseDownHandler);
  239. domUtils.on(document, 'keydown', _keyDownHandler);
  240. domUtils.on(document,'mousedown', _mouseDownHandler);
  241. me.selection.getNative().removeAllRanges();
  242. });
  243. me.addListener('afterscalehide', function (e) {
  244. me.removeListener('beforekeydown', _keyDownHandler);
  245. me.removeListener('beforemousedown', _mouseDownHandler);
  246. domUtils.un(document, 'keydown', _keyDownHandler);
  247. domUtils.un(document,'mousedown', _mouseDownHandler);
  248. var target = imageScale.target;
  249. if (target.parentNode) {
  250. me.selection.getRange().selectNode(target).select();
  251. }
  252. });
  253. //TODO 有iframe的情况,mousedown不能往下传。。
  254. domUtils.on(imageScale.resizer, 'mousedown', function (e) {
  255. me.selection.getNative().removeAllRanges();
  256. var ele = e.target || e.srcElement;
  257. if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) {
  258. timer = setTimeout(function () {
  259. imageScale.hide();
  260. if(imageScale.target) me.selection.getRange().selectNode(ele).select();
  261. }, 200);
  262. }
  263. });
  264. domUtils.on(imageScale.resizer, 'mouseup', function (e) {
  265. var ele = e.target || e.srcElement;
  266. if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) {
  267. clearTimeout(timer);
  268. }
  269. });
  270. }
  271. imageScale.show(img);
  272. } else {
  273. if (imageScale && imageScale.resizer.style.display != 'none') imageScale.hide();
  274. }
  275. });
  276. }
  277. if (browser.webkit) {
  278. me.addListener('click', function (type, e) {
  279. if (e.target.tagName == 'IMG' && me.body.contentEditable!="false") {
  280. var range = new dom.Range(me.document);
  281. range.selectNode(e.target).select();
  282. }
  283. });
  284. }
  285. }
  286. })();