1. 程式人生 > >layui原始碼詳細分析系列之富文字編輯器模組

layui原始碼詳細分析系列之富文字編輯器模組

所謂的富文字編輯器就是內嵌在瀏覽器上、所見即所得的文字編輯器,它的形式如下:
富文字編輯器形式

layui框架中內建了layedit模組,該模組就是富文字編輯器模組,在最近兩天中我自己使用原生js實現了簡易的富文字編輯器,具體效果如下:
原生js編碼的富文字編輯器

首先說說這個demo的組織結構:
ueditor組織結構

在這個demo中,整體是一個IIFE,使用window物件將其建構函式暴露出去,想要使用這個demo,需要建立一個容器設定id屬性為ueditor,其實demo需要做的幾個關鍵點如下

  • 構建文字編輯器的主體html結構
  • 繫結工具欄的每個工具的事件繫結
  • 如何獲取選擇的文字
  • 如何給選擇的文字應用樣式
  • 如何插入圖片

對於1和2這兩個問題就是動態建立節點並追加到指定元素下,並使用addEventListener(就不考慮IE了)來繫結事件。

下面就來說說我對於下面3個關鍵點的處理:

  • 獲取文字,先來說說獲取文字的動作,滑鼠按下、拖動、鬆開、點選具體工具的過程,所以我對於內容區繫結mouseout事件。
    當選擇文字後離開目標點時觸發事件處理程式,使用window.getSelection()方法來獲取被選擇區域物件獲取其文字,該方法存在相容問題,感興趣的同學可以具體看看。
  • 如何給選擇的文字應用樣式:
    我的做法是新增標籤新增指定class類來實現,對於對齊的樣式,需要改變包含文字的元素為塊狀元素,應用text-align樣式
  • 如何插入圖片:
    實際上還是新增img標籤,獲取點選的表情的src屬性值,新增到內容區

實現過程中的問題:

  • 剛開始打算使用textarea來作為內容區的,但是有一個問題就是插入的html標籤不被識別,只能是文字,所以就使用div+contentEditable來實現

該demo的問題:

  • 體驗性不好,整體操作給人感覺不自然不流暢
  • 樣式沒有好好設計,彈出效果生硬,沒有應用動畫效果
  • 文字選擇的時候,感覺不自然
  • 應用樣式重複問題,沒有做處理優化

富文字編輯器demo的實現差強人意吧,以後會將其作為獨立專案重新編寫。

下面就分析下layui框架中富文字編輯器模組,該內建模組的組織結構圖如下所示:
layedit組織結構圖

從上圖中可見,作者將建立文字編輯器的方法作為api暴露了出來,在使用過程中需要手動呼叫來實現文字編輯器的建立工作。

關於該內建模組具體的執行邏輯如下圖所示:
邏輯圖

在分析了該內建模組的原始碼過程中,作者實現文字樣式的應用是通過document.execCommand():方法來實現的,該方法的功能就是用於操作可編輯區域的文字,可以對於改變文字大小字型等,實際上該方法也是新增標籤來實現,但是對於重複性標籤做了處理。當然該內建模組還提供了其他的功能,我會對其原始碼做詳細的註釋,具體可以檢視我的

GitHub,最近專案開始啟動,實踐與分析原始碼的時間會少許多,但是會一直實踐並堅持分析該框架的內建模組。

致遠行的你我