经过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不支持该属性。由于写入会致使调用它的元素不存在,所以,不建议使用该属性