富文本編輯器小結(jié)

近況

最近由于公司業(yè)務(wù)上的需求陡厘,我們需要一個(gè)自己的編輯器來編寫我們得到APP里面的訂閱文章抽米,為什么需要自己的編輯器,主要是因?yàn)橛玫谌降木庉嬈骱茈y完成公司定制化的需求糙置,比如:排版上我們想要更好看點(diǎn)云茸,統(tǒng)一,因?yàn)楦鱾€(gè)訂閱專欄編輯的人不一樣谤饭,容易造成各種不同的審美差異标捺,解決方案有2種:

  1. 采用一個(gè)可定制化的第三方富文本編輯器,然后自己寫插件來滿足自己的要求揉抵。

  2. 自己寫一個(gè)富文本編輯器亡容。

最后和團(tuán)隊(duì)的人商量決定,自己擼一個(gè)吧冤今,因?yàn)槭褂玫谝环N方案闺兢,依賴于別人的開源插件,總是不太放心戏罢,而且害怕到時(shí)候有什么問題屋谭,要研究他們的源碼,那就跟自己寫差不多多少龟糕,而且我們自己擼一個(gè)桐磁,并非要寫一個(gè)非常通用,可以開源的富文本編輯器讲岁,我們只需要針對(duì)我們自己業(yè)務(wù)我擂,寫一個(gè)定制化符合公司使用的編輯器就行了。綜上缓艳,我開始了這次非常愉快(坑爹)的編輯器之旅PDΑ!郎任!

先看效果圖秧耗,如圖所示,如果有訂閱了我們得到APP里面專欄文章的舶治,可以對(duì)比下分井,現(xiàn)在和8月的文章就能看出來了。

文章大概效果

無處不在的坑

首先web端的富文本編輯器霉猛,基本命令參照documen命令文檔尺锚,兼容性的問題就不說了,大家都知道惜浅,主要說說一些開發(fā)了才能知道的坑瘫辩。

div還是p

可編輯模式下(是否支持可編輯可以用HTMLElement.isContentEditable
命令來查看的),如果內(nèi)部沒有P標(biāo)簽這個(gè)初始化標(biāo)簽,編寫的時(shí)候伐厌,換行給你添加的標(biāo)簽將會(huì)是div承绸,如圖所示:

Paste_Image.png

這里就已經(jīng)不太符合我們要求了,不想要各種div標(biāo)簽在文本外面挣轨,語義化來說军熏,我們應(yīng)該用p標(biāo)簽才對(duì)。

解決方案: 初始化添加一個(gè)p標(biāo)簽卷扮,并且里面加入一個(gè)br
<p><br></p>

刪除也要小心翼翼

這個(gè)坑跟第一個(gè)同樣的原因荡澎,只是表現(xiàn)形式不同,如果你開始刪除你的編輯文本晤锹,刪除完之后摩幔,整個(gè)可編輯元素,就變成空了鞭铆,意味著或衡,又沒有初始化的p標(biāo)簽,那么你在添加文字的時(shí)候车遂,就會(huì)跟上面的問題一樣了薇宠。

解決方案:監(jiān)聽刪除動(dòng)作,判斷內(nèi)部還是否有子元素艰额,沒有初始化p標(biāo)簽

行內(nèi)標(biāo)簽很有個(gè)性

添加文本需要的行內(nèi)標(biāo)簽,例如: bold椒涯,italic柄沮,underline,subscript等等废岂,可以任意添加和取消祖搓,一般來說沒有任何問題,需要注意的是湖苞,你不能隨意更改相關(guān)標(biāo)簽的css特殊樣式拯欧,炒個(gè)栗子:bold在chrome里面添加一個(gè)b標(biāo)簽,瀏覽器樣式财骨,font-weight:bolder;镐作,如果你自己css給覆蓋掉,變成 font-weight: normal;隆箩,那么再次點(diǎn)擊该贾,應(yīng)該取消的時(shí)候,不會(huì)成功的捌臊。原因我沒有找到文檔杨蛋,據(jù)我推測(cè),因?yàn)槭侨∠臅r(shí)候,判斷條件為是否有相關(guān)命令的css樣式逞力,并不是單純的文字外部標(biāo)簽名稱曙寡。

formatBlock跟你說,不是所有的牛奶都是特侖蘇寇荧!

使用formatBlock來添加或者更換文字的外標(biāo)簽時(shí)举庶,要特別注意--BLOCKQUOTE這個(gè)東東,
document.execCommand('formatBlock', false, "<blockquote>"),它能添加或者更換砚亭,但是要取消他的時(shí)候灯变,就不起作用了。

解決方案: 在執(zhí)行代碼的時(shí)候捅膘,多加一個(gè)判斷添祸,判斷當(dāng)前選中文字的外標(biāo)簽是什么,再?zèng)Q定是需要執(zhí)行什么命令寻仗。

let Range = document.getSelection().getRangeAt(0),
     formatName = Range.commonAncestorContainer.parentElement.nodeName === 'BLOCKQUOTE' ? 'P' : 'BLOCKQUOTE';
document.execCommand('formatBlock', false, formatName)

removeFormat并不是萬能的

清楚格式這個(gè)命令刃泌,主要會(huì)清除掉附帶在標(biāo)簽上的內(nèi)聯(lián)樣式,也就是style署尤,但是不會(huì)清除class名稱耙替,這意味著,從外部粘貼過來的文本曹体,如果不幸的ClassName和你的css里面的ClassName重復(fù)了俗扇,就會(huì)帶上你的css樣式。而且也不會(huì)清楚里面內(nèi)聯(lián)元素標(biāo)簽箕别,什么意思呢铜幽?就是span都還是存在的,從原理上來說這個(gè)不影響最后的顯示串稀,但沒有必要需要這些個(gè)標(biāo)簽除抛,很容易產(chǎn)生其他的問題。

解決方案:執(zhí)行清楚格式操作的時(shí)候母截,多加一些操作到忽,把無用的樣式,標(biāo)簽和ClassName全部干掉清寇。(此處必須有殺氣4)

其他

至于其他的很多命令(indent,fontSize颗管,fontColor...)陷遮,我這里沒有使用,也不知道是否有坑垦江,原因是前面說到的樣式統(tǒng)一帽馋,保證美觀搅方,不支持內(nèi)聯(lián)樣式,由統(tǒng)一的css樣式渲染绽族。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末姨涡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吧慢,更是在濱河造成了極大的恐慌涛漂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件检诗,死亡現(xiàn)場(chǎng)離奇詭異匈仗,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逢慌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門悠轩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人攻泼,你說我怎么就攤上這事火架。” “怎么了忙菠?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵何鸡,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我牛欢,道長(zhǎng)骡男,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任傍睹,我火速辦了婚禮洞翩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘焰望。我一直安慰自己,他們只是感情好已亥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布熊赖。 她就那樣靜靜地躺著,像睡著了一般虑椎。 火紅的嫁衣襯著肌膚如雪震鹉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天捆姜,我揣著相機(jī)與錄音传趾,去河邊找鬼。 笑死泥技,一個(gè)胖子當(dāng)著我的面吹牛浆兰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼簸呈,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼榕订!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蜕便,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤劫恒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后轿腺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體两嘴,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年族壳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了憔辫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡决侈,死狀恐怖螺垢,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赖歌,我是刑警寧澤枉圃,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站庐冯,受9級(jí)特大地震影響孽亲,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜展父,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一返劲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧栖茉,春花似錦篮绿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惶凝,卻和暖如春吼虎,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背苍鲜。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工思灰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人混滔。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓洒疚,卻偏偏與公主長(zhǎng)得像歹颓,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拳亿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案晴股? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,751評(píng)論 1 92
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)肺魁,斷路器电湘,智...
    卡卡羅2017閱讀 134,654評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件鹅经、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,102評(píng)論 4 62
  • 今天聽了老大的答疑會(huì)寂呛,感觸最深的一點(diǎn)就是向自己認(rèn)錯(cuò),敢于正視自己瘾晃,你究竟是在為誰做事贷痪? 正視自己: 來總部之前一個(gè)...
    英倫小兔子閱讀 460評(píng)論 2 4
  • “好無聊啊……”剛剛和曖昧對(duì)象意見不合準(zhǔn)備拉黑對(duì)方的A小姐把手機(jī)扔在一旁劫拢,翹起了粘在沙發(fā)上的腿。 對(duì)强胰,沒有男朋友舱沧,...
    laeticia閱讀 376評(píng)論 0 0