自己打造HTML在線編輯器的實現(xiàn)難點分析
HTML在線編輯器實際上是什么
其實有好幾種實現(xiàn)方式,目前用得最多、兼容性最好的還是iframe方式。
<iframe src="" frameborder="0"></iframe>
只有這個空iframe是不行的,還要用Javascript把它設(shè)成可編輯:
iframe.contentWindow.document.designMode = "on";
iframe.contentWindow.document.contentEditable = true;
換而言之,HTML在線編輯器就是一個可編輯的iframe。
加粗、斜體、下劃線、加鏈接等功能如何實現(xiàn)
瀏覽器已經(jīng)提供了實現(xiàn)這些功能的接口execCommand:
iframe.contentWindow.document.execCommand(cmd, isDefaultShowUI, value);
這三個參數(shù)的意思分別是:
- cmd:命令文本,有好多,IE的可以看這里,F(xiàn)irefox的可以看這里。
- isDefaultShowUI:是否默認顯示交互界面,比如加鏈接的時候,可以通過界面填入鏈接。不過這個參數(shù)存在兼容性問題,一般設(shè)為false將其禁用,并另外制作交互界面。
- value:傳入的值,某些命令可以省略。
execCommand的問題是,生成的代碼可能不標(biāo)準(zhǔn),比如在IE下,文字加粗用的是b標(biāo)簽而不是strong標(biāo)簽。
交互問題
用戶不可能總是在編輯器中輸入,比如加粗、插入圖片等功能是通過按鈕操作的。假設(shè)用戶要加粗一段選中的文字,當(dāng)他按了加粗按鈕后,選區(qū)以及焦點也會跟著跑到那去,因此選區(qū)(選中的文字)丟失,操作也就無法完成;同理,插入圖片時插入位置也會丟失。
也就是說,要保存最后出現(xiàn)在編輯器中的選區(qū)。我采取的方案是,當(dāng)焦點在編輯器內(nèi)的時候,用一個定時器(setInterval)定時獲取當(dāng)前選區(qū)。選區(qū)編程平時很少用,做起來也有很多兼容性問題,主要是參考微軟的MSDN(TextRange ControlRange)和Mozilla的MDC(Range Selection)了。
回車問題
在IE下,按回車是換段落,生成<p>,但在Firefox下是換行,生成的是<br>。要解決這個問題,就要監(jiān)聽keydown事件,如果檢測到按鍵是回車,就插入“<p></p>”。
獲取標(biāo)準(zhǔn)的代碼
如何獲取編輯的內(nèi)容呢?這個問題很簡單,只要獲取iframe頁面body中的innerHTML就可以了:
var content = iframe.contentWindow.document.body.innerHTML;
然而,IE下的innerHTML非常不標(biāo)準(zhǔn):標(biāo)簽名是大寫的,屬性沒有引號包起來,單標(biāo)簽也沒有結(jié)束符……即便是Firefox下獲取的代碼,也有少量瑕疵。這個時候就要用正則表達式對代碼進行標(biāo)準(zhǔn)化處理。
總結(jié)
不多說了,做一遍HTML編輯器,你就會知道CKEditor是多么強大。
相關(guān)文章
Fckeditor編輯器內(nèi)容長度限制統(tǒng)計實現(xiàn)方法
Fckeditor是一種大家常用的編輯器,但是他不能像網(wǎng)頁表單那樣利用document.getelementbyid能獲取得到值了,它必須通過 FCKeditorAPI來操作,下面看看Fckeditor內(nèi)容長度測試2012-03-03
asp.net+FCKeditor上傳圖片顯示叉叉圖片無法顯示的問題的解決方法
今天用FCKeditor上傳圖片的時候,圖片可以上傳成功,可是預(yù)覽的時候卻顯示個叉叉,前臺也是顯示不出來,原來服務(wù)器需要配置下。2011-07-07
ie9后瀏覽器fckeditor無法上傳圖片、彈出浮層內(nèi)容不顯示的解決方法
升級到IE9后,fckeditor在IE9里的彈出浮動層會出現(xiàn)bug,里面的內(nèi)容不會出現(xiàn)。原因是IE9不支持var $=document.getElementById;這樣的寫法了2014-01-01
讓谷歌瀏覽器Google Chrome支持eWebEditor的方法
這篇文章主要介紹了讓谷歌瀏覽器Google Chrome支持eWebEditor的方法,默認情況是不顯示的, 還需要安裝組件2016-01-01
FCKEditor常用Js代碼,獲取FCK內(nèi)容,統(tǒng)計FCK字數(shù),向FCK寫入指定代碼
FCKEditor常用Js代碼,獲取FCK內(nèi)容,統(tǒng)計FCK字數(shù),向FCK寫入指定代碼,使用FCKEditor的朋友可以參考下。增加編輯器的人性化功能。2010-04-04

