以前做过一个教育项目,是有关在线考试的。其中对编辑器CKEditor做了扩充,增加了插入客观题、主观题、选择题和判断题的功能。这里记述下CKEditor插件开发的过程。

CKEditor以前叫FCKEditor,下载地址:http://ckeditor.com/download。我用的3.5.3版本,基本流程和方法应该也适用最新的版本。

效果如下:

四个按钮从左到右分别是:插入填空题,插入选择题,插入判断题和插入主观题。

点击 插入选择题答案 按钮,出现操作框:

点击确定后在编辑器里插入一个下拉框:

 

四个插件基本流程是一样的,拿“插入选择题”的开发流程来做个说明。

1.在ckeditor\plugins\ 下新建一个目录,名字为qchoice。我把这四个插件统一加了前缀字母q,是为了方便管理。

2.在qchoice下新建一个“plugin.js”,代码如下:

CKEDITOR.plugins.add('qchoice', {
requires: ['dialog'],
init: function (editor) {
var b = editor.addCommand('qchoice', new CKEDITOR.dialogCommand('qchoice'));
editor.ui.addButton('Choice', { //按钮名称:Choice,编辑器菜单上回用到
label: '插入选择题答案【客观题】', //插件名称
command: 'qchoice', //插件命令
icon: this.path + 'images/choice.gif' //编辑器菜单的图标
});
CKEDITOR.dialog.add('qchoice', this.path + 'dialogs/insertanswer.js'); //点击按钮弹出对话框的js代码
}
});

3.在qchoice里新建一个images目录,放进一个choice.gif。这个就是插件出现在编辑器菜单上的按钮图标。大小 16*16

4.在qchoice下新建dialogs目录。这个目录存放的是所有对话框。该目录下新建一个insertanswer.js文件,代码如下,我加了注释加以说明:

CKEDITOR.dialog.add('qchoice', function (editor) { //要和plugin.js 中的command 一致
var escape = function (value) {
return value;
};
return {
title: '插入选择题答案【客观题】', //对话框标题
minWidth: 400, //对话框宽度
minHeight: 100,//对话框高度
contents: [{ //对话框内容
id: 'choice',
name: 'choice',
label: '插入选择题答案',
title: '插入选择题答案',
elements: [{
id: 'rdType',
type: 'radio', //表单元素类型:单选按钮
label: '类型:', //标题
items: [['单选题', 'c'], ['多选题', 'm']], //单选按钮选项
'default': 'c' //默认值
},
{
id: 'txtItems',
type: 'text', //表单元素类型:输入框
label: '选项(选项之间用逗号隔开):',
'default': 'A,B,C,D'
},
{
id: 'txtAnswer',
type: 'text',
label: '答案(大小写要和选项一致,多选答案用逗号隔开如 B,D):',
validate: CKEDITOR.dialog.validate.notEmpty('请输入答案!') //验证
}]
}],
onOk: function () { //点击确定按钮出发onOK事件。以下代码主要目的是构造一个select下拉框
qtype = this.getValueOf('choice', 'rdType');
txtitems = this.getValueOf('choice', 'txtItems');
items = txtitems.split(/[',',',']/);
txtanswer = this.getValueOf('choice', 'txtAnswer');
answers = txtanswer.split(/[',',',']/);
rtn = "<select answertype='" + qtype + "'>";
flag = true;
//答案是否在选项中
for (var i in answers) {
isAnswerInItem = false;
if (answers[i] != "") {
for (var j in items) {
if (items[j] == answers[i]) {
isAnswerInItem = true;
break;
}
}
if (!isAnswerInItem) {
alert("答案" + answers[i] + "在选项中不存在!");
this.getContentElement('choice', 'txtAnswer').focus();
flag = false;
break;
}
}
}
if (flag) {
for (var i in items) {
if (items[i] != '') {
rtn += "<option ";
for (var j in answers) {
if (answers[j] == items[i]) {
rtn += "selected='selected'";
}
}
rtn += ">" + items[i] + "</option>";
}
}
rtn += "</select>";
editor.insertHtml(rtn); //将select插入编辑器
}
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;
}

5.接下来就是将这个插件加入到编辑器里。打开ckeditor/config.js,设置config.extraPlugins=“qchoice”,然后在config.toolbar中加入 “Choice”这个按钮名称:

CKEDITOR.editorConfig = function (config) {
config.language = 'zh-cn';
config.extraPlugins = 'qgapfill,qchoice,qtruefalse,qsubjective';
config.toolbar =
[
['PasteFromWord', 'PasteText', '-', 'Cut', 'Copy', 'Paste'],
['Image', 'Flash', 'Table', 'HorizontalRule', 'SpecialChar', 'PageBreak', '-', 'Gapfill', 'Choice', 'Truefalse', '-', 'Subjective'],
'/',
['Bold', 'Italic', 'Underline', 'Strike', '-', 'Subscript', 'Superscript'],
['NumberedList', 'BulletedList', '-', 'Outdent', 'Indent'],
['JustifyLeft', 'JustifyCenter', 'JustifyRight', 'JustifyBlock'],
['Link', 'Unlink', 'Anchor'],
'/',
['Styles', 'Format', 'Font', 'FontSize'],
['TextColor', 'BGColor'],
['Maximize', 'ShowBlocks', '-', 'Source', '-', 'Undo', 'Redo']
];
};

 

完成。

CKEditor插件开发的更多相关文章

  1. CkEditor 插件开发

    CKEditor的插件开发其实很简单只需要两步.1.通过CKEditor.plugins.add()方法编写插件的逻辑主体, 2.告诉CKEditor我们有一个自定义插件需要添加进来. //创建插件逻 ...

  2. CKeditor插件开发流程(二)SyntaxHighlighter

    CKEditor整合SyntaxHighlighter实现代码高亮显示 1,版本说明 CKEditor:ckeditor_4.0.1_standard.zipSyntaxHighlighter:syn ...

  3. CKeditor插件开发流程(一)

    1.放在多文件中 第一步:config.js中 config.extraPlugins = '插件名称';//注册插件,extraPlugins只允许出现一次,你如果之前有新增别的插件,那么用逗号分隔 ...

  4. CKEditor 自定义按钮插入服务端图片

    CKEditor 富文本编辑器很好用,功能很强大,在加上支持服务端图片上传的CKFinder更是方便, 最近在使用CKFinder的时候发现存在很多问题,比如上传图片的时候,图片不能按时间降序排列,另 ...

  5. 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。

    成功了,搞了2天.分享一下经验. 首先是把官方的那个例子下载下来,然后照如下的方式修改. 其中tempValue是一个全局变量. function savetoqiniu() { var upload ...

  6. JavaScript学习笔记(四)——jQuery插件开发与发布

    jQuery插件就是以jQuery库为基础衍生出来的库,jQuery插件的好处是封装功能,提高了代码的复用性,加快了开发速度,现在网络上开源的jQuery插件非常多,随着版本的不停迭代越来越稳定好用, ...

  7. jira的插件开发流程实践

    怎么开头呢,由于自己比较懒,博客一直不怎么弄,以后克己一点,多传点自己遇到的问题和经历上来,供自己以后记忆,也供需要的小伙伴少走点弯路吧 最近公司项目需要竞标一个运维项目,甲方给予了既定的几种比较常用 ...

  8. Vue插件开发入门

    相对组件来说,Vue 的插件开发受到的关注要少一点.但是插件的功能是十分强大的,能够完成许多 Vue 框架本身不具备的功能. 大家一般习惯直接调用现成的插件,比如官方推荐的 vue-router.vu ...

  9. 【原创】记一次Project插件开发

    一.开发背景 最近在使用微软的Office Project 2010 进行项目管理,看到排的满满的计划任务,一个个地被执行完毕,还是很有成就感的.其实,不光是在工作中可以使用Project进行项目进度 ...

随机推荐

  1. C语言使用指针表示数组的注意事项

    1)数组名是指针常量 如对指针变量可以进行++运算,但是对数组名却不允许,另外,对数组名的赋值运算也是错误的 2)注意指针变量的当前值 指针变量的值在程序运行过程中可能经常改变,要对此注意 3)数组越 ...

  2. Mybatis学习笔记(八) —— Mybatis整合spring

    一.整合思路 1.SqlSessionFactory对象应该放到spring容器中作为单例存在. 2.传统dao的开发方式中,应该从spring容器中获得sqlsession对象. 3.Mapper代 ...

  3. 安装OFFICE2016错误代码0-1018(0)的解决方案 和激活方案

    一.安装OFFICE2016错误代码0-1018(0)的解决方案 下面方法亲测有效:Step 1. Go to C:\Program Files\Common Files\microsoft shar ...

  4. 百度地图 js 调用

    百度地图key 的获取 进入 http://lbsyun.baidu.com/i 登录你的账号 点击进入控制台,复制 ak 的值 <!doctype html> <html> ...

  5. P1445 [Violet]樱花

    传送门 看到题目就要开始愉快地推式子 原式 $\frac{1}{x}+\frac{1}{y}=\frac{1}{n!}$ $\rightarrow \frac{x+y}{xy}=\frac{1}{n! ...

  6. 爬虫初识和request使用

    一.什么是爬虫 爬虫的概念: 通过编写程序,模拟浏览器上网,让其去互联网上爬取数据的过程. 爬虫的工作流程: 模拟浏览器发送请求->下载网页代码->只提取有用的数据->存放于数据库或 ...

  7. 服务器报nginx: [warn] conflicting server name "blog.xueyi.com" on 0.0.0.0:80, ignored

    nginx: [warn] conflicting server name "blog.xueyi.com" on 0.0.0.0:80, ignored 修改nginx配置参数后 ...

  8. daterangepicker-双日历

    js脚本和css样式,到bootstrap官网去下载 <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml&qu ...

  9. zookeeper崩溃修复

    cat /etc/zookeeper/conf/zoo.cfg 找到dataDir=/var/lib/zookeeper 切换到路径/var/lib/zookeeper cd /var/lib/zoo ...

  10. python 之serial

    一 先按照 pywin32:pywin32是一个非常强大的Python扩展库,是Python调用Windows系统底层功能的最佳接口,不安装这个按照pyserial也没有用 二 按装pyserial ...