当前位置: 首页 > 编程日记 > 正文

一步步教你编写redactor的插件

Redactor是一款JQuery框架下的所见即所得在线HTML编辑器,具有常用的功能如图片/文件上传、表格、格式化等等,不仅轻量级和跨浏览器,还支持各种平台如PC、Mac、iPad, iPhone、Android、Refrigerators,更重要的它能够自动保存、自动调整大小,还有一套API。

准备说明

我们就以表情插件为例,看展示下它的插件编写。首先准备好表情图片,放在目录的img文件夹,请查看示例包。

使用redactor只需要引用redactor.js和redactor.css即可,所以我们的示例直接应用谷歌的JQuery库以及redactor官方的redactor.js和redactor.css。如果你不愿意可以直接把js和css另存在本地也行。或许你会问它的背景图片不需要了吗?这就是我认为它有意思的地方,它的背景是:

这张背景图片被base64编码后放在了redactor.js文件中了。如果不喜欢放在脚本,可以把图片另存即可。redactor.js一大段乱码看起来也蛮不爽的。

演示的HTML页面

我们HTML页面命名为index.html,代码如下:

<!DOCTYPE html>
<html>
<head>	<title>第一个redactor插件</title><meta charset="utf-8"><link rel="stylesheet" href="http://imperavi.com/js/redactor/redactor.css" />	  
</head>
<body>		
</body>
</html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
<script src="http://imperavi.com/js/redactor/redactor.js"></script> 

制作插件

下面我们来制作插件,其实制作插件的官方文档说的蛮详细的,可以去了解下。我们制作这个插件主要步骤:

  1. 添加表情按钮到toolbar;
  2. 点击表情按钮弹出表情列表窗口;
  3. 选择表情并把表情插入编辑器中;

插件的基本格式

if (typeof RedactorPlugins === 'undefined') var RedactorPlugins = {}; 
RedactorPlugins.plginname = { init: function(){//....}
}
  • init 为redactor初始化回调函数;
  • plginname为插件名称;

插件的脚本文件

在实际使用redactor中可能制作的插件比较多,所以我们把插件都放在一个js文件中,命名为redactor-plugin.js.

我们制作的表情插件名命名为:smile,所以redactor-plugin.js文件内容如下:

if (typeof RedactorPlugins === 'undefined') var RedactorPlugins = {}; 
RedactorPlugins.smile = { init: function(){//....}
}

添加表情按钮到toolbar

添加自定义按钮到toolbar,需要用到redactor的插件API:addBtn,声明如下:

this.addBtn(button_key, button_title, function(redactor_object, event, button_key) { callback; });
  • button_key 是按钮key,不可见;
  • button_title 是按钮名称,鼠标悬停显示;
  • redactor_object是redactor对象,event是事件对象,button_key是按钮key;
  • callback为回调函数;

redactor-plugin.js文件内容如下:

if (typeof RedactorPlugins === 'undefined') var RedactorPlugins = {}; 
RedactorPlugins.smile = { init: function(){this.addBtn('smile', '表情', function(redactor_object, event, button_key) {})}
}

加载redactor及其插件

插件制作完成,就应该把插件加载到redactor中了,所以index.html的HTML代码如下:

<!DOCTYPE html>
<html>
<head>	<title>第一个redactor插件</title><meta charset="utf-8"><link rel="stylesheet" href="http://imperavi.com/js/redactor/redactor.css" />	
</head>
<body><textarea id="redactor" name="content"><h2>Hello and Welcome</h2><p>我是osEye</p><p>如果12是个循环的话,13就是新的开始....</p></textarea>
</body>
</html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
<script src="http://imperavi.com/js/redactor/redactor.js"></script>  
<script src="redactor-plugin.js"></script>  
<script type="text/javascript">
$(document).ready(function(){var buttons = ['formatting', '|', 'bold', 'italic', 'fullscreen'];$('#redactor').redactor({ plugins: ['smile']});}
);
</script>

添加了一个id为redactor的textarea,用于redactor编辑器的归宿,在脚本中加载redactor。脚本放置文档底部是为了满足那啥的性能优化规则,哈哈。

添加CSS显示toolbar按钮

此刻打开index.html应该看到表情按钮啦吧?!

No,你还看不到,因为toolbar的按钮都是背景图展示的,而且CSS有一定的规则:

body .redactor_toolbar li a.redactor_btn_按钮key  {background: url(图片地址) no-repeat;
}

背景图是25x25px的图片,我这里就随意用表情图片做背景图了,你在实际应用中肯定用精美的图片。所以在index.html中必须加上样式,实际应用中CSS文件最好也独立成文件,我这里只是示例,所以我直接放在index.html文档中了,现在的index.html的HTML代码如下:

<!DOCTYPE html>
<html>
<head>	<title>第一个redactor插件</title><meta charset="utf-8"><link rel="stylesheet" href="http://imperavi.com/js/redactor/redactor.css" />	<style type="text/css">body .redactor_toolbar li a.redactor_btn_smile  {background: url(img/tootha.gif) no-repeat;}</style>
</head>
<body><textarea id="redactor" name="content"><h2>Hello and Welcome</h2><p>我是osEye</p><p>如果12是个循环的话,13就是新的开始....</p></textarea>
</body>
</html>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js"></script>
<script src="http://imperavi.com/js/redactor/redactor.js"></script>  
<script src="redactor-plugin.js"></script>  
<script type="text/javascript">
$(document).ready(function(){var buttons = ['formatting', '|', 'bold', 'italic', 'fullscreen'];$('#redactor').redactor({ plugins: ['smile']});}
);
</script>

现在可以看到表情按钮了吧^_^。

添加点击按钮回调事件,弹出表情列表

redactor中有调用模态窗口的插件API:

this.modalInit(title, elment, width, callback);
  • title 为窗口名称;
  • elment HTML内容或HTML元素Id事件;为HTML元素ID时,窗口自动把ID的HTML填充到窗口中;
  • width 为窗口的宽度;
  • callback 为回调函数;

redactor-plugin.js文件内容如下:

if (typeof RedactorPlugins === 'undefined') var RedactorPlugins = {}; 
RedactorPlugins.smile = { init: function(){this.addBtn('smile', '表情', function(redactor_object, event, button_key) {var callback = $.proxy(function(){$('#face').find('img').each(function(){$(this).click(function(){redactor_object.insertHtml('<img src="'+$(this).attr('src')+'">');	redactor_object.modalClose();})});}, redactor_object);redactor_object.modalInit('表情', '<div id="face"><img src="img/sada.gif"> <img src="img/smilea.gif"> <img src="img/yalishanda.gif"> <img src="img/yw.gif"> <img src="img/sada.gif"> <img src="img/yx.gif"> <img src="img/tootha.gif"></div>', 500, callback);})}
}

效果图

源码下载请点击这里

转载于:https://www.cnblogs.com/zhaiqianfeng/archive/2013/01/09/4618348.html

相关文章:

windows系统杀掉explorer.exe进程后黑屏

使用“Ctrl Shift ESC”打开任务管理器 文件----> 运行新任务---->运行explorer即可 转载于:https://www.cnblogs.com/mrnx2004/p/11065573.html

php 自动返回,PHP实现自动识别Restful API的返回内容类型

如题&#xff0c;PHP如何自动识别第三方Restful API的内容&#xff0c;自动渲染成 json、xml、html、serialize、csv、php等数据&#xff1f;其实这也不难&#xff0c;因为Rest API也是基于http协议的&#xff0c;只要我们按照协议走&#xff0c;就能做到自动化识别 API 的内容…

WebKit、Gecko使用图形库

2008年11月30日 星期日 上午 01:20阅读了之后&#xff0c;觉得作为浏览器内核WebKit、Gecko&#xff0c;为了能高效美观的显示页面的内容&#xff0c;选择适当的图形库非常重要。如果图形库选择不当&#xff0c;往往会导致页面上显示的文字、图片不美观&#xff0c;看起来总让人…

office使用技巧

Word绝招:一、 输入三个“”&#xff0c;回车&#xff0c;得到一条双直线&#xff1b;二、 输入三个“~”&#xff0c;回车&#xff0c;得到一条波浪线&#xff1b;三、 输入三个“*”或 “-”或 “#”&#xff0c;回车&#xff0c;惊喜多多&#xff1b;在单元格内输入now&…

怎样用matlab打开mw文,C# matlab混合编程 MWArray使用笔记

C# matlab混合编程徐凯Email&#xff1a;xukai19871105http://www.doczj.com/doc/1a6e191fff00bed5b9f31dbf.html这几天突然想搞一搞以前没有搞定的MATLABC#混合编程&#xff0c;今天把原来编写的代码拿出来看看&#xff0c;然后结合网上一些正确的和一些错误的代码看看&#x…

【Android OpenGL ES】阅读hello-gl2代码(二)Java代码

AndroidManifest.xml <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.android.gl2jni"><applicationandroid:label"string/gl2jni_ac…

activiti任务TASK

一、概要 设计TASK的表主要是&#xff1a;ACT_RU_TASK&#xff0c;ACT_HI_TASKINST&#xff08;见参考-activiti表&#xff09;&#xff1b;任务主要有&#xff1a;人工任务&#xff08;usertask&#xff09;,服务任务&#xff08;servicetask&#xff09;等&#xff1b;候选人…

matlab数值分析拟合实例,数值分析函数拟合matlab代码.doc

数值分析函数拟合matlab代码.doc 第一题MATLAB代码用SPLINE作图XI0204060810YI098092081064038X10012Y1NEWTON3XI,YI,X源代码见M文件Y2SPLINEXI,YI,XPLOTXI,YI, O ,X,Y1, R ,X,Y2, K 用CSAPE作图XI0204060810YI098092081064038X10012Y1NEWTON3XI,YI,X源代码见M文件PPCSAPEXI,YI…

ArrayList Iterator remove java.lang.UnsupportedOperationException

在使用Arrays.asList()后调用add&#xff0c;remove这些method时出现 java.lang.UnsupportedOperationException异常。这是由于Arrays.asList() 返回java.util.Arrays$ArrayList&#xff0c; 而不是ArrayList。Arrays$ArrayList和ArrayList都是继承AbstractList&#xff0c;rem…

android中方法调用super(..)的相关知识

java中的多态有重写 方法被子类重写后 父类的原方法就会被隐藏 当你又需要调用父类所定义的原方法 这个时候就可以用super来调用super调用指向了父类&#xff0c;在一些调用里可以很巧妙的利用&#xff0c;比如监听返回键了在onKeyDown的方法里&#xff0c;如果想让系统对back…

在使用Reference Source调试.Net 源代码时如何取消optimizations(代码优化)-翻译

当你在使用Reference Source functionality in VS 2008 调试.Net 的源代码的时候&#xff0c;你会发现很多变量没法再调试时查看。 这是因为源代码服务器上提供的代码默认是为最终销售优化过的&#xff08;optimized &#xff09;。这些值虽然你没法查看&#xff0c;但不会阻断…

java旅游网站毕业论文,基于JAVA技术的旅游网站的开发.doc

摘要: 这次毕设主要是为了实现基于JAVA技术的旅游网站的开发&#xff0c;方便人们近距离的出行游玩。网站的开发过程中用到了很多方法技术&#xff0c;最主要的是JAVA技术&#xff0c;用于编写后台的功能实现代码&#xff1b;框架采用的是Spring MVC&#xff0c;作为轻量级企业…

Spring 实践 -IoC

Spring 实践标签&#xff1a; Java与设计模式 Spring简介 Spring是分层的JavaSE/EE Full-Stack轻量级开源框架.以IoC(Inverse of Control 控制反转)和AOP(Aspect Oriented Programming 面向切面编程)为内核, 取代EJB的臃肿/低效/脱离现实. 主页http://spring.io/ IoC与DI IOC…

大话编程(一)

2013年1月15日 11:40:38 还有20分钟下班,实在忍不住了,想说点儿什么 编程入门的可以看看 (一)什么是0什么是1 有那么一堆叫半导体的东西,某个牛逼人用铜线连起来,组成了一个电路. 这个电路在一直通电的情况下,可以使某个点的电压保持不变, 如果这个点的电压大于某个值,就抽象为…

php 保存表单数据,使用jquery和php自动保存表单数据

我对PHP非常好,但是使用jQuery的总菜单,并且卡在自动保存表单数据中.自动保存功能在dummy.php中每30秒调用一次.我正在将用于处理的序列化表单数据( – >数据库)发送到savetest.php.此刻,我坚持这个问题&#xff1a;如何让savetest.php“监听”传入的数据并对其作出反应&…

Finalize/Dispose/Destructor

我总是会搞混这些东西&#xff0c;还是写下来帮助记忆。 Finalize 即Object.Finalize()&#xff0c;C#中不允许使用Finalize&#xff0c;析构器就等价于Finalize。 Destructor 析构器&#xff08;Destructor&#xff09;是在对象没有被引用的时候&#xff0c;由CLR自动调用的。…

linux 串口minicom配置使用

在minicom -s配置是记得取消硬件流控制。 1.minicom -o 配置文件 2.alias comminicom -o 配置文件 转载于:https://www.cnblogs.com/niceskyfly/p/5257713.html

POJ-1185 炮兵阵地 动态规划+状态压缩

由于递推的时候依赖于三个连续层的关系.一开始想着直接三重for循环,但是这里有个问题就是上一层的0位置上包括着上上层是0和1两种可能,而后者又对当前行有约束,因此该方法不行.当然有一个办法就是增加状态数,让状态能够表示是从1还是从0转移过来的.(这题有个解法是采用多进制的…

php字符串转换表达式,php处理字符串格式的计算表达式

有时候我们对每一种产品都有一个提成公式&#xff0c;而这个计算提成的公式是以字符串格式存在表中的当我们用这个计算公式时&#xff0c;他并不像我们写的&#xff1a;$a23*5;这样简单的能计算出结果&#xff0c;而它是个字符串所以&#xff0c;我们就必须把字符串转化为我们能…

JS函数式编程【译】5.2 函子 (Functors)

函子&#xff08;Functors&#xff09; 态射是类型之间的映射&#xff1b;函子是范畴之间的映射。可以认为函子是这样一个函数&#xff0c;它从一个容器中取出值&#xff0c; 并将其加工&#xff0c;然后放到一个新的容器中。这个函数的第一个输入的参数是类型的态射&#xff0…

[转]Introduction of iSCSI Target in Windows Server 2012

Introduction of iSCSI Target in Windows Server 2012 源地址&#xff1a;http://blogs.technet.com/b/filecab/archive/2012/05/21/introduction-of-iscsi-target-in-windows-server-2012.aspx The iSCSI Target made its debut as a free download for Windows 2008 R2 in A…

全国移动联通基站数据升级包(2013年1月基站升级包).rar

“全国移动联通基站数据升级包(2013年1月基站升级包).rar” 已经上传到CNBLOGS 地址&#xff1a;http://files.cnblogs.com/topwang-com/%E5%85%A8%E5%9B%BD%E7%A7%BB%E5%8A%A8%E8%81%94%E9%80%9A%E5%9F%BA%E7%AB%99%E6%95%B0%E6%8D%AE%E5%8D%87%E7%BA%A7%E5%8C%85(2013%E5%B9%…

php自动计算增长率,如何写sql计算增长率?

问题已有数据表(假定表名为t)time sale1999 4844904672000 651413668.92001 13713710082002 18177416252003 25053320952004 37654384862005 48177203842006 6083322598需要产生如下的数据表time sale …

我先了解一下博客园创建随笔/文章/日记的过程与三者的区别(隐私等级,是否审核等)...

我先了解一下博客园创建随笔/文章/日记的过程与三者的区别(隐私等级,是否审核等)转载于:https://www.cnblogs.com/Totooria-Hyperion/p/5260289.html

构建Java并发模型框架

2002 年 2 月 22 日 Java的多线程特性为构建高性能的应用提供了极大的方便&#xff0c;但是也带来了不少的麻烦。线程间同步、数据一致性等烦琐的问题需要细心的考虑&#xff0c;一不小心就会出现一些微妙的&#xff0c;难以调试的错误。另外&#xff0c;应用逻辑和线程逻辑纠缠…

Unity Note 1

1.把开始时间设定到播放完成的时间点&#xff0c;作为倒放的起点 animation["clip"].timeanimation["clip"].clip.length; animation["clip"].speed-1; animation.Play("clip"); 2.寻找场景中物体var door GameObject.Find(…

基于matlab的硅晶体模型,基于Matlab的图像处理技术识别硅太阳电池的缺陷

第 44 卷 第 7 期  2010 年 7 月 上 海 交 通 大 学 学 报 JOURNAL OF SHANGHAI J IAOTON G UNIVERSITY Vol. 44 No. 7   Jul. 2010   收稿日期 :20090908 作者简介 :柳效辉(19852) ,男 ,江西九江人 ,硕士生 ,主要从事光伏检测与光伏系统方面的研究. 徐  林(联系人) ,男 ,副…

spark- PySparkSQL之PySpark解析Json集合数据

PySparkSQL之PySpark解析Json集合数据 数据样本 12341234123412342|asefr-3423|[{"name":"spark","score":"65"},{"name":"airlow","score":"70"},{"name":"flume",&quo…

cmd库的导入Java,在cmd命令窗口导入第三方jar包来运行java文件

在cmd命令窗口导入第三方jar包来运行java文件&#xff0c;以下测试都是基于window环境&#xff0c;Linux环境没有测试。1、编译使用命令javac -cp或者javac -classpath本机测试&#xff1a;如下图所示&#xff0c;java文件路径为D:\workspace\demo,StringUtilsTest.java依赖了第…

JQuery 动态创建表单,并自动提交

前言&#xff1a;写这个是为了实现使用cookie进行自动登录的功能&#xff0c; 下面的代码是一个元素一个元素进行创建和赋值的&#xff0c; (可以尝试下将所有的html代码(form、input&#xff09;全部拼好以后放到${ } 中&#xff0c;再进行提交。) submit的时候注意下写法&…