CKeditor富文本编辑器使用技巧之添加自定义插件的方法


Posted in Javascript onJune 14, 2019

本文实例讲述了CKeditor富文本编辑器使用技巧之添加自定义插件的方法。分享给大家供大家参考,具体如下:

首先就是在CKeditor的plugins目录下新建一个目录qchoice:

CKeditor富文本编辑器使用技巧之添加自定义插件的方法

qchoice目录下的结构如下:

CKeditor富文本编辑器使用技巧之添加自定义插件的方法

然后, images中如下:

CKeditor富文本编辑器使用技巧之添加自定义插件的方法

dialogs中如下:

CKeditor富文本编辑器使用技巧之添加自定义插件的方法

我们先来看plugins.js文件的内容:

(function() {
  CKEDITOR.plugins.add("qchoice", {
    requires: ["dialog"],
    init: function(a) {
      a.addCommand("qchoice", new CKEDITOR.dialogCommand("qchoice"));
      a.ui.addButton("qchoice", {
        label: "qchoice",//调用dialog时显示的名称
        command: "qchoice",
        icon: this.path + "images/qchoice.jpg"//在toolbar中的图标
      });
      CKEDITOR.dialog.add("qchoice", this.path + "dialogs/qchoice.js")
    }
  })
})();

再来看qchoice.js文件的内容:

CKEDITOR.dialog.add('qchoice', function (editor) { //要和plugin.js 中的command 一致
  var escape = function (value) {
    return value;
  };
  return {
    title: '', //对话框标题
    minWidth: 500, //对话框宽度
    minHeight: 600,//对话框高度
    contents: [{  //对话框内容
      id: 'choice',
      name: 'choice',
      label: '插入选择题答案',
      title: '插入选择题答案',
      elements: [{
        id: 'rdType_1',
        type: 'radio', //表单元素类型:单选按钮
        items: [['中国赞','[中国赞]'],['广告','[广告]'],['doge','[doge]'],['喵喵','[喵喵]'],['二哈','[二哈]'],['抱抱','[抱抱]'],['哼','[哼]'],['思考','[思考]'],['生病','[生病]'],['偷乐','[偷乐]']]
      },
      {
        id: 'rdType_2',
        type: 'radio', //表单元素类型:单选按钮
        items: [['笑cry','[笑cry]'],['馋嘴','[馋嘴]'],['拜拜','[拜拜]'],['右哼哼','[右哼哼]'],['左哼哼','[左哼哼]'],['怒骂','[怒骂]'],['鄙视','[鄙视]'],['笑而不语','[笑而不语]']]
      },
      {
        id: 'rdType_3',
        type: 'radio', //表单元素类型:单选按钮
        items: [['害羞','[害羞]'],['费解','[费解]'],['挖鼻','[挖鼻]'],['悲伤','[悲伤]'],['打脸','[打脸]'],['抓狂','[抓狂]'],['哈哈','[哈哈]'],['傻眼','[傻眼]'],['好喜欢','[好喜欢]'],['好爱哦','[好爱哦]']]
      },
      {
        id: 'rdType_4',
        type: 'radio', //表单元素类型:单选按钮
        items: [['失望','[失望]'],['good','[good]'],['弱','[弱]'],['耶','[耶]'],['来','[来]'],['握手','[握手]'],['加油','[加油]'],['haha','[haha]'],['拳头','[拳头]'],['男孩儿','[男孩儿]']]
      },
      {
        id: 'rdType_5',
        type: 'radio', //表单元素类型:单选按钮
        items: [['话筒','[话筒]'],['礼物','[礼物]'],['飞机','[飞机]'],['干杯','[干杯]'],['围脖','[围脖]'],['钟','[钟]'],['肥皂','[肥皂]'],['浪','[浪]'],['女孩儿','[女孩儿]'],['照相机','[照相机]']]
      },
      {
        id: 'rdType_6',
        type: 'radio', //表单元素类型:单选按钮
        items: [['熊猫','[熊猫]'],['喜','[喜]'],['绿丝带','[绿丝带]'],['威武','[威武]'],['弗莱见钱眼开','[弗莱见钱眼开]'],['看涨','[看涨]'],['看跌','[看跌]'],['奥特曼','[奥特曼]'],['兔子','[兔子]']]
      }
      ,
      {
        id: 'rdType_7',
        type: 'radio', //表单元素类型:单选按钮
        items: [['顶','[顶]'],['米奇喜欢','[米奇喜欢]'],['米奇飞吻','[米奇飞吻]'],['米奇大哭','[米奇大哭]'],['米奇比心','[米奇比心]'],['笑哈哈','[笑哈哈]'],['羞嗒嗒','[羞嗒嗒]'],['憧憬','[憧憬]'],['酷','[酷]']]
      }
      ,
      {
        id: 'rdType_8',
        type: 'radio', //表单元素类型:单选按钮
        items: [['月亮','[月亮]'],['围观','[围观]'],['蛋糕','[蛋糕]'],['微风','[微风]'],['音乐','[音乐]'],['猪头','[猪头]'],['鲜花','[鲜花]'],['太阳','[太阳]'],['Aloha','[Aloha]'],['赞啊','[赞啊]'],['求关注','[求关注]']]
      }
      ,
      {
        id: 'rdType_9',
        type: 'radio', //表单元素类型:单选按钮
        items: [['哈欠','[哈欠]'],['泪','[泪]'],['怒','[怒]'],['闭嘴','[闭嘴]'],['疑问','[疑问]'],['白眼','[白眼]'],['吐','[吐]'],['黑线','[黑线]'],['委屈','[委屈]'],['下雨','[下雨]'],['伤心','[伤心]']]
      }
      ,
      {
        id: 'rdType_10',
        type: 'radio', //表单元素类型:单选按钮
        items: [['作揖','[作揖]'],['星星','[星星]'],['半星','[半星]'],['空星','[空星]'],['草泥马','[草泥马]'],['浮云','[浮云]'],['沙尘暴','[沙尘暴]'],['给力','[给力]'],['骷髅','[骷髅]'],['最右','[最右]']]
      }
      ,
      {
        id: 'rdType_11',
        type: 'radio', //表单元素类型:单选按钮
        items: [['太开心','[太开心]'],['挤眼','[挤眼]'],['衰','[衰]'],['感冒','[感冒]'],['可怜','[可怜]'],['汗','[汗]'],['色','[色]'],['可爱','[可爱]'],['钱','[钱]'],['ok','[ok]'],['NO','[NO]'],['蜡烛','[蜡烛]']]
      }
      ,
      {
        id: 'rdType_12',
        type: 'radio', //表单元素类型:单选按钮
        items: [['吃狗粮','[吃狗粮]'],['蚁人','[蚁人]'],['黄蜂女','[黄蜂女]'],['吃瓜','[吃瓜]'],['允悲','[允悲]'],['坏笑','[坏笑]'],['困','[困]'],['互粉','[互粉]'],['睡','[睡]'],['并不简单','[并不简单]']]
      }
      ,
      {
        id: 'rdType_13',
        type: 'radio', //表单元素类型:单选按钮
        items: [['阴险','[阴险]'],['嘘','[嘘]'],['嘻嘻','[嘻嘻]'],['爱你','[爱你]'],['吃惊','[吃惊]'],['污','[污]'],['鼓掌','[鼓掌]'],['给你小心心','[给你小心心]'],['心','[心]'],['赞','[赞]']]
      }
      ,
      {
        id: 'rdType_14',
        type: 'radio', //表单元素类型:单选按钮
        items: [['微笑','[微笑]'],['偷笑','[偷笑]'],['舔屏','[舔屏]'],['亲亲','[亲亲]'],['摊手','[摊手]'],['跪了','[跪了]'],['晕','[晕]'],['米奇爱你','[米奇爱你]'],['带着微博去旅行','[带着微博去旅行]']]
      }]
    }],
    onOk: function () { //点击确定按钮出发onOK事件。以下代码主要目的是构造一个select下拉框
      qtype_1 = this.getValueOf('choice', 'rdType_1');
      qtype_2 = this.getValueOf('choice', 'rdType_2');
      qtype_3 = this.getValueOf('choice', 'rdType_3');
      qtype_4 = this.getValueOf('choice', 'rdType_4');
      qtype_5 = this.getValueOf('choice', 'rdType_5');
      qtype_6 = this.getValueOf('choice', 'rdType_6');
      qtype_7 = this.getValueOf('choice', 'rdType_7');
      qtype_8 = this.getValueOf('choice', 'rdType_8');
      qtype_9 = this.getValueOf('choice', 'rdType_9');
      qtype_10 = this.getValueOf('choice', 'rdType_10');
      qtype_11 = this.getValueOf('choice', 'rdType_11');
      qtype_12 = this.getValueOf('choice', 'rdType_12');
      qtype_13 = this.getValueOf('choice', 'rdType_13');
      qtype_14 = this.getValueOf('choice', 'rdType_14');
      rtn = "";
      if(qtype_1 != null){
        rtn += qtype_1;
      }
      if(qtype_2 != null){
        rtn += qtype_2;
      }
      if(qtype_3 != null){
        rtn += qtype_3;
      }
      if(qtype_4 != null){
        rtn += qtype_4;
      }
      if(qtype_5 != null){
        rtn += qtype_5;
      }
      if(qtype_6 != null){
        rtn += qtype_6;
      }
      if(qtype_7 != null){
        rtn += qtype_7;
      }
      if(qtype_8 != null){
        rtn += qtype_8;
      }
      if(qtype_9 != null){
        rtn += qtype_9;
      }
      if(qtype_10 != null){
        rtn += qtype_10;
      }
      if(qtype_11 != null){
        rtn += qtype_11;
      }
      if(qtype_12 != null){
        rtn += qtype_12;
      }
      if(qtype_13 != null){
        rtn += qtype_13;
      }
      if(qtype_14 != null){
        rtn += qtype_14;
      }
      if (rtn != "") {
        rtns = "<span>"+rtn+"</span>";
        editor.insertHtml(rtns);
      }
      else {
        return false;
      }
    }
  };
});
function htmlEncode(str) {
  var temp = document.createElement("div");
  (temp.textContent != null) ? (temp.textContent = str) : (temp.innerText = str);
  var output = temp.innerHTML;
  temp = null;
  return output;
}

之后就是config.js配置文件的内容了:

/**
 * @license Copyright (c) 2003-2017, CKSource - Frederico Knabben. All rights reserved.
 * For licensing, see LICENSE.md or http://ckeditor.com/license
 */
CKEDITOR.editorConfig = function( config ) {
  config.toolbarGroups = [
    { name: 'clipboard',  groups: [ 'clipboard', 'undo' ] },
    { name: 'editing',   groups: [ 'find', 'selection', 'spellchecker' ] },
    { name: 'links' },
    { name: 'insert' },
    { name: 'forms' },
    { name: 'tools' },
    { name: 'document',  groups: [ 'mode', 'document', 'doctools' ] },
    { name: 'others' },
    '/',
    { name: 'basicstyles', groups: [ 'basicstyles', 'cleanup' ] },
    { name: 'paragraph',  groups: [ 'list', 'indent', 'blocks', 'align', 'bidi' ] },
    { name: 'styles' },
    { name: 'colors' },
    { name: 'about' },
    { name: 'extent', items: ["qchoice"] }
  ];
  config.toolbar_Full = [
    ['Source','-','Save','NewPage','Preview','-','Templates'],
    ['Cut','Copy','Paste','PasteText','PasteFromWord','-','Print','SpellChecker', 'Scayt'],
    ['Undo','Redo','-','Find','Replace','-','SelectAll','RemoveFormat'],
    ['Form', 'Checkbox', 'Radio', 'TextField', 'Textarea', 'Select','Button', 'ImageButton', 'HiddenField'],
    '/',
    ['Bold','Italic','Underline','Strike','-','Subscript','Superscript'],
    ['NumberedList','BulletedList','-','Outdent','Indent','Blockquote'],
    ['JustifyLeft','JustifyCenter','JustifyRight','JustifyBlock'],
    ['Link','Unlink','Anchor'],
    ['Image','Flash','Table','HorizontalRule','Smiley','SpecialChar','PageBreak'],
    '/',
    ['Styles','Format','Font','FontSize'],
    ['TextColor','BGColor'],
    ["qchoice"]
  ];
  config.image_previewText=' ';
  config.filebrowserImageUploadUrl = 'uploadFiles';
  // config.extraPlugins = 'justify';
  config.extraPlugins += (config.extraPlugins ? ',justify' : 'justify');
  config.extraPlugins += (config.extraPlugins ? ',qchoice' : 'qchoice');
  // config.extraPlugins="linkbutton";
  //
  // config.extraPlugins="ilink";
  //
  // config.extraPlugins="ijuzi";
  // config.extraPlugins="iti";
  config.removeButtons = 'Underline,Subscript,Superscript';
  // Set the most common block elements.
  config.format_tags = 'p;h1;h2;h3;pre';
  // Simplify the dialog windows.
  config.removeDialogTabs = 'image:advanced;link:advanced';
  config.image_previewText=' ';
  config.entities = false;
};

好啦,到这里,自定义插件就算是放入成功了。咱们自定义的插件主要的逻辑结构就是在qchoice.js文件中,可以改变它的内容,来实现不同的功能。

好啦,本次记录就到这里了。

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
WordPress JQuery处理沙发头像
Jun 22 Javascript
取选中的radio的值
Jan 11 Javascript
jquery tab标签页的制作
May 10 Javascript
apycom出品的jQuery精美菜单破解方法
Feb 18 Javascript
js读取注册表的键值示例
Sep 25 Javascript
浅谈利用JavaScript进行的DDoS攻击原理与防御
Jun 04 Javascript
javascript实现信息增删改查的方法
Jul 25 Javascript
JS实现静态页面搜索并高亮显示功能完整示例
Sep 19 Javascript
详解在vue-cli项目中使用mockjs(请求数据删除数据)
Oct 23 Javascript
解决select2在bootstrap modal中不能正常使用的问题
Aug 09 Javascript
微信小程序中使用wxss加载图片并实现动画效果
Aug 13 Javascript
Vue实现导航栏的显示开关控制
Nov 01 Javascript
Vue动态创建注册component的实例代码
Jun 14 #Javascript
基于Proxy的小程序状态管理实现
Jun 14 #Javascript
深度了解vue.js中hooks的相关知识
Jun 14 #Javascript
Vue 实现前进刷新后退不刷新的效果
Jun 14 #Javascript
在Vue中使用icon 字体图标的方法
Jun 14 #Javascript
移动端底部导航固定配合vue-router实现组件切换功能
Jun 13 #Javascript
后台使用freeMarker和前端使用vue的方法及遇到的问题
Jun 13 #Javascript
You might like
Symfony数据校验方法实例分析
2015/01/26 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
Javascript attachEvent传递参数的办法
2009/12/14 Javascript
jQuery 表单验证扩展代码(一)
2010/10/11 Javascript
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
比较不错的JS/JQuery显示或隐藏文本的方法
2014/02/13 Javascript
用JS在浏览器中创建下载文件
2014/03/05 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
JavaScript调用传递变量参数的相关问题及解决办法
2015/11/01 Javascript
AngularJS基础 ng-options 指令详解
2016/08/02 Javascript
JS中绑定事件顺序(事件冒泡与事件捕获区别)
2017/01/24 Javascript
利用Ionic2 + angular4实现一个地区选择组件
2017/07/27 Javascript
通过javascript实现段落的收缩与展开
2019/06/26 Javascript
使用Angular material主题定义自己的组件库的配色体系
2019/09/04 Javascript
vue监听键盘事件的相关总结
2021/01/29 Vue.js
python实现备份目录的方法
2015/08/03 Python
python登录并爬取淘宝信息代码示例
2017/12/09 Python
django manage.py扩展自定义命令方法
2018/05/27 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
python和opencv实现抠图
2018/07/18 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
Django 对象关系映射(ORM)源码详解
2019/08/06 Python
python实现的多任务版udp聊天器功能案例
2019/11/13 Python
在django-xadmin中APScheduler的启动初始化实例
2019/11/15 Python
Django生成PDF文档显示网页上以及PDF中文显示乱码的解决方法
2019/12/17 Python
linux 下selenium chrome使用详解
2020/04/02 Python
Python request操作步骤及代码实例
2020/04/13 Python
Python基于QQ邮箱实现SSL发送
2020/04/26 Python
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
教师推荐信范文
2013/11/24 职场文书
市三好学生主要事迹
2014/01/28 职场文书
语文教学随笔感言
2014/02/18 职场文书
2014大学生中国梦主题教育学习思想汇报
2014/09/10 职场文书
2014年教师个人工作总结
2014/11/10 职场文书
2015年学生会主席工作总结
2015/04/21 职场文书
教师廉政准则心得体会
2016/01/20 职场文书