-
Notifications
You must be signed in to change notification settings - Fork 70
/
Copy pathEleditor.min.js
11 lines (11 loc) · 18.8 KB
/
Eleditor.min.js
1
2
3
4
5
6
7
8
9
10
11
/**
* Version: 1.8.9
* Title: Eleditor 移动端富文本编辑器
* Site: https://eleditor.fixel.cn
* Doc: http://doc.eleditor.fixel.cn
* Author: Try
*/
(function(l){if(typeof Object.assign!="function"){Object.defineProperty(Object,"assign",{value:function p(t,v){if(t==null){throw new TypeError("Cannot convert undefined or null to object")}var u=Object(t);for(var s=1;s<arguments.length;s++){var r=arguments[s];if(r!=null){for(var q in r){if(Object.prototype.hasOwnProperty.call(r,q)){u[q]=r[q]}}}}return u},writable:true,configurable:true})}var c=false;var i="1.8.9";var d="Eleditor";var a=["INPUT","IMG","TEXTAREA"];var h={insertText:"插文字",insertImage:"插图片",insertLink:"插链接",insertHr:"水平线",editText:"改文字","delete":"删除",undo:"撤销",cancel:"取消",};var j="";l[d]=function(){};if(typeof jQuery==="undefined"&&typeof Zepto==="undefined"){return console.warn("|--Eleditor 请引入jQuery或者Zepto!模块化环境请把依赖全局安装")}else{if(typeof g==="undefined"){var g=typeof jQuery!="undefined"?jQuery:Zepto}}var f=function(r){var q=document.scripts;q=q[q.length-1].src.substring(0,q[q.length-1].src.lastIndexOf("/")+1);r(q);return q}(function(q){var r='<link rel="stylesheet" href="'+q+"layout/base.css?v="+(c?(+new Date()):i)+'">';g("head").append(r)});var m=function(t,q){for(var r in q){if(q[r]==t){return true}}return false};var o=function(q){var r=q.replace(/\ +/g,"");r=r.replace(/[ ]/g,"");r=r.replace(/[\r\n]/g,"");return r.replace(/(^\s*)|(\s*$)/g,"")};var b=function(){var q=Math.max.apply(null,g.map(g("body *"),function(s){var r=g(s);if(r.css("position")!="static"){return parseInt(r.css("z-index"))||1}}));return(q+"").indexOf("Infinity")>=0?1:q+1};var k=function(){return d+""+ +new Date};var e=function(){var r=arguments[0],q=arguments[1];g.each(r.find("iframe,audio,video"),function(){var t=g(this),s=this.tagName.toLocaleLowerCase();if(!t.parent().hasClass("Eleditor-"+s+"-area")){g(this).wrap('<div class="Eleditor-'+s+'-area"></div>')}});if(o(r.text())==""&&r.find("img,iframe,video").length===0){r.append(q)}if(r.find("*").length===0){r.html('<p class="Eleditor-placeholder">'+r.html()+"</p>")}};var n=function(y,v){var u=b();var r='<div class="Eleditor-wrap" style="z-index:'+u+'" id="'+v+'"> <div class="Eleditor-controller"> <ul>';for(var t=0;t<y.length;t++){var q=y[t],w=typeof q==="object"?q.id:q,s=(typeof q==="object"&&q.tag)?q.tag.toLocaleLowerCase():null,x=typeof q==="object"?q.name:h[q];r+='<li event="'+w+'" '+(s?'bind-tags="'+s+'"':"")+' class="Eleditor-'+w+'">'+x+"</li>"}r+=' </ul> </div> <div class="Eleditor-loading"><p></p></div> <div class="Eleditor-textEditor"> <div class="Eleditor-textStyle"> <div class="Eleditor-textStyle-item"><div class="Eleditor-textStyle-bold"></div></div> <div class="Eleditor-textStyle-item"><div class="Eleditor-textStyle-color"><span></span></div></div> <div class="Eleditor-textStyle-item"><div class="Eleditor-textStyle-linedecoration"></div></div> <div class="Eleditor-textStyle-item"><div class="Eleditor-textStyle-bgColor"></div></div> <div class="Eleditor-textStyle-item"><div class="Eleditor-textStyle-fontSize"></div></div> <div class="Eleditor-textStyle-item"><div class="Eleditor-textStyle-lineHeight"></div></div> <div class="Eleditor-textStyle-item"> <div class="Eleditor-textStyle-align Eleditor-textStyle-alignLeft" align="left"></div> </div> <div class="Eleditor-textStyle-item"> <div class="Eleditor-textStyle-align Eleditor-textStyle-alignCenter" align="center"> </div> </div> <div class="Eleditor-textStyle-item"> <div class="Eleditor-textStyle-align Eleditor-textStyle-alignRight" align="right"> </div> </div> <div class="Eleditor-textStyle-item Eleditor-textStyle-item-upImg"> <div class="Eleditor-textStyle-upImg"></div> </div> </div> <div class="Eleditor-textEditor-colors"> <div class="Eleditor-textEditor-modulePane"><span></span></div> <ul> <li><span style="background-color:#232323;"></span></li> <li><span style="background-color:#2196F3;"></span></li> <li><span style="background-color:#795548;"></span></li> <li><span style="background-color:#00BCD4;"></span></li> <li><span style="background-color:#4CAF50;"></span></li> <li><span style="background-color:#E666E5;"></span></li> <li><span style="background-color:#FF9800;"></span></li> <li><span style="background-color:#FF5722;"></span></li> <li><span style="background-color:#ff2a1a;"></span></li> <li><span style="background-color:#FFEB3B;"></span></li> <li><span style="background-color:#ffffff;border: 1px solid #ccc;"></span></li> <li> <span class="Eleditor-inheritValue" style="background-color:transparent; border: 1px solid #dedede;"> </span> </li> </ul> </div> <div class="Eleditor-textEditor-fontsizes"> <div class="Eleditor-textEditor-modulePane"><span>字体大小</span></div> <ul> <li class="Eleditor-inheritValue">默认</li> <li>14px</li> <li>16px</li> <li>20px</li> <li>28px</li> <li>35px</li> </ul> </div> <div class="Eleditor-textEditor-lineheight"> <div class="Eleditor-textEditor-modulePane"><span>行高</span></div> <ul> <li class="Eleditor-inheritValue">默认</li> <li>20px</li> <li>25px</li> <li>30px</li> <li>35px</li> <li>40px</li> </ul> </div> <div class="Eleditor-textEditor-linedecorations"> <div class="Eleditor-textEditor-modulePane"><span>文本修饰</span></div> <ul> <li class="Eleditor-inheritValue">无</li> <li style="text-decoration: overline">上划线修饰</li> <li style="text-decoration: line-through">删除线修饰</li> <li style="text-decoration: underline">下划线修饰</li> </ul> </div> <div class="Eleditor-textEditor-formats"> <div class="Eleditor-textEditor-format"></div> <div class="Eleditor-textEditor-clean"></div> </div> <div class="Eleditor-inputarea"> <input placeholder="请输入超链接" type="text" /> <div placeholder="点击输入内容" class="textarea" contenteditable="true"></div> </div> <div class="Eleditor-method"> <button class="Eleditor-commit">提交</button> <button class="Eleditor-cancel">取消</button> </div> </div> <div class="Eleditor-delete-layer" style="z-index:'+u+'"> <div class="Eleditor-delete-tip">进入批量删除模式,点击段落进行删除</div> <div class="Eleditor-delete-revoke"></div> <div class="Eleditor-delete-clear"></div> <div class="Eleditor-delete-back">返回继续编辑</div> </div> </div>';
return r};l[d]=function(){console.log("|--Eleditor Initing");var S=arguments[0];S.upload=S.upload||{};S.mounted=S.mounted||function(){};S.changer=S.changer||function(){};S.toolbars=S.toolbars||[],_editorUid=k(),_historys=[],_placeHolder=S.placeHolder||'<p class="Eleditor-placeholder">点击此处编辑内容</p>',_uploadRole=null;if(S.toolbars.length===0){S.toolbars=["insertText","editText","insertImage","insertLink","insertHr","delete","undo","cancel",]}if(S.el instanceof jQuery){var ab=S.el}else{var ab=g(S.el);if(ab.length===0){return console.warn("|--Eleditor "+S.el+"元素不存在,请在DOMContentLoaded后初始化Eleditor")}else{if(ab.length!=1){var ab=g(ab[0])}}}if(ab.attr("Eleditor-Inited")==="true"){return console.warn("|--Eleditor "+S.el+"已经绑定了Eleditor")}ab.attr({"Eleditor-Inited":"true","Eleditor-Uid":_editorUid});e(ab,_placeHolder);var O=null;var z=g(l);var r=g("html,body");var Q=g(n(S.toolbars,_editorUid));var Y=Q.find(".Eleditor-controller");var A=Q.find(".Eleditor-loading");var E=Q.find(".Eleditor-textEditor");var F=E.find(".Eleditor-inputarea .textarea");var T=Y.find(".Eleditor-insertImage");var G=E.find(".Eleditor-textStyle-item-upImg");var X=E.find(".Eleditor-inputarea input");var x=E.find(".Eleditor-textEditor-colors");var q=E.find(".Eleditor-textEditor-fontsizes");var N=Q.find(".Eleditor-undo");var K=E.find(".Eleditor-textEditor-lineheight");var t=E.find(".Eleditor-textEditor-linedecorations");var y=Q.find(".Eleditor-delete-layer");ab.addClass("Eleditor-area");ab.after(Q);console.log("|--Eleditor Mounted To",ab);var L=null,R=null;var D=function(ad){L=ad;ad.addClass("Eleditor-active");var ac=ad.offset().top+ad.outerHeight();g.each(Y.find("li"),function(af,ah){var ag=g(ah),ae=ag.attr("bind-tags");if(ae){ae=ae.toLocaleLowerCase().split(",");if(m(L[0].tagName.toLocaleLowerCase(),ae)){ag.show()}else{ag.hide()}}});Y.show();P();if(typeof r.animate==="function"){r.stop().animate({scrollTop:(ac-150)+"px"},500)}else{r.scrollTop((ac-150)+"px")}R&&R.refresh()};var P=function(){if(L){Y.css({top:L.offset().top+L.outerHeight(),width:ab.width()-5})}},v=function(){ab.find(".Eleditor-active").removeClass("Eleditor-active");Y.hide();L=null};var H=function(){M();ab.addClass("Eleditor-deleteMode");y.show()},M=function(){if(_historys.length>0){Q.find(".Eleditor-delete-revoke").removeClass("Eleditor-delete-revoke-disabled")}else{Q.find(".Eleditor-delete-revoke").addClass("Eleditor-delete-revoke-disabled")}},s=function(){ab.removeClass("Eleditor-deleteMode");y.hide()};var u=function(){Y.hide();Q.addClass("Eleditor-mask");O=z.scrollTop();r.addClass("Eleditor-scrollLocked")},I=function(){Q.removeClass("Eleditor-mask");r.removeClass("Eleditor-scrollLocked");z.scrollTop(O)};var B=function(){u();A.show();A.html("<p>"+arguments[0]+"</p>")},aa=function(){I();A.hide()};var C=function(){_historys.push(ab.html());Z();M();return true},J=function(){if(_historys.length===0){return}ab.html(_historys.pop());S.changer();Z();M();v()},Z=function(){if(_historys.length==0){N.hide()}else{N.show()}};var w=function(){E.attr("role","edit").show();F.html(L.hasClass("Eleditor-placeholder")?"":L.html());F.attr("style",L.attr("style"));if(L.css("font-weight")=="bold"){E.find(".Eleditor-textStyle-bold").addClass("Eleditor-active")}if(m(L.css("text-decoration"),["overline","line-through","underline"])){E.find(".Eleditor-textStyle-linedecoration").addClass("Eleditor-active")}if(L[0].tagName=="A"){E.attr("type","link");X.val(L.attr("href"))}else{E.attr("type","word")}var ac=L.css("text-align");if(m(ac,["left","center","right"])){E.find(".Eleditor-textStyle-align[align="+ac+"]").addClass("Eleditor-active")}else{E.find(".Eleditor-textStyle-align").removeClass("Eleditor-active")}E.find(".Eleditor-textStyle-color span").css("background-color",L.css("color"))};if(typeof WebUploader!="undefined"&&typeof S.uploader!="function"){R=WebUploader.create({auto:true,server:S.upload.server||"/upload",pick:T,resize:false,headers:S.upload.headers||{},formData:S.upload.formData||{},duplicate:true,fileSingleSizeLimit:S.upload.fileSizeLimit?S.upload.fileSizeLimit*1024*1024:undefined,accept:Object.assign({title:"Images",extensions:"gif,jpg,jpeg,bmp,png,webp",mimeTypes:"image/gif,image/jpg,image/jpeg,image/bmp,image/png,image/webp"},S.upload.accept||{}),fileVal:S.upload.formName,});R.on("uploadStart",function(ac,ad){B('上传图片中<span id="uploadProgress">1</span>%')});R.on("uploadProgress",function(ac,ad){g("#uploadProgress").html(parseFloat((ad*100).toFixed(2)))});R.on("error",function(){if(arguments[0]=="Q_TYPE_DENIED"){l.alert("请上传图片格式文件")}if(arguments[0]=="F_EXCEED_SIZE"){l.alert("文件大小不能超过"+(arguments[1]/1048576)+"M")}});R.on("uploadComplete",function(){aa()});R.on("uploadSuccess",function(ac,ae){var ad=g("#rt_"+ac.source.ruid).parents(".Eleditor-textStyle-item-upImg").length>0;if(ae.status==1){if(ad){F.append('<img src="'+ae.url+'">')}else{C();L.after(g('<img src="'+ae.url+'">'));if(L.hasClass("Eleditor-placeholder")){L.remove()}}S.changer()}else{l.alert("上传失败:["+ae.msg+"]")}if(!ad){v()}});R.addButton({id:G});
G.addClass("Eleditor-webUploader-btn")}else{if(typeof S.uploader=="function"){var U=function(){var ad=g(this).hasClass("Eleditor-textStyle-item-upImg");try{S.uploader.call(this).then(function(af){var ag=typeof af==="object"&&af.length?af:[af];if(ad){for(var ae=0;ae<ag.length;ae++){F.append('<img src="'+ag[ae]+'">')}}else{C();for(var ae=0;ae<ag.length;ae++){L.after(g('<img src="'+ag[ae]+'">'))}if(L.hasClass("Eleditor-placeholder")){L.remove()}v()}S.changer()},function(ae){l.alert("上传失败:["+ae+"]")})}catch(ac){console.warn(ac);console.warn("|--Eleditor 请检查uploader函数返回是否是标准Promise对象!")}};T.click(U);G.click(U)}else{G.addClass("Eleditor-textStyle-item-upImg-disabled")}}var V={insertText:function(){u();E.attr({"role":"insert","type":"word"}).show()},insertLink:function(){u();E.attr({"role":"insert","type":"link"}).show()},insertImage:function(){if(typeof WebUploader==="undefined"&&typeof S.uploader!="function"){window.alert("上传参数未定义.")}},insertHr:function(){C();var ac=g('<div class="horizontal-line" style="padding: 10px 0;border-bottom: 1px solid #aaa;margin-bottom: 20px;"></div>');L.after(ac);S.changer();v()},editText:function(){if(m(L[0].tagName,a)){return this.insertText()}u();w()},"delete":function(){if(ab.find("*").length==1){C();S.changer();L.remove()}else{H()}v();e(ab,_placeHolder)},undo:function(){J()},cancel:function(){v()}};for(var W=0;W<S.toolbars.length;W++){if(typeof S.toolbars[W]==="object"){V[S.toolbars[W].id]=S.toolbars[W].handle}}z.on("resize",function(){P()});Y.on("click","ul li",function(){var ad=g(this),ac=ad.attr("event");if(typeof V[ac]==="function"){if(typeof h[ac]!="undefined"){V[ac]()}else{V[ac](L,ad)!==false&&V.cancel()}}});Q.on("click",".Eleditor-delete-revoke",function(){J()});y.on("click",".Eleditor-delete-clear",function(){if(!confirm("确定清空内容吗?")){return}var ac=ab.clone();ac.find(".Eleditor-placeholder").remove();if(o(ac.text())!=""){C();ab.html("");S.changer();e(ab,_placeHolder)}});y.on("click",".Eleditor-delete-back",function(){s()});E.on("click",".Eleditor-textStyle-bold",function(){F.css("font-weight",g(this).hasClass("Eleditor-active")?"normal":"bold");g(this).toggleClass("Eleditor-active")});E.on("click",".Eleditor-textStyle-linedecoration",function(){t.show();g(this).addClass("Eleditor-active")});E.on("click",".Eleditor-textStyle-color,.Eleditor-textStyle-bgColor",function(){var ac=g(this);var ad=ac.hasClass("Eleditor-textStyle-bgColor")?"bgcolor":"color";x.find(".Eleditor-textEditor-modulePane span").html(ad=="bgcolor"?"文字背景颜色":"文字颜色");x.attr("role",ad).show();g(this).addClass("Eleditor-active")});E.on("click",".Eleditor-textStyle-fontSize",function(){q.show();g(this).addClass("Eleditor-active")});E.on("click",".Eleditor-textStyle-lineHeight",function(){K.show();g(this).addClass("Eleditor-active")});t.on("click","ul li",function(){if(!g(this).hasClass("Eleditor-inheritValue")){F.css("text-decoration",g(this).css("text-decoration"))}else{F.css("text-decoration","inherit");E.find(".Eleditor-textStyle-linedecoration").removeClass("Eleditor-active")}t.hide()});K.on("click","ul li",function(){if(!g(this).hasClass("Eleditor-inheritValue")){F.css("line-height",g(this).html())}else{F.css("line-height","inherit");E.find(".Eleditor-textStyle-lineHeight").removeClass("Eleditor-active")}K.hide()});q.on("click","ul li",function(){if(!g(this).hasClass("Eleditor-inheritValue")){F.css("font-size",g(this).html())}else{F.css("font-size","inherit");E.find(".Eleditor-textStyle-fontSize").removeClass("Eleditor-active")}q.hide()});E.on("click",".Eleditor-textStyle-align",function(){var ac=g(this).attr("align");F.css({"text-align":ac,"display":"block"});E.find(".Eleditor-textStyle-align.Eleditor-active").removeClass("Eleditor-active");g(this).addClass("Eleditor-active")});E.on("click",".Eleditor-textEditor-format",function(){var ad=F,ac="style width height border bgcolor align color";ad.removeAttr(ac);g.each(ad.find("*"),function(ag,ae){var af=ad.find(ae);if(m(ae.tagName.toLocaleLowerCase(),["script","style"])){af.remove()}else{af.removeAttr(ac)}});F.html(ad.html());E.find(".Eleditor-active").removeClass("Eleditor-active")});E.on("click",".Eleditor-textEditor-clean",function(){confirm("确定清空内容(不可恢复)?")&&F.html("")});E.on("click",".Eleditor-cancel,.Eleditor-commit",function(){arguments[0].preventDefault();if(g(this).hasClass("Eleditor-commit")){var ac=F.attr("style")||"";var af=F.html();var ad=E.attr("role")=="edit";var ah=L.hasClass("Eleditor-placeholder");if(!af){return alert("请输入内容文字")}C();if(ad||(ah&&E.attr("type")!="link")){if(E.attr("type")=="link"){L.attr("href",X.val())}L.attr("style",ac).removeClass("Eleditor-placeholder").html(af)}else{var ae="";if(E.attr("type")=="link"){var ag=X.val();ae='<a style="'+ac+'" href="'+ag+'">'+af+"</a>"}else{ae='<p style="'+ac+'">'+af+"</p>"}L.after(g(ae));if(ah){L.remove()}}S.changer();P()}E.find(".Eleditor-active").removeClass("Eleditor-active");E.find(".Eleditor-textStyle-color span").removeAttr("style");F.removeAttr("style").html("");X.val("");I();E.hide();v()
});x.on("click","ul li span",function(){var ac=g(this).css("background-color");if(x.attr("role")=="color"){if(!g(this).hasClass("Eleditor-inheritValue")){F.css("color",ac);E.find(".Eleditor-textStyle-color span").css("background-color",ac)}else{F.css("color","inherit");E.find(".Eleditor-textStyle-color").removeClass("Eleditor-active").find("span").removeAttr("style")}}else{if(!g(this).hasClass("Eleditor-inheritValue")){F.css("background-color",ac)}else{F.css("background-color","inherit");E.find(".Eleditor-textStyle-bgColor").removeClass("Eleditor-active")}}x.hide()});ab.on("click","*",function(ac){var ad=g(this);if(ab.hasClass("Eleditor-deleteMode")){if(!ad.hasClass("Eleditor-placeholder")){C();if(typeof ad.fadeOut==="function"){ad.fadeOut("fast",function(){ad.remove();e(ab,_placeHolder)})}else{ad.remove();e(ab,_placeHolder)}S.changer()}}else{if(!ad.hasClass("Eleditor-active")){v();s();D(ad)}}return ac.preventDefault()==0});S.mounted();return{clear:function(){S.changer();ab.html("");e(ab,_placeHolder)},revoke:function(){J()},append:function(){v();var ad=arguments[0];if(!ad){return}var ac=g(ad);if(typeof ad=="string"&&ac.length==0){ac=g("<p>"+ad+"</p>")}ab.find(".Eleditor-placeholder").remove();C();return ab.append(ac)},trigger:function(){var ac=arguments[0];if(ac=="insertText"){L=ab.find(">:last");V.insertText()}else{if(ac=="insertLink"){L=ab.find(">:last");V.insertLink()}}},saveState:function(){return C()},getEditNode:function(){return L},getContent:function(){var ac=ab.clone();ac.find(".Eleditor-placeholder").remove();ac.find(".Eleditor-active").removeClass("Eleditor-active");return ac.html()},getContentText:function(){var ac=ab.clone();ac.find(".Eleditor-placeholder").remove();return o(ac.text())},hideEditorControllerLayer:v,destory:function(){ab.removeAttr("Eleditor-Inited Eleditor-Uid");ab.removeClass("Eleditor-area");ab.find(".Eleditor-placeholder").remove();ab.off().find(".Eleditor-active").removeClass("Eleditor-active");Q.find("*").off();Q.remove();console.log("|--Eleditor "+_editorUid+" destoryed")}}}})(window);