getElementById()
和 gettElementByTagName()
。querySelector()
方法querySelector()
方法接收一個CSS選擇符,返回與該模式匹配的第一個元素,若是沒有找到匹配的元素,返回null
。// 取得body元素 var body = document.querySelector("body"); // 取得ID爲「myDiv」的元素 var myDiv = document.querySelector("#myDiv"); // 取得類爲"selected"的第一個元素 var selected = document.querySelector(".selected"); // 取得類爲"button"的第一個圖像元素 var selected = document.querySelector("img.button");
querySelectorAll()
方法NodeList
的實例,若是沒有匹配,NodeList
就是空的。// 取得某div中全部em元素 var ems = document.getElementById("myDiv").querySelectorAll("em"); // 取得類爲「selected」的全部元素 var selected = document.querySelectorAll(".selected"); // 取得全部p元素中的全部strong元素 var strongs = document.querySelectorAll("p strong");
NodeList
中的每個元素,可使用item()
方法,也可使用方括號語法。matchesSelector()
方法matchesSelector()
方法。接收一個參數,即CSS選擇符,若是調用元素與該選擇符匹配返回true,不然返回false。function matchesSelector(element, selector) { if (element.matchesSelecotr) { return element.matchesSelecotr(selector) } else if (element.msMatchesSelecotr) { return element.msMatchesSelecotr(selector) } else if (element.mozMatchesSelecotr) { return element.mozMatchesSelecotr(selector) } else if (element.webkitMatchesSelecotr) { return element.webkitMatchesSelecotr(selector) } else { throw new Error("Not supported."); } }
對於元素間的空格,IE9及以前版本不會返回文本節點,而其餘全部瀏覽器都會返回文本節點。爲了彌補這一差別,而又同時保持DOM規範不變,Element Traversal 規範新定義了一組屬性。javascript
childElementCount
: 返回子元素(不包括文本節點和註釋)的個數firstElementChild
: 指向第一個子元素;firstChild
的元素版lastElementChild
: 指向最後一個子元素;lastChild
的元素版previousElementSibling
: 指向前一個同輩元素;previousSibling
的元素版nextElementSibling
: 指向前一個同輩元素;nextSibling
的元素版// 跨瀏覽器遍歷某元素的全部子元素 // 老版的兼容性代碼 var i, len, child = element.firstChild; while(child != element.lastChild) { // 檢查是否是元素 if (child.nodeType == 1) { processChild(child); } child = child.nextSibling; } // 使用新版的方法 var i, len, child = element.firstChild; while(child != element.lastElementChild) { processChild(child); child = child.nextElementSibling; }
getElementsByClassName()
方法// 取得全部類中包含"username"和"current"的元素 // 類名的前後順序無所謂 var allCurrentUsernames = docment.getElementsByClassName("username current"); // 取得ID爲"myDiv"的元素中帶有類名"selected"的全部元素 var selected = document.getElementById("myDiv").getElemenstByClassName("selected");
getElementsByClassName()
方法的瀏覽器 IE9+ Firefox3+ Safari3.1+ Chrome Opera9.5+className
屬性添加、刪除和替換類名。由於className
中是一個字符串,因此即便只是修改字符串一部分,也必須每次都設置整個字符串的值。classList
屬性。classList
屬性是新集合類型 DOMTokenList的實例。與其餘DOM集合相似,DOMTokenList 有一個表示本身包含多少元素的length屬性,而要去的每一個元素可使用item()
方法,或者方括號語法。此外,這個新類型還定義以下方法:html
add(value)
: 將給定的字符串值添加到列表中。若是值已經存在,就不添加了。contains(value)
: 表示列表中是否存在給定的值,若是存在返回true,反之false。remove(value)
: 從列表中刪除給定的字符串。toggle(value)
: 若是列表中已經存在給定的值,刪除它;若是沒有,添加它。classList
屬性,除非你須要刪除全部類名,或者徹底重寫元素的class屬性,不然就用不到className
屬性了。classList
的瀏覽器 Firefox3.6+ Chromedocument.activeElement
屬性,始終會引用DOM中當前得到了焦點的元素。元素得到焦點的方式有頁面加載、用戶輸入(一般是經過Tab鍵)和在代碼中調用focus()
方法。var button = document.getElementById("myButton"); button.focus(); console.log(document.activeElement === button); // true
document.activeElement
中保存的是document.body
元素的引用。文檔加載期間,document.activeElement
的值爲null
document.hasFocus()
方法,這個方法用於肯定文檔是否得到了焦點。var button = document.getElementById("myButton"); button.focus(); console.log(document.hasFocus()); // true
Document.readyState
屬性有兩個可能的值:java
loading
正在加載文檔complete
已經加載完文檔if (document.readyState == "complete") { ... }
compatMode
的屬性,告訴開發人員瀏覽器採用了哪一種渲染模式。document.compatMode
標準模式下等於"CSS1Compat",混雜模式下等於"BackCompat"。if (document.compatMode == "CSS1Compat") { console.log("Standards mode"); } else { console.log("Quirks mode"); }
document.head
屬性,與docuemnt.body
對應var head = document.head || document.getElementsByTagName("head")[0];
charset
屬性表示文檔中實際使用的字符集,也能夠用來指定新字符集。默認值是"UTF-16",能夠經過<meta>
元素、響應頭部或直接設置charset
屬性修改這個值。document.Characterset
。console.log(document.charset); // "UTF-16" document.charset = "UTF-8";
defaultCharset
表示根據默認瀏覽器及操做系統的設置,當前文檔默認的字符集應該是什麼。若是文檔沒有使用默認的字符集,那charset
和defaultCharset
屬性值可能會不同。if (document.charset != document.defaultCharset) { console.log("Custom character set being used."); }
data-
,目的是爲元素提供與渲染無關的信息,或者提供語義信息。這些屬性能夠任意添加、隨便明明,只要以data-
開頭便可。<div id="myDiv" data-appId="12345" data-myname="Nicholas"></div>
dataset
屬性來訪問自定義屬性的值。dataset
屬性的值時DOMStringMap的實例,也就是一個名值對的映射。在這個映射中,每一個data-name
形式的屬性都會有一個對應的屬性,只不過屬性沒有data-
前綴。var div = document.getElementById("myDiv"); // 取得自定義屬性的值 var appId = div.dataset.appId; var myName = div.dataset.myname; // 設置值 div.dataset.appId = 2345; div.dataset.myname = "Michael"; // 有沒有"myname"值呢? if (div.dataset.myname) { console.log("Hello, " + div.dataset.myname); }
innerHTML
屬性返回與調用元素的全部子節點(包括元素、註釋和文本節點)對應的HTML標記。innerHTML
會根據指定的值建立新的DOM樹,而後用這個DOM樹徹底替換調用元素原先的全部子節點。<div id="content"> <p>This is a <strong>paragraph</strong> with a list following it.</p> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul> </div> <!-- 對於上面的div來講 innerHTML屬性會返回以下字符串 --> <p>This is a <strong>paragraph</strong> with a list following it.</p> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul>
innerHTML
的值都會按照瀏覽器處理HTML的標註方式轉換爲元素(一樣因瀏覽器而異)。若是設置的值僅是純文本而沒有HTML標籤,那麼結果就是設置純文本。div.innerHTML = "Hello world!"; div.innerHTML = "Hello & welcom, <b>\"reader\"!</b>"; // 以上操做獲得: <div id="content">Hello & welcome, <b>"reader"!</b></div>
使用innerHTML
屬性也有一些限制,大多數瀏覽器中經過innerHTML
插入<script>
元素並不會執行其中的腳本。IE8及更早的版本是惟一可以在這種狀況下執行腳本的瀏覽器,但必須知足2個條件:node
<script>
元素指定defer屬性<script>
元素必須位於(微軟所謂的)「有做用域的元素」(scoped element)以後。<script>
元素被認爲是「無做用域的元素」(NoScoped element),也就是在頁面中看不到的元素,與<style>
元素或註釋相似。沒有(不支持)innerHTML
屬性的元素有:web
<col>
<colgroup>
<frameset>
<head>
<html>
<style>
<table>
<tbody>
<thead>
<tfoot>
<tr>
<title>
元素也沒有application/xhtml+xml
的XHTML文檔中設置innerHTML
有嚴格的限制。在XHTML文檔中使用innerHTML
時,XHTML代碼必須徹底符合要求。outerHTML
返回調用它的元素及全部子節點的HTML標籤。outerHTML
會根據指定的HTML字符串建立新的DOM子樹,而後用這個DOM子樹徹底替換調用元素。<div id="content"> <p>This is a <strong>paragraph</strong> with a list following it.</p> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul> </div> <!-- 在div上調用outerHTML會返回相同的代碼,包括div自己 --> <div id="content"> <p>This is a <strong>paragraph</strong> with a list following it.</p> <ul> <li>Item 1</li> <li>Item 2</li> <li>Item 3</li> </ul> </div>
outerHTML
屬性,會替換調用的元素自己div.outerHTML = "<p>This is a paragraph.</p>"; // 上面的代碼等價於下面的代碼 var p = document.createElement("p"); p.appendChild(document.createTextNode("This is a paragraph.")); div.parentNode.replaceChild(p, div);
insertAdjacentHTML()
接收兩個參數:插入位置和要插入的HTML文本。第一個參數必須是下列之一:瀏覽器
// 做爲前一個同輩元素插入 element.insertAdjacentHTML("beforebegin", "<p>Hello world!</p>"); // 做爲第一個子元素插入 element.insertAdjacentHTML("afterbegin", "<p>Hello world!</p>"); // 做爲最後一個子元素插入 element.insertAdjacentHTML("beforeend", "<p>Hello world!</p>"); // 做爲後一個同輩元素插入 element.insertAdjacentHTML("afterend", "<p>Hello world!</p>");
innerHTML
outerHTML
insertAdjacentHTML()
時,最好先手工刪除要被替換的元素的全部事件處理程序和JavaScript對象屬性(第13章將進一步討論事件處理程序)。innerHTML
仍然仍是能夠爲咱們提供不少遍歷的。插入大量HTML標記時,設置innerHTML
或outerHTML
時就會建立一個HTML解析器,這個解析器是在瀏覽器級別的代碼(一般是C++編寫的)基礎上運行的,所以比執行JavaScript快的多。innerHTML
或outerHTML
的次數控制在合理的範圍內。scrollIntoView()
做爲標準方法。scrollIntoView()
能夠在全部HTML元素上調用,經過滾動瀏覽器窗口或某個容器元素,調用元素就能夠出如今視口中。安全
IE8引入了一個新的概念叫「文檔模式」(document mode)。頁面的文檔模式決定了可使用什麼功能。換言之,文檔模式決定了你可使用哪一個級別的CSS,能夠在JavaScript中使用哪些API,以及如何對待文檔類型(doctype)。到了IE9總有有如下4種文檔模式:app
X-UA-Compatible
或等價的<meta>
標籤來設置。<meta http-equiv="X-UA-Compatible" content="IE=IEVersion"> <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7"> <meta http-equiv="X-UA-Compatible" content="IE=7">
這裏的IE版本(IEVersion)有如下不一樣的值,不必定與上述4中文檔模式對應。函數
Edge
: 始終以最新的文檔模式來渲染頁面。忽略文檔類型聲明。EmulateIE9
: 若是有文檔類型聲明,則以IE9標準模式渲染,不然將文檔模式設置爲IE5。EmulateIE8
: 若是有文檔類型聲明,則以IE8標準模式渲染,不然將文檔模式設置爲IE5。EmulateIE7
: 若是有文檔類型聲明,則以IE7標準模式渲染,不然將文檔模式設置爲IE5。9
: 強制以IE9標準模式渲染頁面,忽略文檔類型聲明8
: 強制以IE8標準模式渲染頁面,忽略文檔類型聲明7
: 強制以IE7標準模式渲染頁面,忽略文檔類型聲明5
: 強制將文檔模式設置爲IE5,忽略文檔類型聲明document.documentMode
屬性能夠知曉給定頁面使用的是什麼文檔模式,它會返回文檔模式的版本號(在IE9中,可能返回的版本號爲五、七、八、9)children
屬性。這個屬性是HTMLCollection的實例,只包含元素中一樣仍是元素的子節點。除此以外,children
與 childNodes
沒有區別。children
屬性中也會包含註釋節點,但IE9以後的版本只返回元素節點。contains()
祖先節點調用這個方法,接收一個參數是要檢查的後代節點。若是祖先節點包含傳入的後代節點返回true,不然false。document.documentElement.contains(document.body); // true
compareDocumentPosition()
也可以肯定節點間的關係。掩碼 | 節點關係 |
---|---|
1 | 無關(給定的節點不在當前文檔中) |
2 | 居前(給定的節點在DOM樹中位於參考節點以前) |
4 | 居後(給定的節點在DOM樹中位於參考節點以後) |
8 | 包含(給定的節點是參考節點的祖先) |
16 | 包含(給定的節點是參考節點的後代) |
contains()
方法,應該關注的是掩碼16.能夠對compareDocumentPosition()
的結果執行按位與。var result = document.documentElement.compareDocumentPosition(document.body); console.log(!!(result & 16));
contains
函數:function contains(refNode, otherNode) { if (typeof refNode.contains == "function" && (!client.engine.webkit || client.engine.webkit >= 522)) { // 瀏覽器支持contains方法直接使用 return refNode.contains(otherNode); } else if (typeof refNode.compareDocumentPosition == "function") { // 瀏覽器支持compareDocumentPosition方法 // 用返回結果和16進行按位與,再轉換成布爾值返回 return !!(refNode.compareDocumentPosition(otherNode) & 16); } else { // 針對Safari設計的驗證方法 // 在文檔樹中向上遞歸驗證是否有refNode // 到達文檔樹頂端,parentNode 的值爲null,循環結束 var node = otherNode.parentNode; do { if (node === refNode) { return true; } else { node = node.parentNode; } } while (node !== null); return false; } }
IE原來有innerHTML
和outerHTML
已被HTML5歸入規範。但另外兩個插入文本的專有屬性則沒有這麼好的運氣。性能
innerText
outerText
scrollIntoView()
歸入規範後,仍有幾個專有方法能夠在不一樣瀏覽器中使用。下列都是對HTMLElement類型的擴展,所以在全部元素中均可以調用:
scrollIntoViewIfNeeded(alignCenter)
: 只在當前元素在視口中不可見的狀況下,才滾動瀏覽器窗口或容器元素,最終讓它可見。若是當前元素可見,這個方法什麼都不會作。若是將可選的alignCenter
參數設置爲true,則表示儘可能將元素顯示在視口中部(垂直方向)。Safari和Chrome實現了這個方法scrollByLines(lineCount)
: 將元素的內容滾動到指定的行高,lineCount
能夠是正值也能夠是負值。Safari和Chrome實現了這個方法scrollByPages(lineCount)
: 將元素的內容滾動到指定的頁面高度,具體高度由元素的高度決定。Safari和Chrome實現了這個方法scrollIntoView()
和scrollIntoViewIfNeeded()
的做用對象是元素的容器,而scrollByLines()
和scrollByPages()
影響的是元素自身// 將頁面主體滾動5行 document.body.scrollByLines(5); // 在當前元素不可見的時候,讓它進入瀏覽器的視口 document.images[0].scrollIntoViewIfNeeded(); // 將頁面主體往回滾動1頁 document.body.scrollByPages(-1);
scrollIntoView()
是惟一一個全部瀏覽器都支持的方法,所以最經常使用。