国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 開發(fā) > 綜合 > 正文

HTML編輯器fckeditor代碼語(yǔ)法高亮

2024-07-21 02:53:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
這兩個(gè)星期有點(diǎn)空,就再研究了一下語(yǔ)法高亮的問(wèn)題,找了一下FCKeditor官方網(wǎng)站,發(fā)現(xiàn)2.5.1穩(wěn)定版已經(jīng)出來(lái)了,首先替換掉舊的2.0。呵呵,我喜歡使用新版。
 
先是IE: 
1、遺留的問(wèn)題:隱藏的源碼和格式化后的代碼有會(huì)有問(wèn)題。 
經(jīng)上次研究的結(jié)果,兩處的代碼有可能不對(duì),主要是HTML的特別代碼,像代碼里有標(biāo)簽<div>,JavaScript代碼里有&alt等。這里的解決方法很簡(jiǎn)單:只要替換一下就可以了,不過(guò)要注意,在進(jìn)行格式化之前就進(jìn)行替換。因?yàn)殡[藏的代碼也是要替換的,最后取的時(shí)候也要替換回去,但是要反順序。代碼如下:
復(fù)制代碼代碼如下:

.replace(/&/g, "&") 
.replace(/</g, "<") 
.replace(/>/g,'>'); 

2、在FCKeditor里很多控件都有右鍵菜單可以修改其屬性,代碼高亮我也想增加一個(gè)!到FCKeditor官方網(wǎng)站找了一遍成功的增加了,代碼如下(代碼放在fckplugin.js):
復(fù)制代碼代碼如下:

// 添加右鍵菜單 
FCK.ContextMenu.RegisterListener( { 
AddItems : function( menu, tag, tagName ) 

if (!tag) 
return; 

var oDiv = tag; 

// 循環(huán)的作用看一下代碼就知道了,是為了選擇高亮代碼的最頂層元素 
while (oDiv.parentNode){ 
if (oDiv.tagName == usingTag && oDiv.className == usingFlag) 
break; 
oDiv = oDiv.parentNode; 


// under what circumstances do we display this option 
if ( oDiv.tagName == usingTag && oDiv.className == usingFlag )//&& (tag._FCKHighLighter || tag.parentElement._FCKHighLighter) ) 

FCKSelection.SelectNode( oDiv ) ; 
// when the option is displayed, show a separator the command 
menu.AddSeparator() ; 
// the command needs the registered command name, the title for the context menu, and the icon path
menu.AddItem( 'HighLighter', FCKLang['DlgSyntaxHighLighterProperty'], oHighLighterItem.IconPath ) ; 

}} 
); 

3、試用了一下效果,發(fā)現(xiàn)雙擊修改時(shí)只能雙擊代碼行數(shù)左邊的灰色才能彈出修改。我覺(jué)得不大方便,如果雙擊代碼處也可以彈出修改就方便多了!嘿嘿,答案是肯定的,之前的代碼已經(jīng)注冊(cè)了DIV標(biāo)簽的雙擊事件,所以再注冊(cè)一下格式化后的代碼用到的SPAN和LI標(biāo)簽就可以了,代碼如下(代碼放在fckplugin.js): 
復(fù)制代碼代碼如下:

// 添加雙擊事件 
FCK.RegisterDoubleClickHandler( FCKHighLighter.OnDoubleClick, usingTag ) ; // 雙擊灰色欄 
FCK.RegisterDoubleClickHandler( FCKHighLighter.OnDoubleClick, 'SPAN' ) ; // 雙擊代碼 
FCK.RegisterDoubleClickHandler( FCKHighLighter.OnDoubleClick, 'LI' ) ; // 雙擊代碼區(qū)空白 
// 添加雙擊事件 
FCK.RegisterDoubleClickHandler( FCKHighLighter.OnDoubleClick, usingTag ) ; // 雙擊灰色欄 
FCK.RegisterDoubleClickHandler( FCKHighLighter.OnDoubleClick, 'SPAN' ) ; // 雙擊代碼 
FCK.RegisterDoubleClickHandler( FCKHighLighter.OnDoubleClick, 'LI' ) ; // 雙擊代碼區(qū)空白 

4、再試一下,發(fā)現(xiàn)雙擊代碼行數(shù)這里可以進(jìn)行修改。但是雙擊代碼就不行,拿不到隱藏的源碼。原因是因?yàn)樵诖a里雙擊的不是頂層元素,那簡(jiǎn)單,修改一下雙擊的代碼,取得頂層元素就OK了(代碼放在fckplugin.js): 
復(fù)制代碼代碼如下:

/ /雙擊事件處理代碼 
FCKHighLighter.OnDoubleClick = function( div ){ 
var oDiv = div; 

// 循環(huán)的作用看一下代碼就知道了,是為了選擇高亮代碼的最頂層元素 
while (oDiv.parentNode){ 
if (oDiv.tagName == usingTag && oDiv.className == usingFlag) 
break; 
oDiv = oDiv.parentNode; 


if(oDiv.tagName == usingTag && oDiv.className == usingFlag) { 
FCKSelection.SelectNode( oDiv ) ; 
FCKCommands.GetCommand( 'HighLighter' ).Execute() ; 

}

5、把編輯轉(zhuǎn)到源代碼再轉(zhuǎn)回來(lái)的時(shí)候發(fā)現(xiàn)高亮的代碼已經(jīng)不可以編輯了。研究之下發(fā)現(xiàn)是用于標(biāo)識(shí)的屬性沒(méi)有了,因?yàn)檫@個(gè)標(biāo)識(shí)的屬性是非標(biāo)準(zhǔn)的HTML屬性。這個(gè)也好辦,反正頂層的class屬性沒(méi)用,就直接拿來(lái)用就可以了。這個(gè)簡(jiǎn)單,我就不給代碼了。 
IE里的修改算是完成了,而且比較完美。 
再來(lái)FF: 
  本人用系統(tǒng),用軟件都用得比較雜,有時(shí)候會(huì)用用FF,所以修改的東西一定要支持FF。再說(shuō),F(xiàn)CKeditor本身是兼容IE和FF的,增加的插件只支持IE有點(diǎn)說(shuō)不過(guò)去。 
1、首先試用了一下效果:發(fā)現(xiàn)已經(jīng)可以插入,不過(guò)不可以修改。雙擊事件也有效,但也是不能修改。這個(gè)原因是因?yàn)镕F跟IE不同,IE里可以把DIV標(biāo)簽直接選擇,F(xiàn)F里不可以。所以要加一個(gè)單擊的事件,讓代碼幫助FF選擇頂層元素,原始代碼是從FCKeditor的Placeholder插件里COPY過(guò)來(lái)的(代碼放在fckplugin.js): 
復(fù)制代碼代碼如下:

// 單擊事件處理代碼 
FCKHighLighter._ClickListener = function( e ) 

var oDiv = e.target; 

// 循環(huán)的作用看一下代碼就知道了,是為了選擇高亮代碼的最頂層元素 
while (oDiv.parentNode){ 
if (oDiv.tagName == usingTag && oDiv.className == usingFlag) 
break; 
oDiv = oDiv.parentNode; 


if ( oDiv.tagName == usingTag && oDiv.className == usingFlag ) 
FCKSelection.SelectNode( oDiv ) ; 


FCKHighLighter._SetupClickListener = function (){ 
if (FCKBrowserInfo.IsGecko) 
FCK.EditorDocument.addEventListener( 'click', FCKHighLighter._ClickListener, true ) ; 


// 添加單擊事件 
FCK.Events.AttachEvent( 'OnAfterSetHTML', FCKHighLighter._SetupClickListener ) ; 

// 添加右鍵菜單 
FCK.ContextMenu.RegisterListener( { 
AddItems : function( menu, tag, tagName ) 

if (!tag) 
return; 

var oDiv = tag; 

// 循環(huán)的作用看一下代碼就知道了,是為了選擇高亮代碼的最頂層元素 
while (oDiv.parentNode){ 
if (oDiv.tagName == usingTag && oDiv.className == usingFlag) 
break; 
oDiv = oDiv.parentNode; 


// under what circumstances do we display this option 
if ( oDiv.tagName == usingTag && oDiv.className == usingFlag )//&& (tag._FCKHighLighter || tag.parentElement._FCKHighLighter) ) 

FCKSelection.SelectNode( oDiv ) ; 
// when the option is displayed, show a separator the command 
menu.AddSeparator() ; 
// the command needs the registered command name, the title for the context menu, and the icon path
menu.AddItem( 'HighLighter', FCKLang['DlgSyntaxHighLighterProperty'], oHighLighterItem.IconPath ) ; 

}} 
); 

注明:這個(gè)需要修改FCKeditor的核心代碼,因?yàn)槲野l(fā)現(xiàn)在2.5.1版本在FF下不可以修改選擇的元素,但是最新的2.6測(cè)試版就可以。所以需要修改_source/internals/fckselection_gecko.js文件里的GetSelectedElement函數(shù),并且使用官方工具fckpackager.exe重新打包JavaScript代碼,這個(gè)我有空再寫一下。 
  到這里已經(jīng)差不多了,其中還有一些小問(wèn)題沒(méi)有說(shuō),例如:高亮的代碼里可以直接修改(為標(biāo)簽增加一個(gè)contentEditable='false'就完了),JS代碼兼容要使用parentNode不要使用parentElement等。 
  本來(lái)想在添加代碼的窗口也增加一個(gè)實(shí)時(shí)語(yǔ)法高亮的編輯器,不過(guò)上網(wǎng)找了一下用得比較多的CodePress和EditArea都存在一些BUG,特別是在IE7下,所以還是暫時(shí)不添加了。日后再修改。 
  增加這個(gè)插件修改的容易比較多,如果你遇到什么問(wèn)題可以留言,我會(huì)盡力為你解答。 
  下一步再為FCKeditor增加一個(gè)在線上傳圖片的插件,這樣在別處轉(zhuǎn)載文章時(shí)就方便多了,點(diǎn)一下就可以自動(dòng)上傳所有圖片,哈哈哈。。。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到編輯器頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 山东| 于田县| 通道| 梁河县| 千阳县| 新乡县| 巍山| 奉节县| 乐安县| 延吉市| 石阡县| 六盘水市| 喀喇沁旗| 佳木斯市| 齐河县| 兴安县| 岳阳市| 鱼台县| 赤壁市| 丹凤县| 县级市| 会昌县| 温州市| 莲花县| 邛崃市| 绥阳县| 杭锦后旗| 普宁市| 中宁县| 马公市| 喀什市| 阳春市| 乐陵市| 阜平县| 阿坝县| 宁海县| 乌拉特中旗| 海宁市| 平顺县| 兴安盟| 平谷区|