版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。 本文連接:blog.csdn.net/qq_32858649…html
首先,我這個文章不會寫很是詳細的代碼,可是我會把我目前博客開發的富文本編輯遇到的問題羅列出來。而後一點點的說明如何解決。說實在目前遇到的問題,已經想讓我放棄本身開發富文本了,真的是非誠勿擾。這個坑沒那麼簡單。(捂臉哭)前端
開發環境:vueCli3.Xvue
contentEditable="true"
複製代碼
這個屬性我不介紹了,不懂得本身百度node
網上大多數富文本編輯器都是iframe,不少成熟的富文本編輯器也是用的iframe。我我的不知道好壞,因此我直接用的div。也許後期會遇到沒法解決的坑再換吧。git
我不知道是否是我不是用的iframe的問題,可是每當我須要操做文字加粗都失敗,緣由在於失去選區。github
解決:a標籤和img標籤不會失去選區,改代碼。後端
上我的代碼:bash
<div class="dht-editor-operation">
<template v-for="(item, index) in operationList">
<a :key="index" @click="item.event" :title="item.title">
<img :src="item.iconUrl" :style="item.backgroundImg" alt="" />
</a>
</template>
</div>
複製代碼
我其實第一個寫的功能是顏色選擇器,沒寫很複雜就是用input的color屬性app
第二功能是文字加粗。可是不會加粗。最後檢查得知是由於,我本身有一個全局存在的樣式重置代碼。我把b標籤的默認樣式去除了。框架
到這個時候我都仍是用的富文本本身的操做函數
document.execCommand(aCommandName, aShowDefaultUI, aValueArgument)
複製代碼
文檔地址:developer.mozilla.org/zh-CN/docs/…
這裏開始就踩坑很嚴重了。由於樣式重置,我考慮到若是別人用個人東西,那麼也會這樣,那就是說我得避免這個狀況。因此我選擇了另外一條路,本身實現這些功能。固然不可能全部都本身實現,那就太累了,我也不是寫產品,給本身用的。
使用: window.getSelection()和
Range()
參考教程:www.jianshu.com/p/5997a90aa…
MDN文檔:developer.mozilla.org/zh-CN/docs/…
MDN文檔:developer.mozilla.org/zh-CN/docs/…
這裏文檔得好好看看,否則我下面的代碼你看不懂。
第一次解決方式
我用的代碼是這樣的(不要在乎我這裏是改顏色,原理懂了就行)
代碼來自這篇博客:www.cnblogs.com/wyjs/articl…
我我的一開始就是按這位的博客來寫的,很詳細
var selection = document.getSelection();
//取得選擇的文本
var selectionText = selection.toString();
//取得表明選區的範圍
var range = selection.getRangeAt(0);
//突出顯示選擇的文本
var span = document.createElement("span");
span.style.backgroundColor = "yellow";
range.surroundContents(span);
這種方式用的是range.surroundContents,意思是將你選中的文檔放在一個新的標籤中。
可是問題很嚴重
缺點:
一、無限的加入標籤中,會無限嵌套html元素(本身開發中看f12就懂了)
二、沒法跨元素操做
好比這樣的,這種選擇是不能成功的,報錯。由於他沒法操做多個dom元素。
這時候已經巨坑了好吧。我本來覺得就和別人說的同樣,好簡單。你要是不考慮那麼多操做,不當初編輯器來操做確實簡單啊。
第二種解決方式(目前我測試沒什麼問題)
原理在於先刪後插,須要須要各位理解range選區(拖藍部分的代碼意思,仔細看文檔咯)
這裏仍是會產生無限嵌套問題,我再找找方式,可是解決了跨元素選擇問題
代碼:
CursorAcquisition() {
let selection = window.getSelection();
let range = selection.getRangeAt(0);
return {
selection,
range
};
},
複製代碼
//取得表明選區的範圍
let range = this.CursorAcquisition().range;
//突出顯示選擇的文本
//let rangeClone = range.cloneRange();
//得到選中區域dom袁術
let rangeText = range.extractContents();
//建立新的dom而且結合
let span = document.createElement("span");
span.appendChild(rangeText);
span.style.color = "red";
//先移除選中節點
range.deleteContents();
//再插入節點
range.insertNode(span);
複製代碼
這個代碼就能實現上述全部產生的問題。至少我暫時這麼認爲,大神則請指出。
好了第一篇踩坑到此結束,各位請先品嚐。後面我還會寫下一篇。由於下一個坑我已經踩完了。心累。不寫博客我都不知道哪裏去發泄。網上的教程即好又缺斤少兩,少關鍵啊。
最後附上,個人顏色選擇器,不須要添加html元素。可是須要支持input color
//顏色選擇器
colorSelect() {
let input = document.createElement("input");
let that = this;
input.type = "color";
input.click();
input.addEventListener("input", watchColorPicker, false);
function watchColorPicker(event) {
//console.log(event.target.value);
let color = event.target.value;
that.operationList[0].backgroundImg = {
background: color
};
//移除監聽
input.removeEventListener("input", watchColorPicker, false);
input = "";
}
}
複製代碼
我的項目代碼都在git上面:
本次富文本開發的路徑截圖,項目屬於持續完善,因此代碼比較亂。
項目富文本本地打開地址:http://localhost:8080/dht_blog/richTextEditor
項目的最後:
富文本確定不是到這裏就結束了,可是從目前本身代碼的方式來寫,不亞於放棄一切,而後構建一個新的文本編輯器。考慮代碼重構,捨棄當前複雜的開發方式。從博文發出,到發現bug,再到從新百度富文本編輯器原理,經歷了3個小時。實在沒辦法,真不是兩三天能寫完的。
下面我將開後端nodejs項目,研究koa框架和阿里的egg框架。計劃開始搞本身的後端服務代碼了。畢竟一個博客不能只是前端頁面。可是,後端不會太深刻,由於要有所側重。由於都是nodejs,因此js代碼方面不會荒廢。