UEditor 如何进行二次开发
背景
UEditor雖然功能眾多,但對(duì)于廣大開(kāi)發(fā)者來(lái)說(shuō),還是有很多定制化的功能需求,如果都靠UEditor團(tuán)隊(duì)自己開(kāi)發(fā)那是不現(xiàn)實(shí)的,這時(shí)就需要廣大開(kāi)發(fā)者在UEditor的基礎(chǔ)上自己開(kāi)發(fā)定制功能。但在之前的版本中,UEditor對(duì)于二次開(kāi)發(fā)的支持不夠優(yōu)化,經(jīng)常需要開(kāi)發(fā)者不僅要開(kāi)發(fā)相應(yīng)的功能,例如command命令,plugin插件等,還要在UEditor上修改多處文件,例如,添加按鈕,添加樣式等等,才能將功能添加到UEditor中。這樣的方式對(duì)于以后的升級(jí)和后續(xù)定制功能的維護(hù),都會(huì)造成維護(hù)困難的問(wèn)題。介于次,UEditor從1.4.1開(kāi)始,添加對(duì)于二次開(kāi)發(fā)的擴(kuò)展支持。
二次開(kāi)發(fā)方式
無(wú)需對(duì) UEditor 代碼做任何修改,只需在UEditor之外通過(guò)UEditor提供的二次開(kāi)發(fā)接口開(kāi)發(fā)定制功能.這種開(kāi)發(fā)方式不僅避免了修改UEditor源碼,方便日后UEditor的升級(jí),而且通過(guò)接口,可以將開(kāi)發(fā)的定制功能維護(hù)到一個(gè)文件中或者一個(gè)目錄中,方便日后對(duì)其維護(hù)。
部署定制功能
對(duì)于 UEditor 的二次開(kāi)發(fā),一般多為添加按鈕,下拉筐或者是添加一個(gè)dialog?;谶@幾種常規(guī)的方式,我在_examples目錄下分別書(shū)寫了3個(gè)類型的定制demo。
除了添加彈出層需要一個(gè)而外的html頁(yè)面外,對(duì)于需要添加和修改的功能代碼全部都維護(hù)到一個(gè)js文件中了。
使用文件的方式:
<script type="text/javascript" charset="utf-8" src="../ueditor.config.js"></script> <script type="text/javascript" charset="utf-8" src="editor_api.js"> </script> <script type="text/javascript" charset="utf-8" src="../lang/zh-cn/zh-cn.js"></script> <!--添加按鈕--> <script type="text/javascript" charset="utf-8" src="addCustomizeButton.js"></script>新添加的按鈕就完成了。實(shí)例化編輯器時(shí),無(wú)需再而外添加任何代碼。
開(kāi)發(fā)細(xì)節(jié)
前面講了如何部署你的功能,這個(gè)小節(jié)來(lái)和大家講一下,UEditor提供那些接口,讓大家可以在編輯器之外擴(kuò)展你的功能。
UE.registerUI('uiname', function(editor, uiname) {//do something }, [index, [editorId]]);考慮到大家的功能基本上都會(huì)擴(kuò)展一個(gè)UI和這個(gè)UI做的事情,所以UEditor提供了registerUI這個(gè)接口,可以讓開(kāi)發(fā)者動(dòng)態(tài)的注入擴(kuò)展的內(nèi)容。
添加按鈕
添加一個(gè)按鈕
UE.registerUI('button', function(editor, uiName) {//注冊(cè)按鈕執(zhí)行時(shí)的command命令,使用命令默認(rèn)就會(huì)帶有回退操作editor.registerCommand(uiName, {execCommand: function() {alert('execCommand:' + uiName)}});//創(chuàng)建一個(gè)buttonvar btn = new UE.ui.Button({//按鈕的名字name: uiName,//提示title: uiName,//添加額外樣式,指定icon圖標(biāo),這里默認(rèn)使用一個(gè)重復(fù)的iconcssRules: 'background-position: -500px 0;',//點(diǎn)擊時(shí)執(zhí)行的命令onclick: function() {//這里可以不用執(zhí)行命令,做你自己的操作也可editor.execCommand(uiName);}});//當(dāng)點(diǎn)到編輯內(nèi)容上時(shí),按鈕要做的狀態(tài)反射editor.addListener('selectionchange', function() {var state = editor.queryCommandState(uiName);if (state == -1) {btn.setDisabled(true);btn.setChecked(false);} else {btn.setDisabled(false);btn.setChecked(state);}});//因?yàn)槟闶翘砑觔utton,所以需要返回這個(gè)buttonreturn btn; });添加多個(gè)
UE.registerUI('bold italic redo undo underline strikethrough', function(editor, uiName) {//注冊(cè)按鈕執(zhí)行時(shí)的command命令,使用命令默認(rèn)就會(huì)帶有回退操作editor.registerCommand(uiName, {execCommand: function() {alert('execCommand:' + uiName)}});//創(chuàng)建一個(gè)buttonvar btn = new UE.ui.Button({//按鈕的名字name: uiName,//提示title: uiName,//添加額外樣式,指定icon圖標(biāo),這里默認(rèn)使用一個(gè)重復(fù)的iconcssRules: 'background-position: -500px 0;',//點(diǎn)擊時(shí)執(zhí)行的命令onclick: function() {//這里可以不用執(zhí)行命令,做你自己的操作也可editor.execCommand(uiName);}});//當(dāng)點(diǎn)到編輯內(nèi)容上時(shí),按鈕要做的狀態(tài)反射editor.addListener('selectionchange', function() {var state = editor.queryCommandState(uiName);if (state == -1) {btn.setDisabled(true);btn.setChecked(false);} else {btn.setDisabled(false);btn.setChecked(state);}});//因?yàn)槟闶翘砑觔utton,所以需要返回這個(gè)buttonreturn btn; });在完整版本的下載包里,我寫了3個(gè)例子,添加一個(gè)按鈕,下拉筐,彈出一個(gè)浮層,大家可以參考
總結(jié)
之前UEditor對(duì)于第三方的開(kāi)發(fā)確實(shí)支持的不夠靈活,導(dǎo)致為了開(kāi)發(fā)還要污染UEditor本身,這為后學(xué)升級(jí)添加了麻煩。當(dāng)然現(xiàn)在這個(gè)設(shè)計(jì)可能還有考慮不到的地方,大家可以直接發(fā)issue給我們,我們會(huì)進(jìn)行及時(shí)的補(bǔ)丁,并在后續(xù)的版本中更新。
總結(jié)
以上是生活随笔為你收集整理的UEditor 如何进行二次开发的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Confluence wiki 使用记录
- 下一篇: SQLserver2008高级查询语句应