Range與Selection對象(梁王的理論自習(xí)室)

前言

之前看quill源碼(一個(gè)富文本編輯器)的時(shí)候第一次接觸Range與Selection對象性含,之前也寫過一篇文章總結(jié)了這兩個(gè)對象虱岂,不過感覺略水鸿市,正好現(xiàn)在在重構(gòu)一個(gè)atwho的功能偿枕,特寫幾篇總結(jié)下几于。吃引、

Selection

Selection是什么

selection是對當(dāng)前激活選中區(qū)(即高亮文本)進(jìn)行操作的對象筹陵。

Selection有什么用

我遇見的比較主要的就是獲取選中區(qū)的Range

Selection例子

讀者可以選中一些文字然后控制臺(tái)輸入下列代碼

userSelection = window.getSelection();
userSelection.toString()

Range

Range是什么

所謂"Range"刽锤,是指HTML文檔中任意一段內(nèi)容。一個(gè)Range的起始點(diǎn)和結(jié)束點(diǎn)位置任意朦佩,甚至起始點(diǎn)和結(jié)束點(diǎn)可以是一樣的(也就是空Range)并思。最常見的Range是用戶文本選擇范圍(user text selection)。當(dāng)用戶選擇了頁面上的某一段文字后语稠,你就可以把這個(gè)選擇轉(zhuǎn)為Range宋彼。當(dāng)然,你也可以直接用程序定義Range仙畦。

Range有什么用

試想一下输涕,在富文本編輯器里面,有一些情況是加粗或者傾斜選中的內(nèi)容慨畸,Range指HTML文檔中任意一段內(nèi)容莱坎。

在 HTML5 中,一個(gè) Range 對象代表頁面上的一段連續(xù)區(qū)域寸士。通過 Range 對象檐什,可以獲取或修改頁面上的任何區(qū)域。包含獲取弱卡,修改乃正,刪除和替換等操作。

Range的例子

userSelection = window.getSelection();
userSelection.getRangeAt(0).toString()

Range與Selection

每一個(gè)selection對象都有一個(gè)或者多個(gè)Range對象婶博,每一個(gè)range對象代表用戶鼠標(biāo)所選取范圍內(nèi)的一段連續(xù)區(qū)域瓮具,在firefox中,可以通過ctrl鍵可以選取多個(gè)連續(xù)的區(qū)域凡人,因此在firefox中一個(gè)selection對象有多個(gè)range對象名党,在其他瀏覽器中,用戶只能選取一段連續(xù)的區(qū)域划栓,因此只有一個(gè)range對象兑巾。
所以你可以看到userSelection.getRangeAt(0)這個(gè)為什么會(huì)有個(gè)0
getRangeAt方法有一個(gè)參數(shù)index,代表該Range對象的序列號忠荞;我們可以通過Selection對象的rangeCount參數(shù)的值判斷用戶是否選取了內(nèi)容;

屬性與方法

由于這種屬性和方法的東西太多了帅掘,羅列出來沒什么用委煤,我就說一些我用過的部分屬性和方法。

Range對象的我用過的屬性與方法(待補(bǔ)充)

setStart, setEnd等

setStart方法 用于將某個(gè)節(jié)點(diǎn)中的某處位置指定為Range對象所代表區(qū)域的起點(diǎn)位置修档,使用方法如下:

rangeObj.setStart(node,curIndex);

如上代碼rangeObj代表一個(gè)Range對象碧绞,該setStart方法使用2個(gè)參數(shù),第一個(gè)參數(shù)node代表一個(gè)節(jié)點(diǎn)吱窝,第二個(gè)參數(shù)是一個(gè)數(shù)字讥邻,當(dāng)?shù)谝粋€(gè)參數(shù)node所代表的節(jié)點(diǎn)是一個(gè)內(nèi)容為一段文字的文字節(jié)點(diǎn)時(shí)迫靖,該參數(shù)值用于指定將第幾個(gè)文字的結(jié)束位置作為Range對象所代表的區(qū)域的起點(diǎn)位置;當(dāng)?shù)谝粋€(gè)參數(shù)node所代表的節(jié)點(diǎn)中包括其他子節(jié)點(diǎn)時(shí)兴使,該參數(shù)值用于將第幾個(gè)子節(jié)點(diǎn)的結(jié)束位置指定為Range對象所代表的區(qū)域的起點(diǎn)位置系宜;

Selection對象的我用過的屬性與方法(待補(bǔ)充)

getRangeAt(index)
從當(dāng)前selection對象中獲得一個(gè)range對象。
index:參考rangeCount屬性发魄。
返回:根據(jù)下標(biāo)index返回相應(yīng)的range對象盹牧。

collapse(parentNode, offset)
將開始點(diǎn)和結(jié)束點(diǎn)合并到指定節(jié)點(diǎn)(parentNode)的相應(yīng)(offset)位置。

實(shí)戰(zhàn)

需求是獲取光標(biāo)之前的內(nèi)容励幼,這個(gè)在我實(shí)現(xiàn)atwho(@)和添加標(biāo)簽(#)的時(shí)候使用過汰寓。

代碼

// 這個(gè)函數(shù)獲取用戶選擇部分的Range對象
function getRange() {
  const selection = window.getSelection()
  if (selection && selection.rangeCount > 0) {
    return selection.getRangeAt(0)
  }
}
//這個(gè)獲取光標(biāo)前的Range
function getPrecedingRange() {
  const r = getRange()
  if (r) {
    const range = r.cloneRange()
    range.collapse(true)
    // var el = closest(range.endContainer, d => d.contentEditable)
    // range.setStart(el, 0)
    range.setStart(range.endContainer, 0)
    return range
  }
}
// have fun
getPrecedingRange().toString()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苹粟,隨后出現(xiàn)的幾起案子有滑,更是在濱河造成了極大的恐慌,老刑警劉巖嵌削,帶你破解...
    沈念sama閱讀 222,807評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件俺孙,死亡現(xiàn)場離奇詭異,居然都是意外死亡掷贾,警方通過查閱死者的電腦和手機(jī)睛榄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,284評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來想帅,“玉大人场靴,你說我怎么就攤上這事「圩迹” “怎么了旨剥?”我有些...
    開封第一講書人閱讀 169,589評論 0 363
  • 文/不壞的土叔 我叫張陵,是天一觀的道長浅缸。 經(jīng)常有香客問我轨帜,道長,這世上最難降的妖魔是什么衩椒? 我笑而不...
    開封第一講書人閱讀 60,188評論 1 300
  • 正文 為了忘掉前任蚌父,我火速辦了婚禮,結(jié)果婚禮上毛萌,老公的妹妹穿的比我還像新娘苟弛。我一直安慰自己,他們只是感情好阁将,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,185評論 6 398
  • 文/花漫 我一把揭開白布膏秫。 她就那樣靜靜地躺著,像睡著了一般做盅。 火紅的嫁衣襯著肌膚如雪缤削。 梳的紋絲不亂的頭發(fā)上窘哈,一...
    開封第一講書人閱讀 52,785評論 1 314
  • 那天,我揣著相機(jī)與錄音亭敢,去河邊找鬼滚婉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吨拗,可吹牛的內(nèi)容都是我干的满哪。 我是一名探鬼主播,決...
    沈念sama閱讀 41,220評論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼劝篷,長吁一口氣:“原來是場噩夢啊……” “哼哨鸭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娇妓,我...
    開封第一講書人閱讀 40,167評論 0 277
  • 序言:老撾萬榮一對情侶失蹤像鸡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后哈恰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體只估,經(jīng)...
    沈念sama閱讀 46,698評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,767評論 3 343
  • 正文 我和宋清朗相戀三年着绷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛔钙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,912評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡荠医,死狀恐怖吁脱,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情彬向,我是刑警寧澤兼贡,帶...
    沈念sama閱讀 36,572評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站娃胆,受9級特大地震影響遍希,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜里烦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,254評論 3 336
  • 文/蒙蒙 一凿蒜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧招驴,春花似錦篙程、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,746評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拥诡。三九已至触趴,卻和暖如春氮发,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背冗懦。 一陣腳步聲響...
    開封第一講書人閱讀 33,859評論 1 274
  • 我被黑心中介騙來泰國打工爽冕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人披蕉。 一個(gè)月前我還...
    沈念sama閱讀 49,359評論 3 379
  • 正文 我出身青樓颈畸,卻偏偏與公主長得像,于是被迫代替她去往敵國和親没讲。 傳聞我的和親對象是個(gè)殘疾皇子眯娱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,922評論 2 361

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

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 11,010評論 6 13
  • 一:Range對象的概念 Range對象代表頁面上一段連續(xù)的區(qū)域,通過Range對象可以獲取或者修改頁面上任何區(qū)域...
    便U_Life閱讀 18,508評論 6 28
  • HTML5新增元素(下) output:輸出元素,與label同樣有for屬性嘁信,常作為實(shí)時(shí)(或JS)輸出的載體于样。 ...
    IOLG閱讀 1,173評論 0 1
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)潘靖,斷路器穿剖,智...
    卡卡羅2017閱讀 134,716評論 18 139
  • 舊憶氤氳飄散,紅葉紛飛情亂卦溢。 不見淚垂憐糊余,一月癡心誰斷。 不見既绕,不見啄刹。夢醒獨(dú)身空嘆。 注:詞林正韻?七部(仄) —...
    素月離竹閱讀 139評論 0 0