以HTMLEditor爲例講解在線編輯器的基本實現原理

如今網上多數的編輯器都有很強大的功能,相對而言,在使用中也需要很多的配置,當然代碼也自然會比較“臃腫”。如果我們並不需要功能那麼強大的編輯器,那麼可以自己實現一個,因爲代碼並不複雜。下面是一點個人的經驗,僅供參考(以ExtJS的HTMLEditor爲例)。

      1、初始化。當頁面加載完畢後,向頁面添加一個IFrame(可選)。這裏要注意的是,要判斷頁面的狀態,要等頁面完全加載完畢後再進行操作,防止出現找不到某些元素的錯誤。

      2、打開編輯功能。將IFrame設爲可以編輯(下面代碼來自ExtJS的HTMLEditor):

     // 獲取iframe的window對象
getWin : function(){
        return Ext.isIE ? this.iframe.contentWindow : window.frames[this.iframe.name];
    },

//獲取iframe的document對象
getDoc : function(){
        return Ext.isIE ? this.getWin().document : (this.iframe.contentDocument || this.getWin().document);
},

//打開document對象,向其寫入初始化內容,以兼容FireFox
doc = this.getDoc();
doc.open();
doc.write('<html><head><mce:style type="text/css"><!--
body{border:0;margin:0;padding:3px;height:98%;cursor:text;}
--></mce:style><style type="text/css" mce_bogus="1">body{border:0;margin:0;padding:3px;height:98%;cursor:text;}</style></head><body></body></html>');
//打開document對象編輯模式
 doc.designMode = "on";
doc.close();

      這樣就可以向這個簡單那的編輯器中寫入內容了。

      3、獲取編輯器的內容,代碼如下:

     //獲取編輯器的body對象
var body = doc.body || doc.documentElement;
//獲取編輯器的內容
var content = body.innerHTML;
//對內容進行處理,例如替換其中的某些特殊字符等等
//Some code

//返回內容
return content;

      4、增加樣式設置。上面的編輯器雖然實現了基本功能,但是實在是有些太簡單了,應該增加些簡單的樣式實現。document的execCommand方法使這種想法成爲可能。

    //統一的執行命令方法
function execCmd(cmd, value){
    //doc對象的獲取參照上面的代碼
     //調用execCommand方法執行命令
    doc.execCommand(cmd, false, value === undefined ? null : value);
};

//將選中字體變爲黑體,Ctrl-B
execCmd('bold');
//加下劃線,Ctrl-U
execCmd('underline');
//變爲斜體,Ctrl-I
execCmd('italic');
//設置文字的顏色
execCmd('forecolor', Ext.isSafari || Ext.isIE ? '#'+color : color);
//在光標處插入一段內容
function insertAtCursor(text){
  //win對象的獲取參考上面的代碼
  if(Ext.isIE){
      win.focus();
      var r = doc.selection.createRange();
      if(r){
        r.collapse(true);
        r.pasteHTML(text);      }
    }else if(Ext.isGecko || Ext.isOpera){
      win.focus();
      execCmd('InsertHTML', text);
    }else if(Ext.isSafari){
      execCmd('InsertText', text);
    }
  }

     5、再進一步。如今可以改變樣式了,如果編輯器有工具欄(這應該是必然的),那麼我們還想工具欄上的按鈕根據光標所處位置的樣式,自動處於突出或正常顯示。document的queryCommandState()方法又讓這種想法得以實現。


//doc對象的獲取參考上面的對面
//光標處是否是粗體
var isBold = doc.queryCommandState('bold');
if(isBold){
  //改變Bold按鈕的樣式
}
//當然上面的代碼是可以合併的,這裏只不過是一個示意


//下劃線
doc.queryCommandState('underline');
//斜體
doc.queryCommandState('italic');

     本文只是爲實現編輯器提供了簡單的思路,其中的一些代碼是可以直接使用的。建議,想自己實現編輯器的朋友可以參考下ExtJS中的HTMLEditor代碼,既簡單又比較清晰,可以在其上進行擴展。

     最後提醒一點:一定要注意瀏覽器的兼容性問題,並且不要等接近尾聲了再去測試兼容性,對於這麼大量的JavaScript代碼,調整是比較痛苦的事情。

發佈了132 篇原創文章 · 獲贊 13 · 訪問量 70萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章