DOM(文檔對象模型)是針對HTML文檔的一個API,描繪了一個層次化的節點樹,能夠添加、移除、修改頁面的某一部分。javascript
一個簡單的文檔結構css
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> </body> </html>
這個簡單的HTML文檔表示一個層次結構。文檔節點是每一個文檔的根節點。文檔節點只有一個子節點<html>,稱爲文檔元素。html
1. Node類型java
DOM1定義了一個Node 接口,該接口由DOM中的全部節點類型實現。node
nodeType 節點類型瀏覽器
1:元素節點app
2:屬性節點dom
3:文本節點ui
9:文檔節點this
nodeName 元素節點中爲標籤名
nodeValue 元素節點中爲null
childNodes
parentNode 父節點
previousSibling 上一個節點
nextSibling 下一個節點
firstChild 第一個節點
lastChild 最後一個節點
appendChild 向節點列表末尾添加一個節點
insertBefore 插入一個節點到參考節點的前面
replaceChild 要插入的節點替換參考節點的位置
removeChild 移除一個節點
2. Document類型
documentElement指向HTML頁中的<html>元素
document.documentElement 取得<html>的引用
document.body 取得<body>的引用
document.title 取得<title>標題
document.url 取得完整的URL
document.domain 取得域名
document.referrer 取得來源頁的URL
document.getElementById() 根據ID找到元素
document.getElementsByTagName() 根據標籤名找到一組元素
document.forms 取得全部的<form>元素
document.images 取得全部的<img>元素
document.links 取得全部帶href的<a>元素
document.write() 寫入文本到輸出流
3. Element類型
nodeName / tagName 訪問元素的標籤名
nodeName是node 接口上的property,而tagName是element 接口上的property,全部的節點(元素節點,屬性節點,文本節點等12種)都繼承了node接口,而只有元素節點才繼承了element節點,所以nodeName比tagName具備更大的使用範圍。
tagName只能用在元素節點上,而nodeName能夠用在任何節點上,能夠說nodeName涵蓋了tagName,而且具備更多的功能。
id 元素在文檔中的惟一標識符
title 有關元素的附加說明信息
className 元素的css類名
getAttribute() setAttribute() removeAttribute()
HTML5規範,自定義特性應該加上 data- 前綴
任何元素的全部特性,均可以經過DOM元素自己的屬性累訪問(只有公認的特性纔會以屬性的形式添加到DOM 對象中)。
元素公認的特性使用自己屬性訪問,自定義特性使用getAttribute()
全部特性都是屬性,屬性可使用setAttribute()來設置,自定義特性也同樣。
document.createElement() 建立元素
4. Text類型
document.createTextNode() 建立文本節點
5. DocumentFragment類型
documentFragment在文檔中沒有對應的標記。DOM規定文檔片斷是一種「輕量級」的文檔。
-------------------------------------------------------------------
1. 動態腳本
function loadJS(url) { var doc = document, s = doc.createElement('script'), head = doc.getElementsByTagName('head')[0]; s.type = 'text/javascript'; s.src = url; head.appendChild(s); } function loadJS(url, callback) { var doc = document, s = doc.createElement('script'), head = doc.getElementsByTagName('head')[0]; s.type = 'text/javascript'; if (s.readyState) { s.onreadystatechange = function() { if (s.readyState == 'loaded' || s.readyState == 'complete') { s.onreadystatechange = null; callback && callback(); } }; } else { s.onload = function() { callback && callback(); }; } s.src = url; head.appendChild(s); }
2. 動態樣式
function loadCSS(url) { var doc = document, link = doc.createElement('link'), head = doc.getElementsByTagName('head')[0]; link.type = 'text/css'; link.href = url; head.appendChild(link); } function addCSS(css) { var doc = document, style = doc.createElement('style'), head = doc.getElementsByTagName('head')[0]; style.type = 'text/css'; try { style.appendChild(document.createTextNode(css)); } catch (ex) { style.styleSheet.cssText = css; }; head.appendChild(style); } //addCSS(' div{font-size:100px;} .top{color:red;} ');
----------------------------------------------------------------------
1. Selectors API
querySelector()
querySelectorAll()
Document DocumentFragment Element能夠調用selector API.
2. Element Traversal API
------------------------------------------------------
1. getElementsByClassName()
function getClass(c, n, t) { if (document.getElementsByClassName) return (n || document).getElementsByClassName(c); var arr = [], re = new RegExp('(^| )' + c + '( |$)'), els = (n || document).getElementsByTagName(t || '*'), i = 0, l = els.length; for (; i < l; i++) { if (re.test(els[i].className)) arr.push(els[i]); } return arr; }
2. classList
3. 焦點管理
document.activeElement 指向DOM中得到了焦點的元素
得到焦點:頁面載入 用戶輸入 調用focus()
document.hasFocus() 肯定文檔是否得到了焦點
4. HTMLDocument變化
document.readyState
loading 正在加載
complete 加載完成
5. 兼容模式
document.compatMode
CSS1Compat 標準模式
BackCompat 混雜模式
6. head 字符集
document.head 取得<head>元素
document.charset 取得文檔中使用的字符集 或者 設置新的字符集
document.defaultCharset 根據默認瀏覽器及操做系統的設置當前文檔的字符集
7. 自定義數據屬性
HTML5規定能夠爲元素添加非標準的屬性,但要添加前綴 data-
<div id="test" data-appid="123" data-name="test"></div> var test = document.querySelector('#test'); console.log( test.dataset.appid ) //123 console.log( test.dataset.name ) //test
8. 插入標記
innerHTML
outerHTML
insertAdjacentHTML()
9. 控制頁面滾動
scrollIntoView()
10. 文檔模式(IE)
document.documentMode (IE8+)
<meta http-equiv="X-UA-Compatible" content="IE=edge">
11. 子節點
children 全部元素子節點
childNodes 全部子節點 包括空白節點
12. 後代
contains() 某個節點是否是一個節點的後代
function contains(o, p) { if (p.contains) { return p.contains(o); } else if (p.compareDocumentPosition) { return !!(p.compareDocumentPosition(o) & 16); } }
12. 插入文本
innerText
function text(o, v) { var len = arguments.length; if (len == 1) return o.innerText || o.textContent; if (len == 2) o.innerHTML = v; return this; }
13. 樣式
getComputedStyle
function getStyle(o, n) { return o.currentStyle ? o.currentStyle[n] : getComputedStyle(o, null)[n]; }
14. 偏移量
15. 客戶區大小
clientWidth 元素內容區寬度+左右內邊距寬度
clientHeight 元素內容區高度+左右內邊距高度
16. 滾動大小
17. 元素大小 位置
getBoundingClientRect()
left top right bottom
...
遍歷接口 範圍接口......
-------------------------------------------------------------
第10章介紹了DOM節點以及操做節點,11章介紹了新的DOM API以及瀏覽器專有的API:選擇器,焦點,加載等;12章介紹了比較有用的的DOM API:樣式處理,遍歷,範圍等。