杰克工作室 发表于 2023-9-29 11:00

ckeditor自定义按钮及阿里oss上传

<h4>啰嗦需求</h4>

<p>公司的百度编辑器已经千疮百孔了,各种bug层出不穷,因为公司图片这块的处理全是oss直传阿里的,上个前端也是费了巨力重新编辑修改了百度编辑器的图片上传功能,来贴合公司的实际需求。但是我觉得编辑器这块最重要是需要贴合用户的实际使用体验,编辑出来的页面是要在移动端展示的,最好能实现真正的&ldquo;所见即所得&rdquo;,傻瓜式的编辑体验,简单粗暴,够用就好,花里胡哨的功能我们也暂时用不到。参考了微信公众号编辑界面,知乎文章编辑界面,发现都是&ldquo;简单&rdquo;的界面实现了很&ldquo;实用&rdquo;的功能。<br />
接下来就是现有编辑器的选择了,毕竟自己现写个编辑器根本不现实(听说知乎的编辑器是30人的团队维护的&hellip;)。查阅了几家编辑器:wangEditor、bootstrap-wysiwyg、tinymce&hellip;感觉都对不上,不是文档太少,就是感觉&ldquo;弱不经风&rdquo;,官网的编辑器随手试试都能搞一两个bug出来,优化体验太差。应了知乎大神那句&ldquo;编辑器是个坑,你们千万别往里跳&rdquo;,一个好的编辑器真是需要精力去维护和更新的。<br />
最后选择了比较稳重的ckeditor,文档很全,支持插件,配置什么的也很友好,先给个文档链接感受一下:ckeditor在线文档https://docs.ckeditor.com/#!/guide/dev_installation</p>

<h4>安装配置</h4>

<p>官网下载文件,下载界面可选:Basic Package、Standard Package、Full Package、Customize。根据自己需求下载不同的安装包,而且每种都有压缩版和源码版可选。其中Customize版本顾名思义可自定义选择自己需要的模块,官方也推荐使用这种方式自定义下载,免得像我一样傻呵呵的自己下载需要的插件,结果安装依赖包安装到怀疑人生。<br />
接下来很简单,傻瓜式安装:</p>

<ul>
        <li>
        <p>html页面引入ckeditor.js文件,也可以使用官方CDN</p>

        <table>
                <tbody>
                        <tr>
                                <td>&lt;script type=&quot;text/javascript&quot; src=&quot;ckeditor/ckeditor.js /&gt; //&lt;script src=&quot;https://cdn.ckeditor.com/4.7.2/standard/ckeditor.js&quot;&gt;&lt;/script&gt;&nbsp; //官方CDN</td>
                        </tr>
                </tbody>
        </table>
        </li>
        <li>
        <p>替换textarea</p>

        <table>
                <tbody>
                        <tr>
                                <td>&lt;textarea name=&quot;editor1&quot; id=&quot;editor1&quot; rows=&quot;10&quot; cols=&quot;80&quot;&gt;This is my textarea to be replaced with CKEditor.&lt;/textarea&gt;</td>
                        </tr>
                </tbody>
        </table>
        </li>
        <li>
        <p>实例化ckeditor</p>

        <table>
                <tbody>
                        <tr>
                                <td>&lt;script&gt;<br />
                                &nbsp;&nbsp;&nbsp; // Replace the &lt;textarea id=&quot;editor1&quot;&gt; with a CKEditor<br />
                                &nbsp;&nbsp;&nbsp; // instance, using default configuration.<br />
                                &nbsp;&nbsp;&nbsp; CKEDITOR.replace( &#39;editor1&#39; );<br />
                                &lt;/script&gt;</td>
                        </tr>
                </tbody>
        </table>
        </li>
</ul>

<p>这样,一个基本可以使用的编辑器就搞好了,大概如下图:<br />
<img alt="截图1.png" src="data/attachment/forum/202309/29/297dfaa340080d62e2d2bf847cb1d96b.jpg" /></p>

<h4>个性化配置</h4>

<ul>
        <li>
        <p>ckeditor的个性化配置功能很人性化,打开下载好的ckeditor文件夹,ckeditor/samples/index.html打开,点击右上TOOLBAR CONFIGURATOR,切换到配置功能页,勾选自己需要的功能块儿,也可以调整显示顺序,上方是预览。<br />
        <img alt="截图2.png" src="data/attachment/forum/202309/29/ec1d50aa842658777cfe1a3754fb2721.jpg" /></p>
        </li>
        <li>
        <p>点击右边的Get toolbar config按钮,切换至我们配置好的config源码部分,复制该配置代码至ckeditor/config.js,直接覆盖就好。基本上所做的个性化配置都在这个文件里定义(还有另外两种配置方式,具体可以查看文档)。</p>

        <table>
                <tbody>
                        <tr>
                                <td>CKEDITOR.editorConfig = function( config ) {<br />
                                &nbsp;&nbsp;&nbsp; config.toolbarGroups = [<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;document&#39;, groups: [ &#39;mode&#39;, &#39;document&#39;, &#39;doctools&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;clipboard&#39;, groups: [ &#39;clipboard&#39;, &#39;undo&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;editing&#39;, groups: [ &#39;find&#39;, &#39;selection&#39;, &#39;spellchecker&#39;, &#39;editing&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;forms&#39;, groups: [ &#39;forms&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;styles&#39;, groups: [ &#39;styles&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;basicstyles&#39;, groups: [ &#39;basicstyles&#39;, &#39;cleanup&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;colors&#39;, groups: [ &#39;colors&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;paragraph&#39;, groups: [ &#39;list&#39;, &#39;indent&#39;, &#39;blocks&#39;, &#39;align&#39;, &#39;bidi&#39;, &#39;paragraph&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;links&#39;, groups: [ &#39;links&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;insert&#39;, groups: [ &#39;insert&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;tools&#39;, groups: [ &#39;tools&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;others&#39;, groups: [ &#39;others&#39; ] },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { name: &#39;about&#39;, groups: [ &#39;about&#39; ] }<br />
                                &nbsp;&nbsp;&nbsp; ];<br />
                                &nbsp;&nbsp;&nbsp; config.removeButtons = &#39;Image,Source,Save,NewPage,Print,Templates,PasteFromWord,PasteText,Paste,Copy,Cut,Find,Replace,SelectAll,Scayt,Form,Subscript,Superscript,CopyFormatting,Checkbox,Radio,TextField,Textarea,Select,Button,ImageButton,HiddenField,Outdent,Indent,CreateDiv,BidiLtr,BidiRtl,Language,Anchor,Table,HorizontalRule,Smiley,SpecialChar,PageBreak,ShowBlocks,Blockquote,Styles,Font,Preview,Flash,Link,Unlink,Maximize,Format,About,Iframe&#39;;<br />
                                };</td>
                        </tr>
                </tbody>
        </table>
        </li>
        <li>
        <p>刷新页面,就可以看到配置完的个性化编辑器了。</p>
        </li>
</ul>

<h4>自定义按钮(功能)</h4>

<p>毕竟每个人的需求都是不一样的,这时候一个编辑器的&ldquo;可扩展性&rdquo;就必不可少了。上面说道,图片功能需要结合阿里的oss上传,policy,signature等等的验证,同时需要能有微信公众号编辑界面一样,实现图片的100%显示和原尺寸显示的自由切换。</p>

<ul>
        <li>
        <p>在ckeditor/plugins文件夹下,新建一个名为oss的文件夹:内含dialogs文件夹,存放我们的弹窗内容;images文件夹,用来存放用到的小图标;plugin.js文件,定义oss插件的入口。方便起见我就用代码模拟一下,不传图了。</p>

        <table>
                <tbody>
                        <tr>
                                <td>
                                <pre>
oss
...dialogs
......oss.js
...images
......xxx.jpg
......xxx.png
...plugin.js
</pre>
                                </td>
                        </tr>
                </tbody>
        </table>
        </li>
        <li>
        <p>配置oss/plugin.js文件</p>

        <table>
                <tbody>
                        <tr>
                                <td>( function() {<br />
                                &nbsp;&nbsp;&nbsp; CKEDITOR.plugins.add( &#39;oss&#39;, {<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onLoad: function() {},<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init: function( editor ) {&nbsp;&nbsp; //上传图片插件初始化<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; editor.addCommand(&#39;ossupload&#39;, new CKEDITOR.dialogCommand(&#39;ossupload&#39;));&nbsp;&nbsp; //基于dialog弹窗插件<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; editor.ui.addButton(&#39;oss&#39;,<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label: &#39;插入图片&#39;,&nbsp;&nbsp; //鼠标hover到按钮上显示文字<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icon: &#39;plugins/oss/images/oss.png&#39;,&nbsp;&nbsp; //自定义按钮的图标<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; command: &#39;ossupload&#39;&nbsp; //点击按钮执行的命令<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 注册右键菜单<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( editor.contextMenu ) {<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; editor.addMenuGroup( &#39;oss&#39;);<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; editor.addMenuItem( &#39;image&#39;, {<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label: &#39;修改图片&#39;,<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; command: &#39;ossupload&#39;,<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group: &#39;oss&#39;<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } );<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CKEDITOR.dialog.add( &#39;ossupload&#39;, this.path + &#39;dialogs/oss.js&#39; );&nbsp; //弹窗文件,指向dialogs文件夹下的oss.js<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
                                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; afterInit: function() {}<br />
                                &nbsp;&nbsp;&nbsp; } );<br />
                                } )();</td>
                        </tr>
                </tbody>
        </table>
        </li>
</ul>

<p>接下来定义弹窗的内容,即dialogs内的oss.js文件,先看下实际效果<br />
<img alt="编辑器1.png" src="data/attachment/forum/202309/29/a1dfd8cee92486644ab45cbb37260bbc.jpg" /></p>

<table>
        <tbody>
                <tr>
                        <td>CKEDITOR.dialog.add( &#39;ossupload&#39;, function( editor ) {<br />
                        &nbsp;&nbsp;&nbsp; // 图片尺寸html模板<br />
                        &nbsp;&nbsp;&nbsp; var sizeHtml = new CKEDITOR.template( &#39;&lt;div class=&quot;myradio&quot;&gt;&#39; +<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&lt;div class=&quot;item&quot; style=&quot;padding-bottom:5px;&quot;&gt;&#39;+<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&lt;input type=&quot;radio&quot; name=&quot;size&quot; value=&quot;100%&quot; id=&quot;100&quot; checked style=&quot;vertical-align:middle;margin:0 5px 0 0;&quot;&gt;&#39; +<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&lt;label for=&quot;100&quot;&gt;图片满屏显示&lt;/label&gt;&#39;+<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&lt;/div&gt;&#39;+<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&lt;div class=&quot;item&quot;&gt;&#39;+<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&lt;input type=&quot;radio&quot; name=&quot;size&quot; value=&quot;auto&quot; id=&quot;auto&quot; style=&quot;vertical-align:middle;margin:0 5px 0 0;&quot;&gt;&#39; +<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&lt;label for=&quot;auto&quot;&gt;图片原尺寸显示&lt;/label&gt;&#39;+<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&lt;/div&gt;&#39;+<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#39;&lt;/div&gt;&#39;).output();<br />
                        &nbsp;&nbsp;&nbsp; var currentSrc = null;&nbsp; //编辑时图片源地址<br />
                        &nbsp;&nbsp;&nbsp; // 阿里oss图片上传<br />
                        &nbsp;&nbsp;&nbsp; function plupload1() {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //阿里oss上传组件,使用了官网的例子,基于plupload组件<br />
                        &nbsp;&nbsp;&nbsp; };<br />
                        &nbsp;&nbsp;&nbsp; return {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title: &#39;插入图片&#39;,<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; width: 302,&nbsp;&nbsp; //弹窗的宽px<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; minHeight: 302,&nbsp;&nbsp; //弹窗的最小高度px,上传图片高度大于300自动撑开<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contents: [<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id: &#39;ossimage&#39;,<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; label: &#39;上传图片&#39;,<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elements: [&nbsp;&nbsp;&nbsp; //自定义弹窗的内容,可以使用模板,也可自定义html及样式<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id: &#39;myimage&#39;,&nbsp;&nbsp;&nbsp; //选择图片按钮<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type: &#39;html&#39;,<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html: &#39;&lt;a href=&quot;javascript:;&quot; id=&quot;selectfile&quot;&gt;选择图片&lt;/a&gt;&#39;,&nbsp; //plupload按钮<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style: &#39;display:block;width:82px;line-height:34px;background-color:#3366b7;font-size:14px;color:#fff;text-align:center;border-radius:4px;&#39;,&nbsp; //html的样式,直接作用于上面的a元素<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onShow: function() {&nbsp; //当该元素show的时候执行的方法<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(currentSrc &amp;&amp; currentSrc !== &#39;undefined&#39;){&nbsp;&nbsp; //当右键编辑图片时执行,下篇说<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(&#39;#selectfile&#39;).hide();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $(&#39;.moxie-shim&#39;).hide();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onLoad: function() {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; plupload1();&nbsp; //加载时实例化plupload上传组件<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type: &#39;html&#39;,&nbsp;&nbsp;&nbsp; //图片上传成功后的容器<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html: &#39;&lt;div class=&quot;container&quot;&gt;&lt;div class=&quot;imgbox&quot;&gt;&lt;/div&gt;&lt;a style=&quot;display:none;position:absolute;top:0;left:0;z-index:1;width:16px;height:16px;background-image:url(/assets/js/ckeditor/skins/moono-lisa/images/close2.png)&quot;&gt;&lt;/a&gt;&lt;/div&gt;&#39;,<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; style: &#39;width:300px;height:auto;position:relative;&#39;,&nbsp; //对应的样式<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onShow: function() {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(currentSrc &amp;&amp; currentSrc !== &#39;undefined&#39;){<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //右键编辑图片时,将图片src传入容器,同时注册关闭图片事件<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commit: function( editor ){&nbsp; //点击确定按钮时,将图片src传入全局src中<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; src = $(&#39;.imgbox img&#39;).attr(&#39;src&#39;);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id: &#39;size&#39;,&nbsp;&nbsp; //图片全屏显示及按实际尺寸显示radio<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; type: &#39;html&#39;,<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; html: sizeHtml,&nbsp;&nbsp; //html写到了上面<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; commit: function( editor ){<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var tt = document.getElementsByName(&#39;size&#39;); //取radio选项<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (var i = 0; i &lt; tt.length ; i++ ){&nbsp;&nbsp;&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(tt.checked){<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; imgsize = tt.value;&nbsp;&nbsp;&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(src != undefined){<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建element,即确定后填到编辑器中的代码,此处最好使用p标签包裹img标签,ckeditor都是使用p标签包裹元素,保持一致<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var ele = CKEDITOR.dom.element.createFromHtml( &#39;&lt;p style=&quot;padding:5px 0;&quot;&gt;&lt;img style=&quot;max-width: 100%;width:&#39;+imgsize+&#39;&quot; src=&quot;&#39;+src+&#39;&quot;/&gt;&lt;/p&gt;&#39; );&nbsp;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; editor.insertElement(ele);&nbsp;&nbsp; //将element插入editor<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ]<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ],<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onShow: function() {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentSrc = null;&nbsp;&nbsp; //弹窗显示的时候判断&lsquo;选中元素&rsquo;的currentSrc是否存在<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var element = editor.getSelection().getSelectedElement();<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(element){<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log(element);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; console.log(element.$.currentSrc);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentSrc = element.$.currentSrc;//源图片地址<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onOk: function () {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.commitContent(editor);<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //点击确定时dom操作<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentSrc = null;<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; onCancel: function () {<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //取消时dom操作<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; currentSrc = null;&nbsp; //取消或者确定时清空currentSrc<br />
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
                        &nbsp;&nbsp; };<br />
                        } );</td>
                </tr>
        </tbody>
</table>

<p>看下上传图片后的实际效果<br />
<img alt="编辑器2.png" src="data/attachment/forum/202309/29/6ecd6b9f760c3e0f17366057b2c8c85c.jpg" /></p>

<p><img alt="编辑器3.png" src="data/attachment/forum/202309/29/551f4609c8befb45adaedefe608944e6.jpg" /></p>

<p>图片满屏显示会将图片宽度设为100%,高度自动;图片原尺寸显示会显示图片原本的尺寸。这里注意所谓图片原尺寸是指图片的实际大小,假若图片宽度200px,那么图片不管在什么设备下,宽度始终为200px,不过若是图片原尺寸超过了设备的实际宽度,那么图片的最大宽度就是设备的宽度,不会出现左右滚动条。</p>

<p>最后记得将我们自定义的组件注册到config.js中</p>

<table>
        <tbody>
                <tr>
                        <td>config.extraPlugins = &#39;myi frame,oss,dialog,dialogui,lineheight,richcombo,floatpanel,panel,listblock&#39;; //除了oss,myi frame,lineheight外,其他都为依赖组件</td>
                </tr>
        </tbody>
</table>

<p>&nbsp;</p>

<p>最后是编辑器的一些其他优化,如使用rem使编辑器宽度,字体大小等比例显示,行高组件的添加等,都是为了真正的实现所见即所得的个性化移动编辑器,真正做到了pc端编辑出来的效果就是在移动展示的实际比例效果。</p>

<table>
        <tbody>
                <tr>
                        <td>config.fontSize_defaultLabel = &#39;12&#39;;<br />
                        config.fontSize_sizes=&#39;12/0.24rem;14/0.28rem;16/0.32rem;18/0.36rem;20/0.4rem;22/0.44rem;24/0.48rem;26/0.52rem;28/0.56rem;36/0.72rem;48/0.96rem;72/1.44rem&#39;;<br />
                        CKEDITOR.config.menu_groups = &#39;&#39;; //编辑器内的右键菜单设为空。搜索关键字menuitem,查看源码<br />
                        config.line_height = &#39;1;1.2;1.5;2;2.2;2.5;3;3.5;4;5&#39;;&nbsp; //定义行高</td>
                </tr>
        </tbody>
</table>

<p>源文地址:https://liyang0207.github.io/2017/08/22/ckeditor%E8%87%AA%E5%AE%9A%E4%B9%89%E6%8C%89%E9%92%AE%E5%8F%8A%E9%98%BF%E9%87%8Coss%E4%B8%8A%E4%BC%A0/</p>
<br />
<br />
&nbsp;
页: [1]
查看完整版本: ckeditor自定义按钮及阿里oss上传