DOM擴(kuò)展

以下內(nèi)容總結(jié)自《JS高級(jí)程序設(shè)計(jì)》第三版


DOM作為API已經(jīng)很完善了,但是為了實(shí)現(xiàn)更多功能,仍然會(huì)有一些屬于瀏覽器的專屬擴(kuò)展。
在經(jīng)過(guò)時(shí)間的檢驗(yàn)后,W3C將一些專有擴(kuò)展標(biāo)準(zhǔn)化并寫入規(guī)范中绘搞。
而對(duì)DOM的擴(kuò)展標(biāo)準(zhǔn)化主要有兩個(gè)方面

  1.  Selectors API  (選擇符API)
  2.  HTML5

此外,還有一個(gè)次要的規(guī)范

 Element Traversal (元素遍歷)

下面就來(lái)說(shuō)說(shuō)這幾個(gè)東西傅物。

一夯辖、 選擇符API

選擇符API有兩個(gè)核心的方法 :quertSelector()和querySelectorAll()

1. querySelector() 方法

參數(shù): 1. CSS選擇符
返回值: 返回匹配到的第一個(gè)元素。找不到返回null

例:

//  取得body元素
let body = documnet.querySelector('body')

// 取得id為'myDiv'的元素
let div = documnet.querySelector('#mydiv')

// 取得class為'selected'的第一個(gè)元素
let div = documnet.querySelector('.selected')

// 取得class為'button'的第一個(gè)圖像元素
let div = documnet.querySelector('img')

在上面我們使用的是document對(duì)象董饰,當(dāng)然我們也可以使用Element類型的對(duì)象蒿褂,只是查找范圍縮小到了element對(duì)象之內(nèi)。

2卒暂、querySelectorAll() 方法

參數(shù):   1. CSS選擇符
返回值:  匹配元素集合啄栓,NodeList類型。匹配不到時(shí)也祠,NodeList是空的昙楚。

和querySelector相比參數(shù)相同,querySelector只能返回匹配到的第一個(gè)诈嘿,querySelectorAll能返回所有匹配的元素堪旧。

二、元素遍歷

元素遍歷為DOM添加了5個(gè)屬性

  • childElementCount: 返回子元素(不包括文本節(jié)點(diǎn)和注釋)的個(gè)數(shù)
  • firstElementChild: 指向第一個(gè)子元素永淌,firstChild的元素版
  • lastElementChild: 指向最后一個(gè)子元素崎场,lastChild的元素版
  • previousElementSibling: 指向前一個(gè)同輩份的元素佩耳,previousSibling的元素版
  • nextElementSibling: 指向后一個(gè)同輩份的元素遂蛀,nextSibling的元素版

這五個(gè)屬性,是為了彌補(bǔ)不同瀏覽器之間的差異而添加的干厚。

三李滴、HTML5

HTML5是HTML的升級(jí)版,來(lái)看看對(duì)比吧

HTML: 主要定義標(biāo)記蛮瞄,與JavaScript相關(guān)的內(nèi)容交給DOM規(guī)范去定義所坯。
HTML5:圍繞何如使用新增標(biāo)記定義了大量的JavaScript的API。

1挂捅、與類相關(guān)的擴(kuò)充

此類擴(kuò)充能夠?yàn)樵靥砑訕邮胶筒僮髟亍?/p>

1.1 getElementsByCLassName()

參數(shù): 1. 包含一個(gè)或多個(gè)類名的字符串
返回值:匹配到的元素集合芹助,NodeList類型

1.2 classList

classList是新增的一個(gè)操作類名的屬性
來(lái)看看和className 的區(qū)別

className:
返回值:字符串
作用: 添加、刪除和替換類名。
classList:
返回值:類名集合状土,DomTokenList類型
作用: 同className

classList有四個(gè)方法來(lái)操作類名集合

  • add(value): 將給定的字符串添加到列表中无蜂。如果值已存在,就不添加再扭。
  • contains(value):表示列表中是否存在給定的值碎连,如果存在返回true减余,沒有返回false
  • remove(value):從列表中刪除指定的字符串
  • remove(value):如果列表中已經(jīng)存在給定的值,刪除酣倾;如果不存在,添加谤专。

classList比className操作更加簡(jiǎn)單躁锡,推薦使用。

2毒租、焦點(diǎn)管理

HTML5添加了輔助管理DOM焦點(diǎn)的功能稚铣,分別是一個(gè)屬性和一個(gè)方法。

  • 屬性 document.activeElement

返回值:當(dāng)前獲得焦點(diǎn)的元素墅垮。
元素獲得焦點(diǎn)的方式有頁(yè)面加載惕医、用戶輸入和在代碼中調(diào)用focus()方法。

  • 方法 element.hasFocus()

參數(shù):無(wú)
返回值: 檢測(cè)元素是否獲得焦點(diǎn)算色。

3抬伺、HTMLDocument的變化

HTML5擴(kuò)展了HTMLDocument屬性,增加了新的功能灾梦。

3.1 redayState屬性

可能的值:

  • loading:正在加載文檔峡钓。
  • complete:已經(jīng)加載完文檔。

使用場(chǎng)景:
代替onload事件若河。

3.2 兼容模式(compatMode屬性)

該屬性能夠區(qū)分渲染頁(yè)面的模式是標(biāo)準(zhǔn)的還是混雜的

返回值:
1. CSS1Compat :標(biāo)準(zhǔn)模式
2. BackCompat: 混雜模式

3.4 字符集屬性
  • charset屬性

默認(rèn)值:UTF-16

我們可以直接修改這個(gè)屬性來(lái)改變文檔字符集

document.charset = 'UTF-8'

還可以通過(guò)另外兩種方法來(lái)修改字符集

設(shè)置<meta>元素
設(shè)置響應(yīng)頭部

  • defaultCharset 屬性
    表示根據(jù)默認(rèn)瀏覽器及操作系統(tǒng)的設(shè)置能岩,當(dāng)前文檔默認(rèn)的字符集應(yīng)該是什么。如果文檔沒有使用默認(rèn)的字符集萧福,那charset和defaultCharset屬性的值可能會(huì)不一樣拉鹃。
3.5 自定義屬性數(shù)據(jù)

我們可以為元素添加非標(biāo)準(zhǔn)的屬性,也就是自己定義屬性鲫忍。

注意: 自定義屬性需要添加前綴 data-

  • 應(yīng)用場(chǎng)景:
    需要通過(guò)元素存取數(shù)據(jù)時(shí)使用膏燕。
3.6 插入標(biāo)記

通過(guò)插入標(biāo)記,我們能夠簡(jiǎn)化一堆DOM節(jié)點(diǎn)再按照順序插入到頁(yè)面的這種特別麻煩的操作悟民。

3.6.1 innerHTML屬性

讀模式:返回調(diào)用元素的所有子節(jié)點(diǎn)(包括元素坝辫、注釋和文本節(jié)點(diǎn)對(duì)應(yīng)的HTML標(biāo)記)
寫模式:根據(jù)傳入的值(字符串)創(chuàng)建新的DOM樹,替換調(diào)用元素的所有子節(jié)點(diǎn)射亏。

  • 注意
  • 不同瀏覽器的innerHTMl返回值會(huì)不同近忙。
    IE和Opera將所有標(biāo)簽轉(zhuǎn)成大寫形式竭业,其他瀏覽器不會(huì)干這事
  • innerHTMl寫模式不會(huì)執(zhí)行寫入的<script>腳本。(IE8或更早版本可以)

3.6.2 outerHTML屬性

讀模式: 返回調(diào)用它的元素和所有子節(jié)點(diǎn)的HTML標(biāo)簽及舍。
寫模式: 根據(jù)指定的HTML字符串創(chuàng)建新的DOM子樹永品,然后替換調(diào)用元素。

和innerHTMl的區(qū)別击纬,就是把調(diào)用元素也計(jì)算在內(nèi)了鼎姐。

3.6.3 insertAdjacentHTML() 方法
這個(gè)方法也可以插入標(biāo)記。

參數(shù):

  1. 指定值更振。
    beforebegin:在當(dāng)前元素之前插入一個(gè)緊鄰的同輩元素
    afterbegin:在當(dāng)前元素之下插入一個(gè)新的子元素或在第一個(gè)子元素之前插入新的元素
    beforeend:在當(dāng)前元素之下插入一個(gè)新的子元素或在最后的子元素之后插入新的元素
    afterend:在當(dāng)前元素之后插入一個(gè)緊鄰的同輩元素

3.6.4 內(nèi)存和性能問題

  • 刪除帶有事件處理程序或引用了其他JavaScript對(duì)象子樹時(shí)炕桨,可能會(huì)導(dǎo)致內(nèi)存占用問題。所以刪除前最好手動(dòng)清空所有的事件處理沖和和JavaScript對(duì)象屬性肯腕。
  • 合理使用innerHtml献宫,一次性傳入多個(gè)標(biāo)簽代替多次傳入標(biāo)簽。
3.7 scrollIntoView() 方法

這個(gè)方法用來(lái)控制頁(yè)面滾動(dòng)实撒。所有的HTML元素都可以調(diào)用

參數(shù):1. true或不傳姊途,窗口滾動(dòng)到元素頂部和視口頂部平齊的位置
false,調(diào)用元素會(huì)盡可能的出現(xiàn)在視口中知态。

4 專有擴(kuò)展

專有擴(kuò)展雖然沒有加入到規(guī)范中捷兰,但還是有幾個(gè)比較常用的。

4.1 children屬性

該屬性返回調(diào)用元素的元素子節(jié)點(diǎn)负敏,而childNode屬性返回所有子節(jié)點(diǎn)贡茅。

4.2 contains() 方法

查看某個(gè)節(jié)點(diǎn)是否是另外一個(gè)節(jié)點(diǎn)的子節(jié)點(diǎn)

參數(shù):要檢測(cè)的子節(jié)點(diǎn)
返回值: ture|false

另外還有一個(gè)compareDocumentPosition() 方法也可以確定節(jié)點(diǎn)關(guān)系。

參數(shù):要檢測(cè)的節(jié)點(diǎn)
返回值:1:無(wú)關(guān) 2:居前 :4:居后 8:包含 16:被包含

4.3 插入文本

4.3.1 innerText屬性
通過(guò)該屬性能夠操作元素中包含的所有文本內(nèi)容其做。

讀模式: 返回個(gè)字符串顶考,每個(gè)文本節(jié)點(diǎn)中的文字通過(guò)換行的方式連接。
寫模式: 傳入字符串即可妖泄。會(huì)替換調(diào)用元素的所有子元素驹沿。

  • 應(yīng)用:
    大家可以通過(guò)document.body.innerText來(lái)查看當(dāng)前頁(yè)面的body內(nèi)的所有文本元素。

  • textContent
    和innerText作用類似蹈胡,但textContent會(huì)返回行內(nèi)樣式和腳本代碼渊季,innerText只會(huì)返回文本內(nèi)容。

4.3.1 outerText屬性
除了作用范圍擴(kuò)大到了調(diào)用元素之外审残,和innerText沒有區(qū)別

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梭域,一起剝皮案震驚了整個(gè)濱河市斑举,隨后出現(xiàn)的幾起案子搅轿,更是在濱河造成了極大的恐慌,老刑警劉巖富玷,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璧坟,死亡現(xiàn)場(chǎng)離奇詭異既穆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)雀鹃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門幻工,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人黎茎,你說(shuō)我怎么就攤上這事囊颅。” “怎么了傅瞻?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵踢代,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我嗅骄,道長(zhǎng)胳挎,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任溺森,我火速辦了婚禮慕爬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屏积。我一直安慰自己医窿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布炊林。 她就那樣靜靜地躺著留搔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铛铁。 梳的紋絲不亂的頭發(fā)上隔显,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音饵逐,去河邊找鬼括眠。 笑死,一個(gè)胖子當(dāng)著我的面吹牛倍权,可吹牛的內(nèi)容都是我干的掷豺。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼薄声,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼当船!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起默辨,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤德频,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后缩幸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壹置,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡竞思,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钞护。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盖喷。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖难咕,靈堂內(nèi)的尸體忽然破棺而出课梳,到底是詐尸還是另有隱情,我是刑警寧澤余佃,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布惦界,位于F島的核電站,受9級(jí)特大地震影響咙冗,放射性物質(zhì)發(fā)生泄漏沾歪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一雾消、第九天 我趴在偏房一處隱蔽的房頂上張望灾搏。 院中可真熱鬧,春花似錦立润、人聲如沸狂窑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泉哈。三九已至,卻和暖如春破讨,著一層夾襖步出監(jiān)牢的瞬間丛晦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工提陶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烫沙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓隙笆,卻偏偏與公主長(zhǎng)得像锌蓄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撑柔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349