Tinymce group plugin
本文介绍一个tinymce插件,用来组合显示下拉的按钮。基于4.x,不兼容3.x。
以前
配置toolbar功能按钮
需要
toolbar1: "code undo redo fullscreen"
plugins: "code, fullscreen"
页面就能显示

配置 toolbar下拉的功能按钮集合,需要新写一个插件
插件核心源码:
editor.addButton('undoRedo', {
type: 'menubutton',
icon: 'mceIcon mce-i-undo',
menu: [
{
text: ed.getLang('Undo'),
icon: 'mceIcon mce-i-bold',
onclick: function() {
ed.execCommand('Undo');
}
},
{
text: ed.getLang('Redo'),
icon: 'mceIcon mce-i-redo',
onclick: function() {
ed.execCommand('Redo');
}
}
]
});
就能看到

现在
现在我们想要实现这类下拉功能菜单:

当然作为备选方案,可以使用使用上面提到的add menuButton的方式。不过这样的缺点是,我们如果需要5个下拉功能菜单,就不得不写五个插件,而都是重复的工作。
当一件事开始重复的时候,就一定有方法可以让其变的简单。
我们的解决办法是,通过一个插件,来配置多个下拉功能菜单。
talk is chip, show you the code:
使用配置:
toolbar1: 'undo redo | group group group group group | fullscreen',
group_set: [{
icon: 'alignleft',
buttons: 'alignleft,aligncenter,alignright',
title: 'Align center'
}, {
icon: 'bullist',
buttons: 'bullist,numlist',
title: 'advanced.bullist_desc'
}, {
icon: 'indent',
buttons: 'indent,outdent',
title: 'advanced.indent_desc'
}, {
icon: 'subscript',
buttons: 'superscript,subscript',
title: 'advanced.sup_desc'
},{
icon: 'image',
buttons: 'alitophotobank,image, aliphotobank',
title: 'advanced.sup_desc'
}];
效果:

plugin group实现
修改 toolbar 配置
toolbar1配置了5个group占位符,但是addButton的第一个参数name一定要和toolbar上的占位配置一致,所以第一步是修改 settings.toolbar上的group占位符。
// 修改 setting中toolbar上的group,group为group1,group2
modifySettingToolbar: function(ed) {
var index = 1;
var settings = ed.settings;
if(!settings.toolbar1 && !settings.toolbar2 && !settings.toolbar3) return false; var toolbar1 = settings.toolbar1.split(' '),
toolbar2 = settings.toolbar2.split(' '),
toolbar3 = settings.toolbar3.split(' '); [toolbar1, toolbar2, toolbar3].forEach(function(item) {
for (var i = 0; i < item.length; i++) {
if(item[i] == 'group') {
item[i] = 'group' + index;
index ++;
}
};
});
this.toolbarNum = index;
settings.toolbar1 = toolbar1.join(' ');
settings.toolbar2 = toolbar2.join(' ');
settings.toolbar3 = toolbar3.join(' ');
},
插件核心代码
//编辑器初始化后将初始化一个插件实例
init: function(ed, url) {
//在这个实例中我们保存一些编辑器的公用信息
this.ed = ed;
//保留配置信息
this.settings = ed.settings;
// 注意 4.x 没有3.x的 ed.onInit 方法
ed.on('init', function() {
this.createControl(ed);
}.bind(this));
},
// 创建 group button
createControl: function(ed) {
var _set = this.settings; this.modifySettingToolbar(ed);
for (var i = 1; i < this.toolbarNum; i++) { var _item = _set.group_set[i-1]; //获取多组信息
if(!_item) return false;
var _buttons = _item ? _item.buttons.split(',') : [],
subItem = []; for (var j = 0, l = _buttons.length; j < l; j++) { btn = _buttons[j] && _buttons[j].trim(); subItem.push({
//配置标题信息则需要考虑到语言和主题
text: ed.getLang(BUTTONS_MAP[btn] && BUTTONS_MAP[btn][0]),
//图标类自己创建的话则需要注意格式
icon: 'mceIcon mce-i-' + btn,
//执行的命令 闭包传入当前btn
onclick: (function(btn) {
var cmd = BUTTONS_MAP[btn] && BUTTONS_MAP[btn][1];
return function(e) {
ed.execCommand(cmd);
}
})(btn)
});
}
ed.addButton('group' + i, {
type: 'menubutton',
icon: _item.icon || '',
menu: subItem
});
}
return false;
},
注释已经很详细了,就不讲解代码了。
其中的BUTTONS_MAP是我配置的一个title&cmd的map:
// 目前 plugin group支持的一些功能map
var BUTTONS_MAP = {
bold : ['Bold', 'Bold'],
italic : ['Italic', 'Italic'],
underline : ['Underline', 'Underline'],
strikethrough : ['Strikethrough', 'Strikethrough'],
alignleft : ['Align left', 'JustifyLeft'],
aligncenter : ['Align center', 'JustifyCenter'],
alignright : ['Align right', 'JustifyRight'],
alignjustify : ['Alignment', 'JustifyFull'],
bullist : ['Bullet list', 'InsertUnorderedList'],
numlist : ['Numbered list', 'InsertOrderedList'],
outdent : ['Decrease indent', 'Outdent'],
indent : ['Increase indent', 'Indent'],
cut : ['Cut', 'Cut'],
copy : ['Copy', 'Copy'],
paste : ['Paste', 'Paste'],
undo : ['Undo', 'Undo'],
redo : ['Redo', 'Redo'],
link : ['Insert link', 'mceLink'],
unlink : ['Remove link', 'unlink'],
image : ['Insert image', 'mceImage'],
removeformat : ['Clear formatting', 'mceCleanup'],
help : ['help', 'mceHelp'],
code : ['Source code', 'mceCodeEditor'],
hr : ['Horizontal line', 'InsertHorizontalRule'],
superscript : ['Subscript', 'subscript'],
subscript : ['Superscript', 'superscript'],
newdocument : ['New document', 'mceNewDocument'],
blockquote : ['Blockquote', 'mceBlockQuote']
};
以上就是group的使用方式和源码解释,希望能帮到你。
源码托管在github: 点我下载
Tinymce group plugin的更多相关文章
- OpenStack Networking overview
原文地址:http://docs.openstack.org/newton/install-guide-ubuntu/neutron-concepts.html Networking service ...
- 可视化HTML编辑器
[荐] 可视化HTML编辑器 CKEditor CKEditor是新一代的FCKeditor,是一个重新开发的版本.CKEditor是全球最优秀的网页在线文字编辑器之一,因其惊人的性能与可扩展性而广泛 ...
- 开发XMPP IM
Openfire 是一个用Java 实现的XMPP 服务器,客户端可以通过IQ的方式与其进行通信(其实就是XML),客户端和服务器之间的通信是依靠底层Smack 库提供的各种功能来完成的.其实利用插件 ...
- WordPress中添加自定义评论表情包的方法
先来看看效果: 现在由于WordPress版本更新,再加上WordPress主题也越来越多,而现在的主题一般都是禁用了WordPress自带的评论表情,其实自带 的评论表情也是很丑的,但是以前我们可以 ...
- 即时通讯软件openfire+spark+smack
所以我基本上分为三篇文章来介绍此类软件的开发: 第一篇是关于XMPP 协议是啥,IM 是啥以及一个比较有名的开源实现,该开源实现包括三个部分(Spark.Smack和Openfire): 第二篇讲如何 ...
- nuxt Window 或 Document未定义解决方案
概述 在用nuxt开发服务端渲染项目并引入第三方库的时候,经常会遇到window或document未定义的情况,原因是这个第三方库里面用到了window或者document,然后在服务端打包的时候,n ...
- sudoers权限管理
该/etc/sudoers文件的权限管理很完善,覆盖了linux中的各种命令,各种shell.编辑器等等,在此留作以后作为参考. # This file MUST be edited with the ...
- db2配置、db和dbm
----start DB2 可以在四个不同层面配置: 一:系统环境变量(System Environment Variable) 系统环境变量用来配置DB2 的使用环境: 查看:set | grep ...
- Linux访问权限控制及时间同步实践
1.编写脚本/root/bin/checkip.sh,每5分钟检查一次,如果发现通过ssh登录失败 次数超过10次,自动将此远程IP放入Tcp Wrapper的黑名单中予以禁止防问 方式一:脚本+定时 ...
随机推荐
- bootstrap select 学习使用笔记-------选中赋值及change监听丢失
在 bootstrap 和 knockout 共同存在下使用 select 下拉选择插件,发现绑定选项.赋值之后插件不可用了,绑定的监听事件也丢失了.迫不得已在绑定选项值之后再次调用刷新,以及赋值后重 ...
- replace限制文本框只能输入数字,数字和字母等的正则表达式
1.文本框只能输入数字代码(小数点也不能输入) <input onkeyup="this.value=this.value.replace(/\D/g,'')" onafte ...
- 450. Delete Node in a BST
Given a root node reference of a BST and a key, delete the node with the given key in the BST. Retur ...
- cmd命令 启动 和关闭sql服务
(1)在操作系统的任务栏中单击“开始”菜单,选择“运行”命令,在下拉列表框中输入“cmd”命令,单击“确定”按钮. (2)输入如下命令,即可通过SQL Server命令行启动.停止或暂停的服务. SQ ...
- 优秀 H5 案例收集 Vol.2(不定期更新)
上期浏览:Vol.1 再见了,影史最性感的硬汉http://news.163.com/special/fdh5_wolverine/ 活出真我http://balfhcy.pernod-ricard- ...
- 轮询、长轮询、长连接、socket连接、WebSocket
轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接. 优点:后端程序编写比较容易. 缺点:请求中有大半是无用,浪费带宽和服务器资源.(而每一次的 HTTP 请求和应答 ...
- 添加一个vue全局守卫,主要用于用户登录时候验证
//注册一个全局守卫,作用是在路由跳转钱,对路由进行判断,防止未登录用户跳转到其他页面 router.beforeEach((to, from, next) => { let token = l ...
- 单片机、嵌入式CAN通信原理
工作原理: 单片机里内置了一个FIFO(先进先出)芯片,需要发送什么报文,就往这个芯片里写.比如有两个单片机作为CAN节点,A节点往自己的FIFO中写CAN报文,B节点往自己的FIFO中写CAN报文. ...
- javascript-实现简单瀑布流
直接上代码: <style> *{ margin:0; padding:0; } .waterfall_item{ border:solid 3px #ccc; box-shadow:1p ...
- cookie 与 session 的区别详解
[转]cookie 与session 的区别详解 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择,都纪录下来.当 ...