91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

html5中編輯器核心思想的示例分析

發布時間:2021-09-13 16:44:05 來源:億速云 閱讀:104 作者:小新 欄目:web開發

這篇文章給大家分享的是有關html5中編輯器核心思想的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

代碼和特性在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;
};

 起始點始終在左面,終止點始終在右面,不受選擇方向的影響。

  只有當起始點的開頭或終止點的末尾是<br/>時,返回的不是文本節點,可以通過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;
}

感謝各位的閱讀!關于“html5中編輯器核心思想的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

阳城县| 湛江市| 武清区| 金塔县| 石泉县| 中方县| 西安市| 图片| 吕梁市| 吉林省| 浮山县| 绥芬河市| 饶河县| 长丰县| 华宁县| 龙岩市| 江达县| 赤峰市| 咸丰县| 外汇| 镇江市| 丹巴县| 千阳县| 怀仁县| 衡阳市| 龙陵县| 田阳县| 易门县| 德阳市| 江达县| 琼海市| 潍坊市| 宜城市| 台前县| 新邵县| 蒙城县| 连云港市| 辽阳市| 隆德县| 白玉县| 绥宁县|