簡單的實現一個富文本編輯器

使用過 office 文檔的同學一定知道他的便捷,不僅可以很好的編輯文檔,還可以賦予它一定的格式、段落、縮進,還可以使用圖片等等。

如果我們在 web 上也想要實現這樣的效果,那么我們應該怎么做呢?

我們可以在網上找到已經封裝好的插件,例如:draft 或者 pell,這些插件都是開箱即用的,也可以在此之上進行封裝。

當然,我們也可以選擇自己封裝一個我們需要的插件。

那怎么才能實現一個富文本編輯器呢?

我們可以選擇 document.execCommand 來實現一個簡易的富文本編輯器。

指令

下面先來看下 document.execCommand 語法:

document.execCommand(commandName, showDefaultUI, value)

上面的語句用來對可編輯的元素執行一段命令,返回布爾值,如果為 false 則表示操作不被支持或未被啟用

我們分別看看參數的含義:

  1. commandName 代表了命令名稱

  2. showDefaultUI 是否展示對話框,true:展示,false:不展示,一般為 false

  3. value 補充信息,例如:插入圖片需要的 url

既然知道了語法,那我們現在封裝一個執行函數用來執行指令:

const exec = (commandName, value = null) => {
  document.execCommand(commandName, false, value);
};

接下來,我們來做下工具欄的設計和封裝。

工具欄

假設工具欄有很多格式化的按鈕,當我們點擊的時候所選擇的區域的文字會做相應改變,按鈕既有顯示的樣式,還有執行功能的方法,可以使用對象來表示,所有按鈕屬性的集合形成了工具欄。

我們使用 actions 作為工具欄按鈕的集合,即:

const actions = {
  bold: {
    icon: "<b>B</b>",
    title: "Bold",
    result: () => exec("bold"),
  },
  italic: {
    icon: "<i>I</i>",
    title: "Italic",
    result: () => exec("italic"),
  },
  underline: {
    icon: "<u>U</u>",
    title: "Underline",
    result: () => exec("underline"),
  },
  justifyLeft: {
    icon: "<span>L</span>",
    title: "JustifyLeft",
    result: () => exec("justifyLeft"),
  },
  justifyRight: {
    icon: "<span>R</span>",
    title: "JustifyRight",
    result: () => exec("justifyRight"),
  },
  justifyCenter: {
    icon: "<span>C</span>",
    title: "JustifyCenter",
   onClick: () => exec("justifyCenter"),
  },
};

上面代碼就是一個簡單的工具欄按鈕的集合,其中有 6 個格式化的屬性。

現在,我們來講解下字段:

  • icon 工具欄顯示的按鈕的樣式

  • title 按鈕的標題

  • onClick 點擊按鈕執行的指令

我們已經完成了工具欄的部分,現在我們實現下完整的頁面和編輯區域吧!

編輯區域

首先創建富文本容器,在容器內分別放置工具欄和編輯區域:

<div className="textEditor">
  <div className="actions">
    {Object.keys(actions).map((action) => (
      <button
        type="button"
        title={actions[action].title}
        onClick={actions[action].onClick}
      >
        {actions[action].icon}
      </button>
    ))}
  </div>
  <div className="content" contentEditable></div>
 </div>

我們最后來看一下實現的效果吧:

富文本編輯器初實現靜態圖

應用效果怎么樣呢?我們看下面:

最終實現效果
總結

我們已經簡單的實現了一個富文本編輯器,但是這個編輯器還有很大的空間等待我們去優化,比如:點擊工具欄閃爍的問題,更多的功能等。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容