本文主讲:
selectors API
HTML5 DOM
Selectors API
Selectors API 本质为css选择符的模式匹配DOM元素,其规定了浏览器原生支持CSS查询API.
Level1 的核心为两个方法:querySelector() querySelectorall().在兼容浏览器中,Document和Element的实例上都暴露了这两个方法.
Level2在Element上规范了更多方法(match(),find(),findall())
querySelector()
querySelector()接收一个css选择符参数,返回第一个匹配的后代元素,否则返回null.
let a= document.querySelector('div')
querySelectorAll()
querySelectorall()接收一个css选择符参数,返回所有匹配到的节点.返回的是一个NodeList静态实例.
let a=document.querySelectorAll('div')//NodeList
matches()
matches()方法接收一个css选择符参数,如果元素匹配则返回true,否则返回false.
let matches=document.matches('div')//true
元素遍历
元素类型之间的操作属性:
childElementCount 返回子元素类型的个数
firstElementChild 指向第一个子元素类型节点
lastElementChild 指向最后一个子元素类型节点
previousElementSibling指向前一个Element类型的同胞元素
nextElementSibling 指向后一个Element类型的同胞元素
HTML5
css类扩展
getElementsByClassName()
与getElementsByTagName()相似.
classList属性
替代了className
classList是集合类型DOMTokenList的实例.
DOMTokenList的方法与属性:
length DOMTokenList包含多少项
item()
[]
add()添加指定字符串的值
contains()返回布尔值,与Set中的has()相似
remove()删除指定字符串的值
toggle()如果类名列表中已经存在指定的value,则删除,如果不存在,则添加
焦点管理
方法与属性:
document.activeElement
document.hasFocus()
document.activeElement 始终包含当前拥有焦点的DOM元素.
let button=document.getElementById('myButton')
button.focus()
console.log(document.activeElement == button)//true
默认情况下,document.activeElement在页面加载完之后会设置为document.body.而在页面完成加载之前,document.activeElement的值为null.
document.hasFocus()方法,返回布尔值,表示文档是否拥有焦点.
let button =document.getElementClassName('te')[0]
button.focus()
console.log(document.hasFocus())//true
HTMLDocument扩展
readystate属性
document.readystate属性有两个可能的值:loading,complete.可以替代onload事件处理程序给的一个标签来确定文档是否加载完毕.
if(document.readystate==='complete'){}
compatMade属性
document.compatMade指示浏览器当前处于什么渲染模式.
标准模式值为'CSS1Compat',混杂模式值为'BackCompat'
head属性
document.head指向文档的<head>元素.与document.body相似
字符集属性
characterSet属性表示文档实际使用的字符集,也可以用来指定新字符集.
console.log(document.characterSet)//UTF-16
document.characterSet='UTF-8'
自定义数据类型
HTML5允许给元素指定非标准的属性,但要使用前缀data-
<div id='div1' data-d1='d1' data-d2='d2'></div>
dataset属性可以访问自定义数据属性,datset属性是一个DOMStringMap的实例,包含一组键值对映射.
元素的每个data-name属性在dataset中都可以通过data-后面的字符串作为键来访问.
let a=document.getElmentById('div1')
//取得自定义数据属性的值
let d1=a.dataset.d1
let d2=a.dataset.d2
//设置自定义数据属性的值
a.dataset.d1=23
a.dataset.d2='d222'
//添加自定义数据属性
a.dataset.d3='d3'
if(a.dataset.d1){
console.log('d1:${d1},d2:${d2},d3:${d3}')//d1:23,d2:'d222',d3:'d3'
}
插入标记
innerHTML属性
在读取innerHTML属性时,会返回元素所有的后代HTML字符串,包括元素,注释和文本节点.而在写入innerHTML时,则会根据提供的字符串值以新的DOM子树替代元素中原来包含的所有节点.
<div>dddddd</div>
let a=document.getElementsByTagName('div')[0]
a.innerHTML='/a/+ <b>str</b>'
旧IE中的innerHTML
在现代浏览器中,通过innerHTML插入的script标签是不会执行的.
但通过innerHTML插入的<style>是可以执行的.
outerHTML属性
读取outerHTML属性时,会返回调用它的元素(及其后代元素)的HTML字符串.
与innerHTML属性相似.
insertAdjacentHTML()与insertAdjacentText()
他们接收两个参数:要插入的位置,要插入的HTML或文本
第一个参数必须是下列值的一种:
beforebegin :插入当前元素的前面,作为前一个同胞节点
afterbegin:插入当前元素内部,作为新的子节点或放在第一个子节点前面
beforeend:插入当前元素 内部,作为新的子节点或放在最后一个子节点后面
afterend:插入当前元素的后面,作为后一个同胞节点
内存与性能问题
如果被移除的子树元素中之前有关联的事件处理程序或其他Javascript对象,那它们之间的绑定关系会滞留在内存中.在使用innerHTML,outerHTML之前,最好手动删除有关联的事件处理程序或其他Javascript对象.
尽量不要多次设置innerHTML,outerHTML.
跨站点脚本
使用innerHTML或outerHTML需要防止XSS攻击.
scrollIntoView()
scrollIntoView()方法存在于所有HTML元素上,可以滚动浏览器窗口或容器元素以便于包含元素进入视口.这个方法的参数如下:
alignToTop是一个布尔值
true:窗口滚动后元素的顶部与视口顶部对齐.
false:窗口滚动后元素的底部与视口底部对齐.
scrollintoViewOptions是一个选项对象
behavior:定义过渡动画,'smooth','auto'(默认)
block:定义垂直方向的对齐,'start'(默认),'center','end','nearest'
inline:定义水平方向对齐,'start','center','end','nearest'(默认)
不传参数等同于alignToTop为true
专有扩展
children属性
children只包含元素的Element类型 的子节点
contains()方法
Parentnode.contains(childNode)childNode是否为ParentNode的子元素
compareDocumentPosition()方法也可以确定节点间的关系.这个方法返回表示两个节点关系的位掩码.
插入标记
innerText
与innerHTML相似,插入的是文本
outerText
与outerHTML相似,插入的是文本
滚动
scrollIntoViewIfneeded(aligncenter)会在元素不可见 的时候,将其滚动到窗口或包含窗口中,使其可见.
如果元素可见,这这个方法什么也不做.如果将参数设置为true,浏览器会尝试将其放在视口中央.