欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

在線所見(jiàn)即所得HTML編輯器的實(shí)現(xiàn)原理淺析

 更新時(shí)間:2015年04月25日 09:45:56   投稿:junjie  
這篇文章主要介紹了在線所見(jiàn)即所得HTML編輯器的實(shí)現(xiàn)原理淺析,本文用初始化、打開(kāi)編輯功能、獲取編輯器的內(nèi)容、增加樣式設(shè)置、再進(jìn)一步等步驟闡述在線編輯器的基本實(shí)現(xiàn)原理,需要的朋友可以參考下

如今網(wǎng)站開(kāi)發(fā)越來(lái)越提倡用戶體驗(yàn),為用戶提供便利的工具也越來(lái)越多,而在線的HTML內(nèi)容編輯器應(yīng)該算是其中比較“古老”的一個(gè)了。功能簡(jiǎn)單的可以為用戶提供文本的樣式控制,例如文字的顏色、字體大小等;而功能復(fù)雜的甚至可以提供類似Word一樣的強(qiáng)大功能。雖然現(xiàn)在各種開(kāi)源的編輯器非常多,但是真正好用的并不多,所以它們改進(jìn)工作也一直在進(jìn)行中。

如今網(wǎng)上多數(shù)的編輯器都有很強(qiáng)大的功能,相對(duì)而言,在使用中也需要很多的配置,當(dāng)然代碼也自然會(huì)比較“臃腫”。如果我們并不需要功能那么強(qiáng)大的編輯器,那么可以自己實(shí)現(xiàn)一個(gè),因?yàn)榇a并不復(fù)雜。下面是一點(diǎn)個(gè)人的經(jīng)驗(yàn),僅供參考(以ExtJS的HTMLEditor為例)。

1、初始化。當(dāng)頁(yè)面加載完畢后,向頁(yè)面添加一個(gè)IFrame(可選)。這里要注意的是,要判斷頁(yè)面的狀態(tài),要等頁(yè)面完全加載完畢后再進(jìn)行操作,防止出現(xiàn)找不到某些元素的錯(cuò)誤。

2、打開(kāi)編輯功能。將IFrame設(shè)為可以編輯(下面代碼來(lái)自ExtJS的HTMLEditor):

復(fù)制代碼 代碼如下:

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

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

//打開(kāi)document對(duì)象,向其寫(xiě)入初始化內(nèi)容,以兼容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>');
//打開(kāi)document對(duì)象編輯模式
 doc.designMode = "on";
doc.close();

這樣就可以向這個(gè)簡(jiǎn)單那的編輯器中寫(xiě)入內(nèi)容了。
 
3、獲取編輯器的內(nèi)容,代碼如下:

復(fù)制代碼 代碼如下:

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

//返回內(nèi)容
return content;

 4、增加樣式設(shè)置。上面的編輯器雖然實(shí)現(xiàn)了基本功能,但是實(shí)在是有些太簡(jiǎn)單了,應(yīng)該增加些簡(jiǎn)單的樣式實(shí)現(xiàn)。document的execCommand方法使這種想法成為可能。

復(fù)制代碼 代碼如下:

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

//將選中字體變?yōu)楹隗w,Ctrl-B
execCmd('bold');
//加下劃線,Ctrl-U
execCmd('underline');
//變?yōu)樾斌w,Ctrl-I
execCmd('italic');
//設(shè)置文字的顏色
execCmd('forecolor', Ext.isSafari || Ext.isIE ? '#'+color : color);
//在光標(biāo)處插入一段內(nèi)容
function insertAtCursor(text){
  //win對(duì)象的獲取參考上面的代碼
  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、再進(jìn)一步。如今可以改變樣式了,如果編輯器有工具欄(這應(yīng)該是必然的),那么我們還想工具欄上的按鈕根據(jù)光標(biāo)所處位置的樣式,自動(dòng)處于突出或正常顯示。document的queryCommandState()方法又讓這種想法得以實(shí)現(xiàn)。

復(fù)制代碼 代碼如下:

//doc對(duì)象的獲取參考上面的對(duì)面
//光標(biāo)處是否是粗體
var isBold = doc.queryCommandState('bold');
if(isBold){
  //改變Bold按鈕的樣式
}
//當(dāng)然上面的代碼是可以合并的,這里只不過(guò)是一個(gè)示意


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

本文只是為實(shí)現(xiàn)編輯器提供了簡(jiǎn)單的思路,其中的一些代碼是可以直接使用的。建議,想自己實(shí)現(xiàn)編輯器的朋友可以參考下ExtJS中的HTMLEditor代碼,既簡(jiǎn)單又比較清晰,可以在其上進(jìn)行擴(kuò)展。

最后提醒一點(diǎn):一定要注意瀏覽器的兼容性問(wèn)題,并且不要等接近尾聲了再去測(cè)試兼容性,對(duì)于這么大量的JavaScript代碼,調(diào)整是比較痛苦的事情。

相關(guān)文章

  • JavaScript判斷是否手機(jī)瀏覽器的五種方法

    JavaScript判斷是否手機(jī)瀏覽器的五種方法

    現(xiàn)在手機(jī)網(wǎng)站已經(jīng)很普及了,有時(shí)候前端網(wǎng)頁(yè)需要判斷,用戶使用的是手機(jī)瀏覽器還是電腦瀏覽器。這篇文章整理了JavaScript判斷是否手機(jī)瀏覽器的五種方法,通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值
    2022-11-11
  • js 基礎(chǔ)篇必看(點(diǎn)擊事件輪播圖的簡(jiǎn)單實(shí)現(xiàn))

    js 基礎(chǔ)篇必看(點(diǎn)擊事件輪播圖的簡(jiǎn)單實(shí)現(xiàn))

    下面小編就為大家?guī)?lái)一篇js 基礎(chǔ)篇必看(點(diǎn)擊事件輪播圖的簡(jiǎn)單實(shí)現(xiàn))。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-08-08
  • JS實(shí)現(xiàn)數(shù)組深拷貝的方法分析

    JS實(shí)現(xiàn)數(shù)組深拷貝的方法分析

    這篇文章主要介紹了JS實(shí)現(xiàn)數(shù)組深拷貝的方法,結(jié)合實(shí)例形式分析了javascript數(shù)組深拷貝的相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下
    2019-03-03
  • 微信小程序如何實(shí)現(xiàn)數(shù)據(jù)共享與方法共享詳解

    微信小程序如何實(shí)現(xiàn)數(shù)據(jù)共享與方法共享詳解

    這篇文章主要給大家介紹了關(guān)于微信小程序如何實(shí)現(xiàn)數(shù)據(jù)共享與方法共享的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • JavaScript設(shè)計(jì)模式經(jīng)典之命令模式

    JavaScript設(shè)計(jì)模式經(jīng)典之命令模式

    命令模式(Command)的定義是:用來(lái)對(duì)方法調(diào)用進(jìn)行參數(shù)化處理和傳送,經(jīng)過(guò)這樣處理過(guò)的方法調(diào)用可以在任何需要的時(shí)候執(zhí)行。接下來(lái)通過(guò)本文給大家介紹JavaScript設(shè)計(jì)模式經(jīng)典之命令模式,需要的朋友參考下
    2016-02-02
  • JavaScript canvas實(shí)現(xiàn)雪花隨機(jī)動(dòng)態(tài)飄落

    JavaScript canvas實(shí)現(xiàn)雪花隨機(jī)動(dòng)態(tài)飄落

    這篇文章主要為大家詳細(xì)介紹了JavaScript canvas實(shí)現(xiàn)雪花隨機(jī)動(dòng)態(tài)飄落,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • Javascript顯示和隱藏ul列表的方法

    Javascript顯示和隱藏ul列表的方法

    這篇文章主要介紹了Javascript顯示和隱藏ul列表的方法,涉及javascript針對(duì)頁(yè)面元素遍歷及顯示與隱藏的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-07-07
  • Axios+Spring?Boot實(shí)現(xiàn)文件上傳和下載

    Axios+Spring?Boot實(shí)現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細(xì)介紹了Axios+Spring?Boot實(shí)現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 一文帶你了解小程序中的權(quán)限設(shè)計(jì)

    一文帶你了解小程序中的權(quán)限設(shè)計(jì)

    我們?cè)谌粘I钪袩o(wú)論是坐公交還是點(diǎn)餐,都會(huì)接觸各種各樣的小程序,下面這篇文章主要給大家介紹了關(guān)于小程序中權(quán)限設(shè)計(jì)的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • 怎樣用Javascript實(shí)現(xiàn)策略模式

    怎樣用Javascript實(shí)現(xiàn)策略模式

    這篇文章主要介紹了JavaScript設(shè)計(jì)模式之策略模式,想學(xué)習(xí)設(shè)計(jì)模式的同學(xué),一定要看一下
    2021-04-04

最新評(píng)論