DOM 是 JavaScript 操做網頁的接口,全稱爲「文檔對象模型」(Document Object Model)。javascript
它的做用是將網頁轉爲一個 JavaScript 對象,從而能夠用腳本進行各類操做(好比增刪內容)。
瀏覽器會根據 DOM 模型,將結構化文檔(好比 HTML 和 XML)解析成一系列的節點,再由這些節點組成一個樹狀結構(DOM Tree)。全部的節點和最終的樹狀結構,都有規範的對外接口。css
DOM 的最小組成單位叫作節點(node)。文檔的樹形結構(DOM 樹),就是由各類不一樣類型的節點組成。
節點的類型有七種。html
在這裏簡單介紹,元素Element的構成:標籤tag,文本content,屬性Attributejava
全部節點造成的樹狀結構就是 DOM 樹
瀏覽器原生提供document節點,document節點表明整個文檔。
文檔的第一層只有一個節點,就是 HTML 網頁的第一個標籤<html>,它構成了樹結構的根節點(root node),其餘 HTML 標籤節點都是它的下級節點node
全部屬性見Document 節點git
每一個載入瀏覽器的HTML文檔都會成爲document對象。只要瀏覽器開始載入 HTML 文檔,該對象就存在了,能夠直接使用。
document對象包含了文檔的基本信息,咱們能夠經過JavaScript對HTML頁面中的全部元素進行訪問、修改。github
document對象有不少屬性來描述文檔信息,在console臺裏面輸出document.就會出現document所有的屬性。數組
如下爲經常使用屬性瀏覽器
//<!DOCTYPE html>緩存
//"UTF-8"
返回當前文檔的狀態,共有三種可能的值
1). loading:加載HTML代碼階段,還沒有完成解析
2). interactive:加載外部資源階段
3). complete:所有加載完成
演示一下,在html放入一章圖片,調卡網絡,刷新網頁查看readystate的狀態
...]
location屬性返回一個只讀對象,返回的是當前文檔的URL信息
9.2 document.location的應用
// 在控制檯輸入該語句,會直接跳轉到另外一個網址
// 當前頁面會從新加載,並且優先從服務器從新加載
// 當前頁面會從新加載,並且優先從本地緩存從新加載(默認值)
// 將location對象轉爲字符串,等價於document.location.href
document.open方法用於新建一個文檔,供write方法寫入內容。它實際上等於清除當前文檔流,從新寫入內容
document.close方法用於關閉open方法所新建的文檔。一旦關閉,write方法就沒法寫入內容了。
document.write方法用於向當前文檔寫入內容。
只要當前文檔尚未用close方法關閉,它所寫入的內容就會追加在已有內容的後面。
若是頁面已經渲染完成關閉了,再調用write方法,它會先調用open方法,擦除當前文檔全部內容,而後再寫入
咱們的頁面渲染的時候就會去打開一個文檔流,當渲染繪製結束,就關閉這個文檔流。
關閉後,若是從新調用document.write()就會從新去打開一個新的文檔流,並寫入數據
dom的操做,分爲兩步:1是選擇它,2是操做它
返回匹配ID屬性的元素節點,若是沒有發現匹配的節點,則返回null
var elem = document.getElementById("test")
返回一個相似數組的對象(HTMLCollection),包括了全部class名字符合指定條件的元素
咱們能夠經過下標的方式去訪問它,getElementsByClassName('center')[0]
返回全部指定標籤的元素
var paras = document.getElementsByTagName("p");
選擇擁有name屬性的HTML元素,返回一個NodeList格式的對象,不會實時反映元素的變化
<form name="x"></form> var forms = document.getElementsByName("x");
像css同樣選擇元素(id用#,class用. ),只會選擇一個元素,選擇第一個元素。
和querySelector()相似,不過querySelectorAll()返回的是知足條件的全部元素,也就是一個NodeList類型的對象
elementList = document.querySelectorAll(selectors)
querySelectorAll方法的參數,能夠是逗號分隔的多個CSS選擇器,返回全部匹配其中一個選擇器的元素
參數爲元素的標籤名,即元素節點的tagName屬性。
建立了一個元素,建立的這個元素在虛擬的dom裏面,只有把這個虛擬的dom放在頁面,用戶才能看得見
var newDiv = document.createElement("div")
用來生成文本節點,參數爲所要生成的文本節點的內容
var newDiv = document.createElement("div"); var newContent = document.createTextNode("Hello");
var docFragment = document.createDocumentFragment();
DocumentFragment對象是一個存在於內存的DOM片斷,可是不屬於當前文檔,經常用來生成較複雜的DOM結構,而後插入當前文檔。
這樣作的好處:由於DocumentFragment不屬於當前文檔,對它的任何改動,都不會引起網頁的從新渲染,比直接修改當前文檔的DOM有更好的性能表現。
舉個例子解釋
剛纔的代碼會引發五次從新渲染,咱們生成一個內存片斷,一次就搞定了,並且節省了一個標籤
var contain= document.querySelector('.classbar') var fragment=document.createDocumentFragment() for(var i=0;i<5;i++){ var content =document.createElement('li') var text=document.createTextNode(i) content.appendChild(text) fragment.appendChild(content) } contain.appendChild(fragment)
var newDiv = document.createElement("div"); var newContent = document.createTextNode("Hello"); newDiv.appendChild(newContent);
var newdiv= document.createElement('div') var newcontent= document.createTextNode('hhhhhhhh') newdiv.insertBefore(newcontent,newdiv.firstChild)
newDiv.replaceChild(newElement, oldElement)有兩個參數:要插入的元素和要替換的元素
舉個例子,源代碼
當咱們用第一個元素去替換最後一個元素以後
var date =document.createElement('p') var text=document.createTextNode('ffff') date.appendChild(text) contain.appendChild(date) contain.removeChild(date)
cloneNode()方法用於克隆元素,方法有一個布爾值參數,傳入true的時候會深複製,也就是會複製元素及其子元素(IE還會複製其事件),false的時候只複製元素自己
varnode.cloneNode(true)
node.getAttribute('id');
attribute = document.createAttribute(name); //createAttribute方法的參數name,是屬性的名稱,好比id。
var node = document.getElementById("div1"); node.setAttribute("id", "newVal");//屬性名 ,屬性值
node.removeAttribute('id');
選擇元素,使用innertext,輸入的字符串會當成文本展現
document.querySelector('.classbar').innerText='<p>123<span>456</span></p>'
選擇元素,使用innerHtml,輸入的字符串會當成html語句執行後展現
document.querySelector('.classbar').innerHTML='<p>123<span>456</span></p>'
使用時要注意安全的問題,innerHTML內容不能由用戶輸入
可修改元素的 style 屬性,修改結果直接反映到頁面元素
選中這個元素,使用style對象,就會出現該元素全部的css屬性
操做dom元素的style屬性
document.querySelector('p').style.color = 'red' document.querySelector('.box').style.backgroundColor = '#ccc'
經過 node.style.屬性 不能直接獲取dom對象的style的值,必須使用getComputedStyle獲取元素計算後的樣式
getComputedStyle是widow全局變量,
經過getComputedStyle(document.querySelector(".center"))能夠獲取(".center")這個dom元素全部的css屬性值。
而後經過下標或者.來獲取具體的屬性值,注意能夠用駝峯寫法,來代替—鏈接字符。
注意getComputedStyle是隻讀的屬性,不能經過該屬性來設置css屬性
var nodeBox = document.querySelector('.box') nodeBox.classList.add('active') //新增 class nodeBox.classList.remove('active') //刪除 class nodeBox.classList.toggle('active') //新增/刪除切換 node.classList.contains('active') // 判斷是否擁有 class
舉個栗子
<style> .box{ padding:10px; border:1px solid #ccc; box-shadow:1px 1px 2px 2px rgba(0,0,0,0.14); } .box.active{ background:#000; color:#fff; } </style> </head> <body> <div class="box"> <h1>hello</h1> <p>jirengu</p> </div> <button id="add">add</button> <button id="remove">remove</button> <button id="toggle1">toggle1</button> <button id="toggle2">toggle2</button> </body>
var toggle1btn=document.querySelector('#toggle1') var toggle2btn=document.querySelector('#toggle2') var addbtn=document.querySelector('#add') var removebtn=document.querySelector('#remove') var boxpanel=document.querySelector('.box') addbtn.onclick=function(){boxpanel.classList.add('active')} removebtn.onclick=function(){boxpanel.classList.remove('active')} toggle1btn.onclick=function(){ if(boxpanel.classList.contains('active')){ boxpanel.classList.remove('active') }else{ boxpanel.classList.add('active') } } toggle2btn.onclick=function(){ boxpanel.classList.toggle('active')}