節(jié)點(diǎn)
節(jié)點(diǎn)類型
每個節(jié)點(diǎn)都有一個 nodeType 屬性,用于表示節(jié)點(diǎn)類型。nodeType 屬性返回節(jié)點(diǎn)的類型。nodeType 是只讀的。常用的節(jié)點(diǎn)類型如下圖所示(圖片摘自MDN)

節(jié)點(diǎn)關(guān)系
-
childNodes 屬性以 NodeList 對象返回節(jié)點(diǎn)的子節(jié)點(diǎn)集合。NodeList 是一種類數(shù)組對象,用于保存一組有序的節(jié)點(diǎn)。NodeList 對象是基于 DOM 結(jié)構(gòu)動態(tài)執(zhí)行查詢的結(jié)果,因此 DOM 結(jié)構(gòu)的變化能夠自動反映在 NodeList 對象中。
var firstChild = someNode.childNodes[0]; var len = someNode.length; firstChild 屬性和 lastChild 屬性分別返回指定節(jié)點(diǎn)的第一個和最后一個子節(jié)點(diǎn)。
parentNode 屬性返回指定節(jié)點(diǎn)的父節(jié)點(diǎn)。
-
previousSibling 屬性和 nextSibling 屬性分別返回指定節(jié)點(diǎn)的上一個和下一個同級節(jié)點(diǎn) node.png
Node.contains(otherNode) 來表示傳入的節(jié)點(diǎn)是否為該節(jié)點(diǎn)的后代節(jié)點(diǎn) Node.compareDocumentPosition(otherNode ) 方法用于比較當(dāng)前節(jié)點(diǎn)與文檔中的另一個節(jié)點(diǎn)的位置關(guān)系 Node.hasChildNodes() 方法用于判斷當(dāng)前節(jié)點(diǎn)是否有子節(jié)點(diǎn),返回一個布爾值
操作節(jié)點(diǎn)
-
appendChild() 方法用于向 childNodes 列表的末尾插入一個節(jié)點(diǎn)。添加節(jié)點(diǎn)后,相關(guān)節(jié)點(diǎn) DOM 結(jié)構(gòu)得到更新,更新完成后返回新增的節(jié)點(diǎn)。
// someNode 有多個子節(jié)點(diǎn) var returnedNode = someNode.appendChild(someNode.firstChild); alert((returnedNode = someNode.firstChild)); //false alert((returnedNode = someNode.lastChild)); //true -
insertBefore() 方法用于向 childNodes 列表的特定位置插入一個節(jié)點(diǎn),并返回被插入的節(jié)點(diǎn)。這個方法接受兩個參數(shù):要插入的節(jié)點(diǎn)和作為參照的節(jié)點(diǎn)。被插入的節(jié)點(diǎn)將變成參照節(jié)點(diǎn)的前一個同胞節(jié)點(diǎn)(previousSibling)。 若參照節(jié)點(diǎn)是 null,則 insertBefore() 與 appendChild()執(zhí)行相同的操作。
// 插入到最后一個子節(jié)點(diǎn)前面 returnedNode = someNode.insertBefore(newNode, someNode.lastChild); alert(newNode == someNode.childNodes[someNode.childNodes.length - 2]); //ture -
replaceChild() 方法用新節(jié)點(diǎn)替換某個子節(jié)點(diǎn),并返回要替換的節(jié)點(diǎn)。這個方法接受兩個參數(shù):插入的新節(jié)點(diǎn)和要替換的節(jié)點(diǎn)。
// 替換第一個子節(jié)點(diǎn) var returnedNode = someNode.replaceChild(newNode, someNode.firstChild);注意:任何 DOM 節(jié)點(diǎn)都不能同時出現(xiàn)在文檔的多個位置。所以,如果以上的三個方法中要新插入的節(jié)點(diǎn)已經(jīng)是文檔的一部分了,那么這個新插入的節(jié)點(diǎn)將從原來的位置轉(zhuǎn)移到新位置。
-
removeChild() 方法用于移除節(jié)點(diǎn)。這個方法接受一個參數(shù):要移除的節(jié)點(diǎn)。
// 移除第一個子節(jié)點(diǎn) var formerFirstChild = someNode.removeChild(someNode.firstChild); -
ChildNode.remove() 方法把調(diào)用節(jié)點(diǎn)元素 ChildNode 從它所屬的 DOM 樹中刪除。
// id 為 'div-01' 的 div 被刪掉了 document.getElementById("div-01").remove(); cloneNode() 方法用于創(chuàng)建調(diào)用這個方法的節(jié)點(diǎn)的副本。此方法接受一個布爾值參數(shù),表示是否進(jìn)行深復(fù)制。深復(fù)制就是復(fù)制節(jié)點(diǎn)及其子節(jié)點(diǎn)樹;淺復(fù)制是只復(fù)制節(jié)點(diǎn)本身。復(fù)制后返回的節(jié)點(diǎn)副本沒有父節(jié)點(diǎn),屬于文檔中的一個“孤兒”,所以通常還會通過 appendChild()、insertBefore()或 replaceChild() 將它添加到文檔中。
normalize() 方法;規(guī)劃化元素內(nèi)的文本節(jié)點(diǎn)。如果在包含一個或多個文本節(jié)點(diǎn)的父元素上調(diào)用這個方法,則會將所有文本節(jié)點(diǎn)合并為一個節(jié)點(diǎn),合并之后的新的文本節(jié)點(diǎn)的 nodeValue 等于合并前的每個文本節(jié)點(diǎn)的 nodeValue 值拼接起來的值。(瀏覽器自身永遠(yuǎn)不會創(chuàng)建相鄰的文本節(jié)點(diǎn),這種一個元素包含多個文本節(jié)點(diǎn)的情況一般是在操作 DOM 時產(chǎn)生的)
文檔
var htmlEle = document.documentElemnet; // 取得對<html>元素的引用
var bodyEle = document.body; // 取得對<body>元素的引用
var headEle = document.head || document.getElementsByTagName("head")[0]; //取得對<head>的引用;
var title = document.title; //取得文檔標(biāo)題
document.title = "new title"; //修改當(dāng)前頁面的標(biāo)題
var charset = document.charset; // 取得文檔中實(shí)際使用的字符集
document.charset = "UTF-8"; // 修改文檔字符集
var url = document.URL; //取得完整的URL(即地址欄中顯示的URL)*只讀*
var domain = document.domain; //取得頁面的域名
var referrer = document.referrer; //取得鏈接到當(dāng)前頁面的那個頁面的URL *只讀*
var doc_state = document.readyState; // 取得文檔的當(dāng)前狀態(tài)(有兩個可能的值:loading 和 complete)*只讀*
var focus_ele = document.activeElement; //取得文檔中當(dāng)前獲得焦點(diǎn)的元素 *只讀*
var if_focus = document.hasFocus(); //取得用于檢測文檔是否獲取焦點(diǎn)的布爾值。
元素
通過 nodeName 或 tagName 屬性訪問元素的標(biāo)簽名。每個 HTML 元素都有下列屬性: id, title, dir, dir(語言的方向), className
alert(document.body.tagName); // "BODY"
插入標(biāo)記
innerHTML 屬性
在讀模式下,此屬性返回與調(diào)用元素的所有子節(jié)點(diǎn)(包括元素、注釋、文本節(jié)點(diǎn))對應(yīng)的 HTML 標(biāo)記 寫模式下,innerHTML 會根據(jù)指定的值創(chuàng)建新的 DOM 樹,然后用這個 DOM 樹完全替換調(diào)用元素原先的所有子節(jié)點(diǎn)。(通過 innerHTML 屬性插入的script元素不會執(zhí)行其中的腳本)insertAdjacentHTML( position,text) 方法
這個方法接受兩個參數(shù):插入位置和要插入的 HTML 文本。第一個參數(shù)的可能值為:"beforebegin"," afterbegin","beforeend","afterend"。
注意: beforebegin 和 afterend 位置,僅在節(jié)點(diǎn)在樹中且節(jié)點(diǎn)具有一個 parent 元素時工作
// 作為前一個同輩元素插入
element.insertAdjacentHTML("beforebegin", "<p>hello world !</p>");
// 插入元素內(nèi)部的第一個子節(jié)點(diǎn)之前。
element.insertAdjacentHTML("afterbegin", "<p>hello world !</p>");
// 插入元素內(nèi)部的最后一個子節(jié)點(diǎn)之后。
element.insertAdjacentHTML("beforeend", "<p>hello world !</p>");
// 作為后一個同輩元素插入
element.insertAdjacentHTML("afterend", "<p>hello world !</p>");
- insertAdjacentElement(position, element)
這個方法接受兩個參數(shù):插入位置和要插入的元素節(jié)點(diǎn),此方法將一個給定的元素節(jié)點(diǎn)插入到相對于被調(diào)用的元素的給定的一個位置,返回插入的元素,插入失敗則返回 null.
注意: 當(dāng)節(jié)點(diǎn)處于 DOM 樹中而且有一個父元素的時候 beforebegin 和 afterend 操作才能起作用。
插入文本
textContent 屬性
Node.textContent 屬性可以表示一個節(jié)點(diǎn)及其內(nèi)部節(jié)點(diǎn)的文本內(nèi)容。
讀模式下,textContent 會由淺入深將子文檔樹中的所有文本拼接起來。寫模式下,會刪除元素的所有子節(jié)點(diǎn),插入包含相應(yīng)文本值得文本節(jié)點(diǎn)。insertAdjacentText ( position,text) 方法
此方法和 insertAdjacentHTML() 方法用法相同,不過是第二個參數(shù)只能是純文本。
元素屬性
<!-- 以下面這個元素為例 -->
<div
id="my_div"
class="bd"
title="body_text"
my_attr="hello"
data-appId="123"
></div>
var div = document.getElementById("my_div"); // 取得對上面元素的引用
- 獲取元素屬性的數(shù)量
通過元素的 attributes.length 屬性 獲取屬性數(shù)量
var len = div.attributes.lenght;
- 刪除元素屬性
removeAttribute() 方法 用于徹底刪除元素屬性;
div.removeAttribute("title"); //刪除 title 屬性
- 獲取并操作屬性
方法 1: 通過元素自身直接獲取、修改和添加屬性
// 獲取元素屬性
var class = div.className;
var id = div.id;
// 修改元素屬性
div.title = "some other text";
// 添加元素屬性
div.lang= "en";
方法 2(推薦): 通過 getAttribute() 方法 獲取屬性, setAttribute() 方法 修改和添加屬性
//獲取元素屬性
var title = div.getAttribute("title");
var my_attr = div.getAttribute("my_attr");
// 修改元素屬性
div.setAttribute("class", "ft");
div.setAttribute("my_attr", "hi");
// 給添加屬性
div.setAttribute("lang", "en");
div.setAttribute("my_name", "Tom");
上述兩種方法的區(qū)別:方法 2 既可以獲取標(biāo)準(zhǔn)的屬性還可以獲取自定義屬性,而方法 1 只能訪問標(biāo)準(zhǔn)的屬性無法訪問自定義屬性。
- 自定義數(shù)據(jù)屬性
還可以通過元素的 dataset 屬性 來獲取和修改自定義屬性的值
var appId = div.dataset.appId; // 取得自定義屬性的值
div.dataset.appId = "234"; // 修改自定義屬性的值
創(chuàng)建元素
var div = document.createElement("div"); // 創(chuàng)建一個<div>元素
由于新創(chuàng)建的元素屬于文檔中的一個“孤兒”,所以通常還會通過 appendChild()、insertBefore()或 replaceChild() 將它添加到文檔中。
獲取對元素的引用
- 取得對文檔的子元素節(jié)點(diǎn)的引用
var head = document.head || document.getElementsByTagName("head")[0]; //取得對<head>的引用
var html = document.documentElement; //取得對<html>的引用
var body = document.body; //取得對<body>的引用
- 取得對特定的某個或某組元素的引用
getElementById() 方法 無法通過 HTML 元素調(diào)用該方法
getElementsByClassName() 方法 接收一個包含一或多個類名的字符串作為參數(shù),返回帶有指定類名的所有元素的 Nodelist 集合。
var eles = document.getElementByClassName("btn banner"); // 取得所有類中包含“btn”和“banner”的元素
getElementsByTagName() 方法 返回帶有指定標(biāo)簽名的對象的集合。
var all_ele = document.getElementsByTagName("*"); //取得文檔中的所有元素
var images = document.getElementsByTagName("img"); //取得頁面中所有的<img>元素
alert(images.length); //輸出<img>元素的數(shù)量
alert(images[0].src); //輸出第一個圖片元素的src屬性
getElementsByName() 方法; 返回帶有指定名稱的對象的集合,該方法常用于取得單選按鈕。無法通過 HTML 元素調(diào)用該方法。
querySelector() 方法 querySelector() 方法接收一個 CSS 選擇符作為參數(shù),返回與該模式匹配的第一個元素。如果沒有找到匹配的元素,則返回 null
var p_first = document.querySelector("p"); //獲取文檔中第一個<p> 元素
var example = document.querySelector(".example"); // 獲取文檔中 class="example" 的第一個元素
var p_example = document.querySelector("p.example"); //獲取文檔中 class="example" 的第一個<p>元素
var a_target = document.querySelector("a[target]"); // 獲取文檔中有"target"屬性的第一個<a>元素
var p_em = document.querySelector("p em"); // 獲取文檔中第一個<p>元素內(nèi)的第一個<em>元素
querySelectorAll() 方法 querySelectorAll() 方法接收一個 CSS 選擇符作為參數(shù),返回與該模式匹配的所有元素的集合。
元素關(guān)系
- children 屬性 元素的 children 屬性中只包含元素中同樣還是元素的子節(jié)點(diǎn);childNodes 的元素版。
- childElementCount 屬性 返回子元素(不包括注釋和文本節(jié)點(diǎn))的個數(shù)
- firstElementChild 屬性 指向第一個子元素;firstChild 的元素版
- lastElementChild 屬性指向最后一個子元素;lastChild 的元素版
- previousElementSibling 屬性指向前一個同級元素;previousSibling 的元素版
- nextElementSibling 屬性指向后一個同級元素;nextSibling 的元素版
- parentElement 屬性 返回當(dāng)前節(jié)點(diǎn)的父元素節(jié)點(diǎn),如果該元素沒有父節(jié)點(diǎn),或者父節(jié)點(diǎn)不是一個元素節(jié)點(diǎn).則 返回 null
操作元素
- hasFocus() 方法 返回布爾值,用于檢測文檔(或文檔內(nèi)的任一元素)是否獲得焦點(diǎn)。
- matchesSelector() 方法 接收一個 CSS 選擇符作為參數(shù),如果調(diào)用函數(shù)與該選擇符匹配,返回 true;否則,返回 false。
元素樣式
classList 屬性返回元素的 class 類名列表集合,返回的列表集合也有一個 length 屬性來表示類的個數(shù),該屬性用于在元素中添加,移除及切換 CSS 類。classList 屬性是只讀的,但可以使用下面的方法修改它。
- add(value): 將給定的字符串值添加到列表中。如果值已經(jīng)存在,則不添加。
- contains(value): 表示列表中是否存在給定的值,如果存在則返回 true,否則返回 false。
- remove(value): 從列表中刪除給定的字符串。
- toggle(value): 如果列表中已經(jīng)存在給定的值則刪除它;如果列表中沒有給定的值則添加它。
文本
- 通過 nodeValue 或 data 屬性 獲取文本節(jié)點(diǎn)的內(nèi)容。
- 通過 length 屬性 獲取文本節(jié)點(diǎn)中字符的數(shù)目。
- 使用 document.createTextNode() 創(chuàng)建新文本節(jié)點(diǎn)
- 使用 Element.innerText 屬性獲取節(jié)點(diǎn)及其后代的“渲染”文本內(nèi)容
- 使用 Node.textContent 屬性獲取節(jié)點(diǎn)及其后代的文本內(nèi)容
// 創(chuàng)建一個<div>元素并向其中添加一個文本節(jié)點(diǎn)
var ele = document.createElement("div");
ele.className = "message";
var text = document.createTextNode("hello world");
ele.appendChild(text);
document.body.appendChild(ele);
操作文本
- appendData(text): 將 text 添加到節(jié)點(diǎn)的末尾。
- deleteDate(offset, count): 從 offset 指定的位置開始刪除 count 個字符。
- insertData(offset, text): 在 offset 指定的位置插入 text。
- replaceData(offset, count, text): 用 text 替換從 offset 指定的位置開始到 offset+count 為止處的文本。
- substringData(offset, count): 提取從 offset 指定的位置開始到 offset+count 為止處的字符串。
- splitText(offset): 從 offset 指定的位置將當(dāng)前文本節(jié)點(diǎn)分成兩個文本節(jié)點(diǎn)。
分割文本節(jié)點(diǎn)是從文本節(jié)點(diǎn)中提取數(shù)據(jù)的一種常用的 DOM 技術(shù)。
// 以上面創(chuàng)建的<div>元素為例
// 分割文本節(jié)點(diǎn)
var newNode = ele.firstChild.splitText(5);
alert(ele.firstChild.nodeValue); // "hello"
alert(newNode.nodeValue); //" world"
alert(ele.childNodes.length); // 2
樣式
通過 style 對象獲取并操作元素的內(nèi)聯(lián)樣式
這個 style 對象包含著通過元素 style 屬性設(shè)置的內(nèi)聯(lián)樣式信息,不包含外部樣式表或嵌入樣式表繼承層疊而來的樣式。
- style 對象的一些屬性和方法 :
cssText: 讀模式下返回 style 屬性中 CSS 代碼的內(nèi)部表示;寫模式下,賦給 cssText 的值會重寫 元素 style 屬性的值。
length: 元素 style 屬性中的 css 屬性數(shù)量
parentRule: 表示 css 信息的 CSSRule 對象
getPropertyValue(propertyName): 返回給定屬性的字符串值
item(index): 返回給定位置的 css 屬性的名稱
removePropertyValue(propertyName): 從元素 style 屬性中刪除給定屬性
setProperty(propertyName,value,priority): 將給定屬性設(shè)置為相應(yīng)的值,并加上優(yōu)先權(quán)標(biāo)志(“important” 或者一個空字符串)
- 通過document.defaultView.getComputedStyle()獲取元素的計算樣式
此方法接受兩個參數(shù):目標(biāo)元素和一個偽元素字符串(例如":after"),如果不需要偽元素信息第二個參數(shù)可以為 null。
注意: 計算的樣式是只讀的;計算的樣式包含瀏覽器的默認(rèn)樣式。
