123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380 |
- ///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();
- }
- });
- }
- };
- })();
|