您的位置:首頁>正文

H5編輯器核心演算法和思想-遁地龍捲風

代碼和特性在chrome49下測試有效。

文本渲染的本質是對文本節點的渲染, 通過流覽器內置的物件Range可以獲得選擇的起始點、與終止點

var range = getRangeObject; var start = range.startOffset, end = range.endOffset; var startContainer = range.startContainer; var endContainer = range.endContainer;

getRangeObjec代碼如下

function getRangeObject{ if(window.getSelection) { var selection = window.getSelection; if(selection.rangeCount > 0) { return selection.getRangeAt(0); } } else if(document.selection) { return document.selection.createRange; } return null; };

View Code

起始點始終在左面, 終止點始終在右面, 不受選擇方向的影響。 只有當起始點的開頭或終止點的末尾是
時, 返回的不是文本節點, 可以通過start, end確定br元素的位置分別是startContainer.childNodes[start], endContainer.childNodes[end-1]。 返回的是文本節點start表示游標相對于起始文本節點所在的起始位置, end表示游標相對于終止文本節點所在的終止位置。

獲得下一個文本節點的演算法為

function getNextTextNode(startNode,dir = "nextSibling"){ //記錄startNode變化之前的狀態, startNode變化後無效時便於狀態的回滾 let unchangeNode = startNode; if(startNode.nodeType == 3){ startNode = startNode[dir]; } while (true){ if(startNode == undefined){ if(unchangeNode == undefined){ //保護機制 throw new Error("程式會陷入閉環"); break; } /* startNode所在的父元素所有選中節點遍歷完畢,
將sartNode指向父元素的兄弟節點 */ let parent = unchangeNode.parentElement; unchangeNode = parent; startNode = parent[dir]; } else if(startNode.nodeType == 3){ //文本節點則退出迴圈 break; } else if(startNode.tagName == "BR"){ //處理單標籤,避免不必要的反覆運算 unchangeNode = startNode; startNode = startNode[dir]; } else if(startNode.nodeType == 1){ /* 如果是雙標籤元素則進入 */ unchangeNode = startNode; if(dir == "previousSibling"){ startNode = $(startNode).contents.last.get(0); } else if(dir == "nextSibling"){ startNode = $(startNode).contents.first.get(0); } else { //便於錯誤的定位 throw new Error("錯誤的遍歷方向:"+dir); } } else { //便於錯誤的定位 throw new Error("不期待的元素類型=》"+startNode); } } return startNode; }

//上述函數用外部變數+while迴圈的方式取代遞迴, 加入的保護機制減少誤用、潛在bug導致極差的體驗。

獲得起始節點和結束節點之間的所有文本節點

function getTextNodes(startTextNode,endTextNode){ let textNodeArray = ; let node = startTextNode; while (true) { node = getNextTextNode(node); if(node == endTextNode){ break; } textNodeArray.push(node); } return textNodeArray; }

讚賞支持

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示