百度umeditor富文本编辑器插件扩展
富文本编辑器在WEB开发中经常用到,个人比较喜欢用百度出的ueditor这款,ueditor这款本身支持插件扩展的,但是ueditor的mini版本 umeditor 就没有那么方便了,不过找了很多资料根据这些资料琢磨出了如果给umeditor添加插件,这个案例中将实现增加代码和附件插入.
准备工作:
1.umeditor下载:
https://github.com/fex-team/umeditor/releases
2.插件弹窗使用的是 layer:
http://layer.layui.com/?alone
如何创建插件?

第一步:我们在编辑器umeditor目录下创建一个plugins的文件夹,这里用来存放我们自定义的插件,如上图,我们定义了一个代码(code)以及附件(attachment)插件
第二步:创建plugins.js文件,这里用来封装我们插件的信息,代码如下
//定义插件容器
var plugins = new Array();
//注册插件
function registerPlugins() {
//添加代码插件
plugins['code'] = new function () {
//注册界面事件
var result = new Object();
result.CodeObj = {};
//注册指定事件
UM.registerUI('code',
function (name) {
var me = this;
var $btn = $.eduibutton({
icon: 'source',
click: function () {
var layIndex = layer.open({
type: 2,
title: '源代码',
maxmin: false,
shadeClose: true, //点击遮罩关闭层
area: ['620px', '380px'],
content: '/lib/umeditor/plugins/code/code.html',
btn: ['确定', '取消'],
btn1: function (index) {
if (result.CodeObj.codeContent != '') {
//把内容插入编辑器
var html = '<pre class="prettyprint"><code class="language-' + result.CodeObj.codeType + '">' + result.CodeObj.codeContent + '</code></pre>';
me.execCommand('insertHtml', html);
}
//关闭弹窗并且清空当次内容
layer.close(layIndex);
result.CodeObj = {};
//UM.getEditor('container').setContent(html, true);
},
btn2: function (index) {
//关闭当前弹窗 并且清空当前数据容器
layer.close(layIndex);
result.CodeObj = {};
}
});
},
title: '源代码'
});
me.addListener('selectionchange', function () {
//切换为不可编辑时,把自己变灰
var state = this.queryCommandState(name);
$btn.edui().disabled(state == -1).active(state == 1)
});
return $btn;
}
);
return result;
};
//添加代码插件
plugins['attachment'] = new function () {
//注册界面事件
var result = new Object();
result.DataObj = {};
//注册指定事件
UM.registerUI('attachment',
function (name) {
var me = this;
var $btn = $.eduibutton({
icon: 'attachment',
click: function () {
var layIndex = layer.open({
type: 2,
title: '附件',
maxmin: false,
shadeClose: true, //点击遮罩关闭层
area: ['600px', '320px'],
content: '/lib/umeditor/plugins/attachment/attachment.html',
btn: ['确定', '取消'],
btn1: function (index) {
if (result.DataObj.title != "" && result.DataObj.url != "") {
var html = '<div class="card" style="margin-bottom:5px;padding:0px;">';
html += '<div class="col-lg-12" style = "margin-top:10px;padding-left: 0px;">';
html += '<div class="col-lg-3" style="width:55px;">';
html += '<img src="/images/download.png" />';
html += '</div>';
html += '<div class="col-lg-8">';
html += '<div class="row">';
html += result.DataObj.title;
html += '</div>';
html += '<div class="row">';
html += '提取密码:<strong>' + (result.DataObj.password != "" ? result.DataObj.password:"")+'</strong>';
html += '</div>';
html += '</div>';
html += '<div class="col-sm-1">';
html += '<a href="' + result.DataObj.url + '" _href="' + result.DataObj.url + '" class="btn btn-link" target="_blank"> <i class="icon icon-download-alt icon-2x"></i></a>';
html += '</div>';
html += '</div>';
html += '</div>';
me.execCommand('insertHtml', html);
}
//关闭当前弹窗 并且清空当前数据容器
layer.close(layIndex);
result.DataObj = {};
},
btn2: function (index) {
//关闭当前弹窗 并且清空当前数据容器
layer.close(layIndex);
result.DataObj = {};
}
});
},
title: '附件'
});
me.addListener('selectionchange', function () {
//切换为不可编辑时,把自己变灰
var state = this.queryCommandState(name);
$btn.edui().disabled(state == -1).active(state == 1)
});
return $btn;
}
);
return result;
};
}
第三步:因为例子中的插件是需要弹窗的,所以我们需要借助layer这个弹窗组建来实现,这里就以插入代码为说明吧
a.创建code文件夹
b.创建code.html文件
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script src="/lib/jquery/jquery-3.2.0.min.js"></script>
<link href="/style/css/zui.min.css" rel="stylesheet" />
</head>
<body>
<div class="container-fluid">
<form class="form-horizontal form-condensed" method="post">
<div class="form-group">
<div class="col-md-4" style="width:620px;margin-top:10px;">
<select class="form-control" onchange="MonitorTypeChanage()" style="height:30px;font-size:16px;" id="CodeType">
<option value="csharp">C#</option>
<option value="javascript">JavaScript</option>
<option value="html">HTML</option>
<option value="css">CSS</option>
<option value="SQL">SQL</option>
</select>
</div>
</div>
<div class="form-group">
<div class="col-md-12">
<textarea style="height:210px;width:600px;" oninput="MonitorContentsInput()" id="CodeContents" name="CodeContents" placeholder="请输入代码内容..."></textarea>
</div>
</div>
</form>
</div>
<script type="text/javascript" src="code.js"></script>
</body>
</html>
c.创建code.js文文件
var result = {
codeType: 'csharp',
codeContent:''
}
window.onload = function () {
parent.plugins['code'].CodeObj = result;
}
//监听代码内容输入事件
function MonitorContentsInput() {
result.codeContent = html2Escape($("#CodeContents").val());
parent.plugins['code'].CodeObj = result;
}
//监听代码类型选择事件
function MonitorTypeChanage() {
result.codeType = $("#CodeType").val();
parent.plugins['code'].CodeObj = result;
}
function html2Escape(sHtml) {
return sHtml.replace(/[<>&"]/g, function (c) { return { '<': '<', '>': '>', '&': '&', '"': '"' }[c]; });
}
d.弹窗组件中的功能写完了,我们需要在plugins.js文件中把刚刚增加的功能组件注册到umeditor对象中,完成这一步就完成一个插件功能,代码如下(plugins.js所有组件代码在第一步中)
plugins['code'] = new function () {
//注册界面事件
var result = new Object();
result.CodeObj = {};
//注册指定事件
UM.registerUI('code',
function (name) {
var me = this;
var $btn = $.eduibutton({
icon: 'source',
click: function () {
var layIndex = layer.open({
type: 2,
title: '源代码',
maxmin: false,
shadeClose: true, //点击遮罩关闭层
area: ['620px', '380px'],
content: '/lib/umeditor/plugins/code/code.html',
btn: ['确定', '取消'],
btn1: function (index) {
if (result.CodeObj.codeContent != '') {
//把内容插入编辑器
var html = '<pre class="prettyprint"><code class="language-' + result.CodeObj.codeType + '">' + result.CodeObj.codeContent + '</code></pre>';
me.execCommand('insertHtml', html);
}
//关闭弹窗并且清空当次内容
layer.close(layIndex);
result.CodeObj = {};
//UM.getEditor('container').setContent(html, true);
},
btn2: function (index) {
//关闭当前弹窗 并且清空当前数据容器
layer.close(layIndex);
result.CodeObj = {};
}
});
},
title: '源代码'
});
me.addListener('selectionchange', function () {
//切换为不可编辑时,把自己变灰
var state = this.queryCommandState(name);
$btn.edui().disabled(state == -1).active(state == 1)
});
return $btn;
}
);
return result;
};
如何使用?
准备工作准备好以后我们新建一个页面,引入相关的样式以及JS文件,代码如下:
@{
ViewData["Title"] = "umeditor富文本编辑器插件扩展案例";
}
@section Style{
<link href="~/lib/umeditor/themes/default/css/umeditor.min.css" rel="stylesheet" />
}
<div class="container-fixed-md">
<textarea style="height:300px;width:700px;" id="Contents" name="Contents" placeholder=""></textarea>
</div>
@section Scripts{
<script src="~/lib/layer/layer.min.js"></script>
<script src="~/lib/umeditor/umeditor.config.js"></script>
<script src="~/lib/umeditor/umeditor.min.js"></script>
<!--自定义插件文件导入-->
<script src="~/lib/umeditor/plugins/plugins.js"></script>
<script type="text/javascript">
var um = UM.getEditor('Contents', {
toolbar: [
' bold italic underline | insertorderedlist removeformat |',
'link unlink | emotion image attachment code',
'| fullscreen', 'formula'
]
});
//注册插件
registerPlugins();
</script>
}
运营效果?


示例代码如何下载?
码云下载:https://gitee.com/dotnet_51core/aspnetcoremvc
放一张示例截图(其他几个示例的博文会在这个月内全部更新上去):

写BUG我们是认真的!
哦,不,写示例我们是认真的!
百度umeditor富文本编辑器插件扩展的更多相关文章
- 使用百度UMeditor富文本编辑器,修改自定义图片上传,修改源码
富文本编辑器,不多说了,这个大家应该都用到过,至于用到的什么版本,那就分很多种 CKEditor:很早以前叫FCK,那个时候也用过,现在改名了,比较流行的一个插件,国外很多公司在用 UEDITOR:百 ...
- ASP.NET MVC5 中百度ueditor富文本编辑器的使用
随着网站信息发布内容越来越多,越来越重视美观,富文本编辑就是不可缺少的了,众多编辑器比较后我选了百度的ueditor富文本编辑器. 百度ueditor富文本编辑器分为两种一种是完全版的ueditor, ...
- 百度Web富文本编辑器ueditor在ASP.NET MVC3项目中的使用说明
====================================================================== [百度Web富文本编辑器ueditor在ASP.NET M ...
- 百度ueditor富文本编辑器的使用
百度ueditor富文本编辑器的使用 //以下为我在官网下载的ueditor v1.3.5 php版的大楷配置步骤第一步: //配置文件的引入应该比功能文件先引入,最后设置语言类型.即:editor. ...
- PHP如何搭建百度Ueditor富文本编辑器
本文为大家分享了PHP搭建百度Ueditor富文本编辑器的方法,供大家参考,具体内容如下 下载UEditor 官网:下载地址 将下载好的文件解压到thinkphp项目中,本文是解压到PUBLIC目录下 ...
- 关于百度Editor富文本编辑器 自定义上传位置
因为要在网站上编辑富文本数据,所以直接采用百度的富文本编辑器,但是这个编辑器有个缺点,默认情况下,文件只能上传到网站的根目录,不能自定义路径. 而且json配置文件只能和controller.jsp在 ...
- django之百度Ueditor富文本编辑器后台集成
Python3 + Django2.0 百度Ueditor 富文本编辑器的集成 百度富文本编辑器官网地址:http://fex.baidu.com/ueditor/ 疑问:为什么要二次集成? 答案:因 ...
- JSP嵌入ueditor、umeditor富文本编辑器
一.下载: 1.什么是富文本编辑器?就是: 或者是这个: 其中第一个功能比较详尽,其主要用来编写文章,名字叫做udeitor. 第二个就相对精简,是第一个的MINI版,其主要用来编辑即时聊天或者发帖, ...
- vue集成百度UEditor富文本编辑器
在前端开发的项目中.难免会遇到需要在页面上集成一个富文本编辑器.那么.如果你有这个需求.希望可以帮助到你 vue是前端开发者所追捧的框架,简单易上手,但是基于vue的富文本编辑器大多数太过于精简.于是 ...
随机推荐
- 关于session共享
最近在银行部署项目,一台Nginx做负载均衡,两台Tomcat,两台Oracle互备,一台ftp文件服务器.Tomcat涉及到session共享问题,所以就在这里做一下总结. 首先关于session ...
- MySQL安装及后续配置
rpm -qa | grep mysql 检查已安装的mysql版本 rpm -e --nodeps mysql-libs-5.1.71 卸载 tar -zxvf MySQL.tar.gz 解压 安 ...
- 10.22 tcpdump:监听网络流量
[功能说明] tcpdump命令是一个截获网络数据包的包分析工具.tcpdump可以将网络中传送的数据包的“头”完全截获下来以提供分析.它支持针对网络层.协议.主机.端口等的过滤,并支持与.或.非逻辑 ...
- 《mysql必知必会》学习_第14章_20180806_欢
第14章:使用子查询. 子查询是镶嵌在其他查询里面,相当其他的select查询的条件来. P91 select order_num from where prod_id='tnt2'; #检索条件 ...
- Latex 模版生成会议论文 不显示Keywords,而是显示 Index Terms- ,改成Keywords 方法
一. 不管显示何种内容,TEX 文件都是 \begin{IEEEKeywords} 关键词1.关键词2,..... \end{IEEEKeywords} 其中:模版文件 IEEETran.cls存在下 ...
- vuejs-devtools
先看看http://www.cnblogs.com/zhnaglei/p/7121482.html 这里的方法. 如果出现vue.js not detected之类的错误.试试用调试模式,就是用npm ...
- 【转】学习Java虚拟机没用? 听听当事人是怎么说的!
我是大名鼎鼎的Java 虚拟机, 据说这个星球上每天有900多万程序员和我打交道,这真是一个惊人的数字. 这900多万人中不少人对我的技术内幕非常感兴趣, 有事儿没事儿都要把我“大卸八块”, 深入了 ...
- Two strings 的另一种解法
Two strings 的另一种解法 论文中的解法是离线插入 \(O(\log n)\) 询问 \(O(\log n)\) 的,不过我发现有一种离线插入 \(O(1)\) 询问 \(O(\log n) ...
- Vue自定义指令,ref ,sync,slot
一.自定义指令 vue中可以自己设置指令,通过directive来实现,有2种创建方式,一种是局部创建,一种是全局创建. 第一种:局部创建 如果想注册局部指令,组件中也接受一个 directives ...
- JavaScript 函数式编程读书笔记2
概述 这是我读<javascript函数式编程>的读书笔记,供以后开发时参考,相信对其他人也有用. 说明:虽然本书是基于underscore.js库写的,但是其中的理念和思考方式都讲的很好 ...