經過Document調用querySelector, 會在文檔元素的範圍內查找匹配的元素;javascript
經過Element調用querySelector,會在該元素後代元素的範圍內查找匹配的元素css
<p>sunny day</p> <div id="myDiv"> <p>hello</p> </div>
document.querySelector('p') // <p>sunny day</p> document.querySelector('#myDiv') // <div id="myDiv"><p>hello</p></div> document.querySelector('#myDiv').querySelector('p') //<p>hello</p>
<div class="thing">A thing</div> <div class="thing">A thing</div> <div class="another-thing">Another thing</div>
let allThings = document.querySelectorAll('.thing, .another-thing')
Tips: 現代瀏覽器能夠直接使用NodeList.forEach, 若是是舊版瀏覽器,須要使用Array.from(arrayLike)將nodeList轉換爲arrayhtml
// Modern browsers let allThings = document.querySelectorAll('.thing, .another-thing') allThings.forEach(el => {/* do something with element */}) // Older browsers let allThings = document.querySelectorAll('.thing, .another-thing') // You might need a polyfill for Array.from. // Alternatively, use Array.prototype.slice.call(allThings); let allThingsArray = Array.from(allThings, (item, index) => { /* do something with element */ }) // 或者使用forEach allThingsArray.forEach(el => {/* do something with element */})
childElementCount: 返回子元素(不包括文本節點和註釋)的個數java
firstElementChild: 指向第一個子元素(firstChild的元素版)node
lastElementChild: 指向最後一個子元素(lastChild的元素版)瀏覽器
previousElementSibling: 指向前一個同輩元素(previousSibling的元素版)app
nextElementSibling: 指向後一個同輩元素(nextSibling的元素版)性能
getElementsByClassName():只有位於調用元素子樹中的元素纔會返回,在document上調用,會返回文檔中與類名匹配的元素ui
classList: 新集合類型DOMTokenList的實例,經過className屬性添加、刪除和替換編碼
焦點管理(主要用途是提升Web應用的無障礙性):
document.activeElement // 返回DOM中得到了焦點的元素, 沒有時返回null
document.hasFocus() // 判斷文檔是否得到了焦點
HTMLDocument變化
文檔狀態:
document.readyState // 兩個可能值:‘loading’, 'complete'
兼容模式:
document.compatMode // 兩個可能值: ‘CSS1Compat’ 爲標準模式,'BackCompat' 爲混雜模式
head引用:
document.head // 引用文檔的<head>元素
兼容寫法:
let head = document.head || document.getElementsByTagName('head')[0]
字符集:
document.charset = 'utf-8' // 文檔字符集,默認爲utf-16
自定義數據屬性:
<div id="myDiv" data-appId="1234" data-myName="Nicholas"></div>
插入標記:
innerHTML屬性: 返回調用元素的全部子節點(包括元素、註釋、文本節點)對應的HTML標記。在插入以前,須要檢查文本內容是否有害, htmlEncode轉換"<", ">", "\'", "\"", "&" , " "等特殊字符
具體轉碼的方法能夠參考文章:http://www.cnblogs.com/xdp-gacl/p/3722642.html
outerHTML屬性: 與innerHTML的區別,outerHTML返回調用元素自己和子元素對應的HTML標記
insertAdjacentHTML()方法:兩個參數,插入的位置和文本
beforebegin: 做爲前兄弟節點插入
afterbegin: 做爲第一個子元素插入
beforeend: 做爲最後一個子元素插入
afterend: 做爲後兄弟節點插入
內存與性能: 在刪除帶有事件處理程序或引用了其餘Javascript對象子樹時,就有可能致使內存佔用問題,所以,在使用innerHTML、outerHTML屬性和insertAjacentHTML() 方法時,最好先手動刪除要被替換的元素的全部事件處理程序和引用的Javascript對象
/* 要儘可能避免下面這種頻繁操做innerHTML的方法 */ for (let i = 0, len = values.length; i < len; i++) { ul.innerHTML += `<li>${values[i]}</li>`; } /* 下面這種一次性賦值給innerHTML則高效不少 */ let itemHtml = '' for (let i = 0, len = values.length; i < len; i++) { itemHtml += `<li>${values[i]}</li>`; } ul.innerHTML = itemHtml
scrollIntoView() 方法:應用在HTML元素上,調用該方法的元素能夠出如今視口中
document.forms[0].scrollIntoView(); // 傳入true: 元素頂部和視口頂部平行; false: 元素儘量所有出如今視口中
具體參考https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
文檔模式
IE8引入了「文檔模式」的概念,頁面的文檔模式決定了能夠使用哪一個級別的CSS, 能夠在Javascript中使用哪些API, 以及如何對待文檔類型(doctype), 到IE9, 共有4種文檔模式
IE5:以混雜模式渲染頁面
IE7:以IE7標準模式渲染頁面
IE8:以IE8標準模式渲染頁面,能夠使用Selectors API, 更多CSS2級選擇符和某些CSS3功能,還有一些H5的功能
IE9:以IE9標準模式渲染頁面,能夠使用ECMAScript 5, 完整的CSS3及更多的H5
要強制瀏覽器以某種模式渲染頁面,能夠使用HTTP頭部信息X-UA-Compatible,或經過等價的<meta>標籤
<meta http-equiv="X-UA-Compatible" content="IE=IEVersion" /> <meta http-equiv="X-UA-Compatible" content="IE=Edge, Chrome=1" /> // 優先使用Chrome瀏覽器渲染頁面,若是是IE瀏覽器,則忽略文檔類型,始終以最新的文檔模式渲染頁面 <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> // 若是有文檔類型聲明,則以IE7標準模式渲染頁面,不然將文檔模式設置爲IE5 <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE7" /> // 忽略文檔類型聲明,強制以IE7標準模式渲染頁面
children屬性:相似childNodes, 但只包含元素的元素子節點
contains() 方法:判斷某個節點是否是另外一個節點的子節點
document.documentElement.contains(document.body) // true
innerText 屬性:操做元素中包含的全部文本內容,包括子文檔樹中的文本,讀取時,會由淺入深,將子文檔樹中的全部文本拼接起來;寫入時,會對HTML編碼(<, >, 空格,‘ 「引號,&和號),確保生成一個子文本節點, 但Firefox不支持innerText, 能夠使用textContent屬性(DOM Level3規定的一個屬性), textContent與innerText不一樣的是,textContent會返回行內樣式和腳本代碼
// 讀取元素文本子節點內容 function getInnerText (element) { return (typeof element.textContent === 'string') ? element.textContent : element.innerText } // 設置元素文本子節點內容 function setInnerText (element, text) { if (typeof element.textContent === 'string') { element.textContent = text } else { element.innerText = text } }
outerText 屬性:讀取時,和innerText的結果同樣,寫入時,outerText會替換調用它的元素,包括元素的子節點,一樣Firefox不支持該屬性。由於寫入會致使調用它的元素不存在,所以,不建議使用該屬性