摘要:最近做個(gè)小功能功能效果如圖試想一下,如果在選擇文本之后不僅能獲得對(duì)應(yīng)文檔片段,而且再獲得文本對(duì)應(yīng)的文檔位置,這樣我們才能給文檔片段包裹類名再后插入原來(lái)的位置。選區(qū)中包含的范圍的數(shù)量將指定的范圍添加到選區(qū)中。
最近做個(gè)小功能,功能效果如圖:
試想一下,如果在選擇文本之后不僅能獲得對(duì)應(yīng)文檔片段,而且再獲得文本對(duì)應(yīng)的文檔位置,
這樣我們才能給文檔片段包裹類名再后插入原來(lái)的位置。
這樣的話咱們先來(lái)學(xué)習(xí)DOM2和DOM3的幾個(gè)概念
1. window.getSelection()getSelection() 方法,可以確定實(shí)際選擇的文本。
這個(gè)方法是 window 對(duì)象和 document 對(duì)象的屬性,調(diào)用它會(huì)返回一個(gè)表示當(dāng)前選擇文本的 Selection對(duì)象。
每個(gè) Selection 對(duì)象都有下列屬性。anchorNode :選區(qū)起點(diǎn)所在的節(jié)點(diǎn)。
anchorOffset :在到達(dá)選區(qū)起點(diǎn)位置之前跳過(guò)的 anchorNode 中的字符數(shù)量。
focusNode :選區(qū)終點(diǎn)所在的節(jié)點(diǎn)。
focusOffset : focusNode 中包含在選區(qū)之內(nèi)的字符數(shù)量。
isCollapsed :布爾值,表示選區(qū)的起點(diǎn)和終點(diǎn)是否重合。
rangeCount :選區(qū)中包含的 DOM 范圍的數(shù)量
addRange(range) :將指定的 DOM 范圍添加到選區(qū)中。
collapse(node, offset) :將選區(qū)折疊到指定節(jié)點(diǎn)中的相應(yīng)的文本偏移位置。
collapseToEnd() :將選區(qū)折疊到終點(diǎn)位置。
collapseToStart() :將選區(qū)折疊到起點(diǎn)位置。
containsNode(node) :確定指定的節(jié)點(diǎn)是否包含在選區(qū)中。
deleteFromDocument() :從文檔中刪除選區(qū)中的文本,與 document.execCommand("delete",false, null) 命令的結(jié)果相同。
extend(node, offset) :通過(guò)將 focusNode 和 focusOffset 移動(dòng)到指定的值來(lái)擴(kuò)展選區(qū)。
getRangeAt(index) :返回索引對(duì)應(yīng)的選區(qū)中的 DOM 范圍。
removeAllRanges() :從選區(qū)中移除所有 DOM 范圍。實(shí)際上,這樣會(huì)移除選區(qū),因?yàn)檫x區(qū)中至少要有一個(gè)范圍。
reomveRange(range) :從選區(qū)中移除指定的 DOM 范圍。
selectAllChildren(node) :清除選區(qū)并選擇指定節(jié)點(diǎn)的所有子節(jié)點(diǎn)。
toString() :返回選區(qū)所包含的文本內(nèi)容。
by-《javascript高級(jí)程序設(shè)計(jì)》
咱們需要用到的就是getRangeAt()這個(gè)屬性,這個(gè)屬性返回索引對(duì)應(yīng)的選區(qū)中的 DOM 范圍,是一個(gè)Range對(duì)象這樣就記住了獲取文檔片段的位置。
console一下看看這個(gè)屬性所在位置
extractContents(),會(huì)從文檔中移除范圍選區(qū),并返回范圍的文檔片段,這樣就獲得了想要的文檔片段。
3. Range.insertNode()insertNode(),是在Range的起始位置插入節(jié)點(diǎn)的方法。詳細(xì)屬性可以自行參考MDN或者高程
console一下看看上兩個(gè)屬性所在位置
//css .active { background: #00FF90; } //html積土成山,風(fēng)雨興焉;積水成淵,蛟龍生焉;積善成德,而神明自得,圣心備焉。 故不積跬步,無(wú)以至千里;不積小流,無(wú)以成江海。騏驥一躍,不能十步;駑馬十駕,功在不舍。 鍥而舍之,朽木不折;鍥而不舍,金石可鏤。蚓無(wú)爪牙之利,筋骨之強(qiáng),上食埃土,下飲黃泉,用心一也。 蟹六跪而二螯,非蛇鱔之穴無(wú)可寄托者,用心躁也。//js function select() { let selectedRange = window.getSelection().getRangeAt(0); //獲取選中文本位置,返回Range對(duì)象 let selectedFragment = selectedRange.extractContents(); //移除選區(qū)文檔片段,并返回 let span = document.createElement("span"); span.classList = "active"; span.appendChild(selectedFragment); //創(chuàng)建span標(biāo)簽添加想要的類名,名把返回的文檔片段插入 selectedRange.insertNode(span); //在獲取的Range對(duì)象中插入span標(biāo)簽 span.onclick = function(ev) { //再點(diǎn)擊span標(biāo)簽,在其前面添加span標(biāo)簽內(nèi)的文本,并刪除這個(gè)span標(biāo)簽 this.parentNode.insertBefore(document.createTextNode(this.innerText), this); this.parentNode.removeChild(this); }; } document.getElementById("text").onmouseup = function() { select(); window.getSelection().removeAllRanges(); //鼠標(biāo)松開(kāi)后取消瀏覽器默認(rèn)的深藍(lán)色選中樣式 };
在線地址
結(jié)語(yǔ)DOM2和DOM3的功能遠(yuǎn)不止這些,它有著更加細(xì)膩和多樣的DOM操作,需要我們?nèi)グl(fā)掘和熟悉。
本篇文章為本人的處女篇。在排版和表達(dá)上都還有欠缺,如能對(duì)您有所幫助,實(shí)在是感到榮幸。如有不合理之處也請(qǐng)大家多多指點(diǎn)。
謝謝瀏覽。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/108158.html
摘要:擴(kuò)展為了實(shí)現(xiàn)更多的功能,會(huì)有一些標(biāo)準(zhǔn)或?qū)S械臄U(kuò)展。標(biāo)準(zhǔn)擴(kuò)展主要有選擇符元素遍歷一選擇符選擇符能夠允許代碼直接根據(jù)選擇符選擇與某個(gè)模式匹配的元素。 DOM擴(kuò)展 為了實(shí)現(xiàn)更多的功能,會(huì)有一些標(biāo)準(zhǔn)或?qū)S械腄OM擴(kuò)展。 標(biāo)準(zhǔn)擴(kuò)展主要有: SelectorAPI(選擇符API) HTML5 Element Traversal(元素遍歷) 一、 選擇符API 選擇符API能夠允許J...
摘要:前言這是系列最后一篇,本文主要總結(jié)了的用法,以及最后對(duì)函數(shù)進(jìn)行抽象。一個(gè)多說(shuō)無(wú)益,還是上代碼來(lái)得實(shí)在還記得編程藝術(shù)中的總結(jié)一中那個(gè)無(wú)聊的根據(jù)元素在節(jié)點(diǎn)樹(shù)里的位置來(lái)設(shè)置樣式的吧現(xiàn)在可以用屬性直接更改樣式了。 前言:這是CSS-DOM系列最后一篇,本文主要總結(jié)了className的用法,以及最后對(duì)函數(shù)進(jìn)行抽象。 ------------------我是分割線----------------...
摘要:前言這是系列最后一篇,本文主要總結(jié)了的用法,以及最后對(duì)函數(shù)進(jìn)行抽象。一個(gè)多說(shuō)無(wú)益,還是上代碼來(lái)得實(shí)在還記得編程藝術(shù)中的總結(jié)一中那個(gè)無(wú)聊的根據(jù)元素在節(jié)點(diǎn)樹(shù)里的位置來(lái)設(shè)置樣式的吧現(xiàn)在可以用屬性直接更改樣式了。 前言:這是CSS-DOM系列最后一篇,本文主要總結(jié)了className的用法,以及最后對(duì)函數(shù)進(jìn)行抽象。 ------------------我是分割線----------------...
摘要:無(wú)論是否移動(dòng),元素仍然占據(jù)原來(lái)的空間。絕對(duì)定位絕對(duì)定位使元素的位置與文檔流無(wú)關(guān),因此不占據(jù)空間。 為啥讀這本書 現(xiàn)在前端圈子過(guò)于浮躁,掌握基礎(chǔ)無(wú)疑比掌握一個(gè)js框架重要 css怎么都能寫出來(lái),但是要寫的好寫得快還得多讀書 css魔法推薦的,讀完這個(gè)讀讀css揭秘 當(dāng)然,根本原因還是覺(jué)得自己掌握不好 開(kāi)始總結(jié)吧~ 一. 基礎(chǔ)知識(shí) 經(jīng)過(guò)上世紀(jì)沒(méi)有 css的痛苦時(shí)的混沌時(shí)期,人們開(kāi)始了進(jìn)...
摘要:組件是可以配置的構(gòu)建元素。可以附加到頁(yè)面布局部件中。組件是的核心特性。每個(gè)組件都可以對(duì)網(wǎng)站的功能進(jìn)行擴(kuò)展。組件可以在頁(yè)面上輸出代碼,但是這不是主要的,組件的一個(gè)重要功能是處理請(qǐng)求處理表單提交回調(diào),處理頁(yè)面執(zhí)行周期。 Components Components這里我們稱之為組件。 組件是可以配置的構(gòu)建元素??梢愿郊拥絇ages(頁(yè)面)、Layouts(布局)、Partials(部件)中。...
閱讀 3166·2021-11-24 10:47
閱讀 3929·2021-11-02 14:43
閱讀 2323·2021-09-26 10:15
閱讀 2695·2021-09-08 09:35
閱讀 642·2019-08-30 12:45
閱讀 2841·2019-08-29 17:04
閱讀 3342·2019-08-26 14:05
閱讀 1366·2019-08-26 12:10