123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315 |
- ///import core
- ///commands 修复chrome下图片不能点击的问题,出现八个角可改变大小
- ///commandsName FixImgClick
- ///commandsTitle 修复chrome下图片不能点击的问题,出现八个角可改变大小
- //修复chrome下图片不能点击的问题,出现八个角可改变大小
- UE.plugins['fiximgclick'] = (function () {
- var elementUpdated = false;
- function Scale() {
- this.editor = null;
- this.resizer = null;
- this.cover = null;
- this.doc = document;
- this.prePos = {x: 0, y: 0};
- this.startPos = {x: 0, y: 0};
- }
- (function () {
- var rect = [
- //[left, top, width, height]
- [0, 0, -1, -1],
- [0, 0, 0, -1],
- [0, 0, 1, -1],
- [0, 0, -1, 0],
- [0, 0, 1, 0],
- [0, 0, -1, 1],
- [0, 0, 0, 1],
- [0, 0, 1, 1]
- ];
- Scale.prototype = {
- init: function (editor) {
- var me = this;
- me.editor = editor;
- me.startPos = this.prePos = {x: 0, y: 0};
- me.dragId = -1;
- var hands = [],
- cover = me.cover = document.createElement('div'),
- resizer = me.resizer = document.createElement('div');
- cover.id = me.editor.ui.id + '_imagescale_cover';
- cover.style.cssText = 'position:absolute;display:none;z-index:' + (me.editor.options.zIndex) + ';filter:alpha(opacity=0); opacity:0;background:#CCC;';
- domUtils.on(cover, 'mousedown click', function () {
- me.hide();
- });
- for (i = 0; i < 8; i++) {
- hands.push('<span class="edui-editor-imagescale-hand' + i + '"></span>');
- }
- resizer.id = me.editor.ui.id + '_imagescale';
- resizer.className = 'edui-editor-imagescale';
- resizer.innerHTML = hands.join('');
- resizer.style.cssText += ';display:none;border:1px solid #3b77ff;z-index:' + (me.editor.options.zIndex) + ';';
- me.editor.ui.getDom().appendChild(cover);
- me.editor.ui.getDom().appendChild(resizer);
- me.initStyle();
- me.initEvents();
- },
- initStyle: function () {
- 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;}' +
- '.edui-editor-imagescale span{position:absolute;width:6px;height:6px;overflow:hidden;font-size:0px;display:block;background-color:#3C9DD0;}'
- + '.edui-editor-imagescale .edui-editor-imagescale-hand0{cursor:nw-resize;top:0;margin-top:-4px;left:0;margin-left:-4px;}'
- + '.edui-editor-imagescale .edui-editor-imagescale-hand1{cursor:n-resize;top:0;margin-top:-4px;left:50%;margin-left:-4px;}'
- + '.edui-editor-imagescale .edui-editor-imagescale-hand2{cursor:ne-resize;top:0;margin-top:-4px;left:100%;margin-left:-3px;}'
- + '.edui-editor-imagescale .edui-editor-imagescale-hand3{cursor:w-resize;top:50%;margin-top:-4px;left:0;margin-left:-4px;}'
- + '.edui-editor-imagescale .edui-editor-imagescale-hand4{cursor:e-resize;top:50%;margin-top:-4px;left:100%;margin-left:-3px;}'
- + '.edui-editor-imagescale .edui-editor-imagescale-hand5{cursor:sw-resize;top:100%;margin-top:-3px;left:0;margin-left:-4px;}'
- + '.edui-editor-imagescale .edui-editor-imagescale-hand6{cursor:s-resize;top:100%;margin-top:-3px;left:50%;margin-left:-4px;}'
- + '.edui-editor-imagescale .edui-editor-imagescale-hand7{cursor:se-resize;top:100%;margin-top:-3px;left:100%;margin-left:-3px;}');
- },
- initEvents: function () {
- var me = this;
- me.startPos.x = me.startPos.y = 0;
- me.isDraging = false;
- },
- _eventHandler: function (e) {
- var me = this;
- switch (e.type) {
- case 'mousedown':
- var hand = e.target || e.srcElement, hand;
- if (hand.className.indexOf('edui-editor-imagescale-hand') != -1 && me.dragId == -1) {
- me.dragId = hand.className.slice(-1);
- me.startPos.x = me.prePos.x = e.clientX;
- me.startPos.y = me.prePos.y = e.clientY;
- domUtils.on(me.doc,'mousemove', me.proxy(me._eventHandler, me));
- }
- break;
- case 'mousemove':
- if (me.dragId != -1) {
- me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y});
- me.prePos.x = e.clientX;
- me.prePos.y = e.clientY;
- elementUpdated = true;
- me.updateTargetElement();
- }
- break;
- case 'mouseup':
- if (me.dragId != -1) {
- me.updateContainerStyle(me.dragId, {x: e.clientX - me.prePos.x, y: e.clientY - me.prePos.y});
- me.updateTargetElement();
- if (me.target.parentNode) me.attachTo(me.target);
- me.dragId = -1;
- }
- domUtils.un(me.doc,'mousemove', me.proxy(me._eventHandler, me));
- //修复只是点击挪动点,但没有改变大小,不应该触发contentchange
- if(elementUpdated){
- elementUpdated = false;
- me.editor.fireEvent('contentchange');
- }
- break;
- default:
- break;
- }
- },
- updateTargetElement: function () {
- var me = this;
- domUtils.setStyles(me.target, {
- 'width': me.resizer.style.width,
- 'height': me.resizer.style.height
- });
- me.target.width = parseInt(me.resizer.style.width);
- me.target.height = parseInt(me.resizer.style.height);
- me.attachTo(me.target);
- },
- updateContainerStyle: function (dir, offset) {
- var me = this,
- dom = me.resizer, tmp;
- if (rect[dir][0] != 0) {
- tmp = parseInt(dom.style.left) + offset.x;
- dom.style.left = me._validScaledProp('left', tmp) + 'px';
- }
- if (rect[dir][1] != 0) {
- tmp = parseInt(dom.style.top) + offset.y;
- dom.style.top = me._validScaledProp('top', tmp) + 'px';
- }
- if (rect[dir][2] != 0) {
- tmp = dom.clientWidth + rect[dir][2] * offset.x;
- dom.style.width = me._validScaledProp('width', tmp) + 'px';
- }
- if (rect[dir][3] != 0) {
- tmp = dom.clientHeight + rect[dir][3] * offset.y;
- dom.style.height = me._validScaledProp('height', tmp) + 'px';
- }
- },
- _validScaledProp: function (prop, value) {
- var ele = this.resizer,
- wrap = document;
- value = isNaN(value) ? 0 : value;
- switch (prop) {
- case 'left':
- return value < 0 ? 0 : (value + ele.clientWidth) > wrap.clientWidth ? wrap.clientWidth - ele.clientWidth : value;
- case 'top':
- return value < 0 ? 0 : (value + ele.clientHeight) > wrap.clientHeight ? wrap.clientHeight - ele.clientHeight : value;
- case 'width':
- return value <= 0 ? 1 : (value + ele.offsetLeft) > wrap.clientWidth ? wrap.clientWidth - ele.offsetLeft : value;
- case 'height':
- return value <= 0 ? 1 : (value + ele.offsetTop) > wrap.clientHeight ? wrap.clientHeight - ele.offsetTop : value;
- }
- },
- hideCover: function () {
- this.cover.style.display = 'none';
- },
- showCover: function () {
- var me = this,
- editorPos = domUtils.getXY(me.editor.ui.getDom()),
- iframePos = domUtils.getXY(me.editor.iframe);
- domUtils.setStyles(me.cover, {
- 'width': me.editor.iframe.offsetWidth + 'px',
- 'height': me.editor.iframe.offsetHeight + 'px',
- 'top': iframePos.y - editorPos.y + 'px',
- 'left': iframePos.x - editorPos.x + 'px',
- 'position': 'absolute',
- 'display': ''
- })
- },
- show: function (targetObj) {
- var me = this;
- me.resizer.style.display = 'block';
- if(targetObj) me.attachTo(targetObj);
- domUtils.on(this.resizer, 'mousedown', me.proxy(me._eventHandler, me));
- domUtils.on(me.doc, 'mouseup', me.proxy(me._eventHandler, me));
- me.showCover();
- me.editor.fireEvent('afterscaleshow', me);
- me.editor.fireEvent('saveScene');
- },
- hide: function () {
- var me = this;
- me.hideCover();
- me.resizer.style.display = 'none';
- domUtils.un(me.resizer, 'mousedown', me.proxy(me._eventHandler, me));
- domUtils.un(me.doc, 'mouseup', me.proxy(me._eventHandler, me));
- me.editor.fireEvent('afterscalehide', me);
- },
- proxy: function( fn, context ) {
- return function(e) {
- return fn.apply( context || this, arguments);
- };
- },
- attachTo: function (targetObj) {
- var me = this,
- target = me.target = targetObj,
- resizer = this.resizer,
- imgPos = domUtils.getXY(target),
- iframePos = domUtils.getXY(me.editor.iframe),
- editorPos = domUtils.getXY(resizer.parentNode);
- domUtils.setStyles(resizer, {
- 'width': target.width + 'px',
- 'height': target.height + 'px',
- 'left': iframePos.x + imgPos.x - me.editor.document.body.scrollLeft - editorPos.x - parseInt(resizer.style.borderLeftWidth) + 'px',
- 'top': iframePos.y + imgPos.y - me.editor.document.body.scrollTop - editorPos.y - parseInt(resizer.style.borderTopWidth) + 'px'
- });
- }
- }
- })();
- return function () {
- var me = this,
- imageScale;
- me.setOpt('imageScaleEnabled', true);
- if ( !browser.ie && me.options.imageScaleEnabled) {
- me.addListener('click', function (type, e) {
- var range = me.selection.getRange(),
- img = range.getClosedNode();
- if (img && img.tagName == 'IMG' && me.body.contentEditable!="false") {
- if (img.className.indexOf("edui-faked-music") != -1 ||
- img.getAttribute("anchorname") ||
- domUtils.hasClass(img, 'loadingclass') ||
- domUtils.hasClass(img, 'loaderrorclass')) { return }
- if (!imageScale) {
- imageScale = new Scale();
- imageScale.init(me);
- me.ui.getDom().appendChild(imageScale.resizer);
- var _keyDownHandler = function (e) {
- imageScale.hide();
- if(imageScale.target) me.selection.getRange().selectNode(imageScale.target).select();
- }, _mouseDownHandler = function (e) {
- var ele = e.target || e.srcElement;
- if (ele && (ele.className===undefined || ele.className.indexOf('edui-editor-imagescale') == -1)) {
- _keyDownHandler(e);
- }
- }, timer;
- me.addListener('afterscaleshow', function (e) {
- me.addListener('beforekeydown', _keyDownHandler);
- me.addListener('beforemousedown', _mouseDownHandler);
- domUtils.on(document, 'keydown', _keyDownHandler);
- domUtils.on(document,'mousedown', _mouseDownHandler);
- me.selection.getNative().removeAllRanges();
- });
- me.addListener('afterscalehide', function (e) {
- me.removeListener('beforekeydown', _keyDownHandler);
- me.removeListener('beforemousedown', _mouseDownHandler);
- domUtils.un(document, 'keydown', _keyDownHandler);
- domUtils.un(document,'mousedown', _mouseDownHandler);
- var target = imageScale.target;
- if (target.parentNode) {
- me.selection.getRange().selectNode(target).select();
- }
- });
- //TODO 有iframe的情况,mousedown不能往下传。。
- domUtils.on(imageScale.resizer, 'mousedown', function (e) {
- me.selection.getNative().removeAllRanges();
- var ele = e.target || e.srcElement;
- if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) {
- timer = setTimeout(function () {
- imageScale.hide();
- if(imageScale.target) me.selection.getRange().selectNode(ele).select();
- }, 200);
- }
- });
- domUtils.on(imageScale.resizer, 'mouseup', function (e) {
- var ele = e.target || e.srcElement;
- if (ele && ele.className.indexOf('edui-editor-imagescale-hand') == -1) {
- clearTimeout(timer);
- }
- });
- }
- imageScale.show(img);
- } else {
- if (imageScale && imageScale.resizer.style.display != 'none') imageScale.hide();
- }
- });
- }
- if (browser.webkit) {
- me.addListener('click', function (type, e) {
- if (e.target.tagName == 'IMG' && me.body.contentEditable!="false") {
- var range = new dom.Range(me.document);
- range.selectNode(e.target).select();
- }
- });
- }
- }
- })();
|