DOM Element 对象
Document 节点
Document 节点属性
1 | document.doctype //返回当前文档的文档类型 |
Document 节点方法
读写方法
1 | document.open() //用于新建并打开一个文档 |
节点查找 API
document.getElementById('id')
返回指定 ID 的元素document.getElementsByTagName('tagName')
返回拥有指定标签名的所有子元素的集合。如果是*,表示查询所有标签document.getElementsByClassName('class')
返回指定 class 的对象集合document.getElementsByName('name')
根据元素的 name 属性查找,返回一个 NodeList 。document.querySelector('#id>.class')
返回第一符合条件的节点document.querySelectorAll('#id>.class')
返回所有符合条件的节点集合
节点创建 API
document.createElement('div')
创建元素document.createTextNode('文本内容')
创建文本节点cloneNode(true/false)
克隆节点,参数表示是否克隆子节点1
2
3
4const form=document.getElementById('test');
let clone=form.cloneNode(true)
clone.id='test2';
document.body.appendChild(clone)document.createAttribute(name)
生成一个新的属性对象节点,并返回它document.createDocumentFragment()
生成一个 DocumentFragment 对象
事件方法
1 | document.createEvent(type) //生成一个事件对象,该对象能被element.dispatchEvent()方法使用 |
其他
1 | document.hasFocus() //返回一个布尔值,表示当前文档之中是否有元素被激活或获得焦点。 |
Element 节点
与元素本身特征相关的属性
element.attributes
返回指定节点的属性集合(类数组对象)element.id
返回指定元素的 id 属性,可读写element.tagName
返回指定元素的大写标签名element.innerHTML
设置或返回元素的内容
如果设置该属性为空,就是删除它包含的所有节点1
el.innerHTML=''
element.tagName
返回指定元素的大写标签名element.outerHTML
返回指定元素节点的所有 HTML 代码,包括它自身和包含的的所有子元素,可读写Element.className
//返回当前元素的 class 属性,可读写Element.classList
//返回当前元素节点的所有 class 集合Element.dataset
返回节点 data-开头的属性
1 | <div id="user" data-id="1234567890" data-user="johndoe" data-date-of-birth>John Doe</div> |
查找节点方法
1 | Element.querySelector() |
插入节点 API
appendChild
向父节点的最后一个子节点后追加新节点1
parent.appendChild(child)
insertBefore
向父节点的某个特定子节点之前插入新节点1
parent.insertBefore(newChild,existingChild)
修改节点 API
replaceChild
用新节点替换父节点中已有的子节点1
parent.replaceChild(newChild,existingChild)
删除节点 API
removeChild
删除已有节点,返回值为删除节点1
parent.removeChild(existingChild)
节点判断
parent.contains(node)
返回 Boolean,表示参数节点是否为当前节点的后代节点Node.isEqualNode(node)
返回 Boolean,用于检查两个节点是否相等,指的是两个节点的类型相同、属性相同、子节点相同Node.normalize()
用于清理当前节点内部的所有 Text 节点。它会去除空的文本节点,并且将毗邻的文本节点合并成一个。
节点属性 API
获取属性
Node.nodeName
,返回节点名称,只读Node.nodeType
,返回节点类型的常数值,只读Node.nodeValue
,返回 Text 或 Comment 节点的文本值,只读Node.textContent
,返回当前节点和它的所有后代节点的文本内容,可读写Node.baseURI
,返回当前网页的绝对路径Node.ownerDocument
,返回当前节点所在的顶层文档对象,即 document
element.className
设置或返回元素的 class 属性getAttribute
获取节点属性值1
ele.getAttribute('src')
setAttribute
修改节点属性,如果属性已存在,则仅设置/更改值。1
ele.setAttribute(attributeName,attributeValue)
removeAttribute
删除具有指定属性名称的属性,无返回值1
ele.removeAttribute('属性名')
hasAttribute()
元素是否有指定属性,返回 Boolean1
ele.hasAttribute('onclick')
节点关系 API
父关系
parentNode
返回父节点,父节点可能是 Element,Document 或 DocumentFragment;如果没有返回 nullparentElement
返回元素的父元素节点,其父节点必须是一个 Element 元素,如果不是,则返回 null;
子节点
children
返回 HTMLCollection,子节点都是 Element,IE9 以下浏览器不支持;childNodes
返回 NodeList,子节点可能包含文本节点、注释节点等firstChild
第一个字节点,不存在返回 nulllastChild
最后一个字节点,不存在返回 nullNode.firstElementChild
//返回当前节点的第一个 Element 子节点Node.lastElementChild
//返回当前节点的最后一个 Element 子节点Node.childElementCount
//返回当前节点所有 Element 子节点的数目。
兄弟关系
previousSibling
前一个节点,可能包含文本节点、注释节点等nextSibling
后一个节点,可能包含文本节点、注释节点等previousElementSibling
返回前一个元素节点,前一个节点必须是 Element,注意 IE9 以下浏览器不支持。nextElementSibling
返回后一个元素节点,后一个节点必须是 Element,注意 IE9 以下浏览器不支持。
Element 节点的方法
Element.getBoundingClientRect()
位置,返回一个对象,包含 top,left,right,bottom,width,height- top 元素上外边界距窗口最上面的距离
- right 元素右外边界距窗口最上面的距离
- bottom 元素下外边界距窗口最上面的距离
- left 元素左外边界距窗口最上面的距离
- width 元素自身宽(包含 border,padding)
- height 元素自身高(包含 border,padding)
Element.getClientRects()
返回一个指向客户端中每一个盒子的边界矩形的矩形集合。
元素在页面上的偏移量
1 | var rect = el.getBoundingClientRect() |
Element 对象盒状模型属性
element.clientHeight,element.clientWidth
element.clientHeight
:返回元素的可见高度element.clientWidth
:返回元素的可见宽度Element.clientLeft
:返回元素节点左边框的宽度Element.clientTop
:返回元素节点顶部边框的宽度
包含 padding+CSS 高度
不包括溢出(overflow)、滚动条、边框、和 margin对于整个网页来说,当前可见高度(即视口高度)要从 document.documentElement 对象(即节点)上获取,
等同于 window.innerHeight-水平滚动条的高度,window.innerWidth-垂直滚动条宽度。
没有滚动条时两值相等,有滚动条前者小于后者视口的高度和宽度(包括滚动条),有两种方法可以获得。
对于整个网页,基本都不会设置 border,所以只考虑 padding 和滚动条的影响1
2
3
4
5
6
7// 视口高度
window.innerHeight // 包括滚动条
document.documentElement.clientHeight // 不包括滚动条
// 视口宽度
window.innerWidth // 包括滚动条
document.documentElement.clientWidth // 不包括滚动条element.offsetHeight,element.offsetWidth
element.offsetHeight
:返回元素的高度element.offsetWidth
:返回元素的宽度
包含 Padding+Border+滚动条
如果不存在内容溢出,element.offsetHeight 比 element.clientHeight 多了边框的高度整张网页的高度,可以在 document.documentElement 和 document.body 上读取
1
2
3
4
5
6//网页总高度
document.documentElement.offsetHeight
document.body.offsetHeight
//网页总宽度
document.documentElement.offsetWidth
document.body.offsetWidthelement.offsetLeft,element.offsetTop
(可读 像素)element.offsetLeft
:返回元素左上角相对于 Element.offsetParent 节点的水平偏移位置element.offsetTop
:返回元素的垂直偏移位置,通常,这两个值指相对于父节点的位移element.scrollHeight,element.scrollWidth
(只读)(像素)element.scrollHeight
:返回元素的整体高度element.scrollWidth
:返回元素的整体宽度它们返回的是整个元素的高度或宽度,包括由于存在滚动条和不可见的部分。默认情况下,它们包括 Padding,但不包括 Border 和 Margin。
整张网页的总高度
1
2document.documentElement.scrollHeight
document.body.scrollHeight如果内容没有溢出,element.scrollHeight=element.clientHeight
存在溢出时当滚动条到内容底部时,1
element.scrollHeight-element.scrollTop===element.clientHeight //true
element.scrollTop,element.scrollLeft
(可读 像素)element.scrollTop
:返回元素的水平滚动条向右侧滚动的距离element.scrollLeft
:返回元素水平滚动条向下滚动的距离
对于那些没有滚动条的网页元素,这两个属性总是等于 0。整张网页的水平或垂直滚动距离
1
2document.documentElement.scrollLeft
document.documentElement.scrollTopElement.style
返回元素节点的行内样式
事件方法
1 | Element.addEventListener():添加事件的回调函数 |
通用事件监听方法
1 | const EventUtils = { |
其他
1 | Element.scrollIntoView() //滚动当前元素,进入浏览器的可见区域 |
样式
直接修改元素的样式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15ele.style.color='red';
ele.setAttribute('style','')
element.style.setProperty(propertyName,value) //设置css属性
element.style.getPropertyValue(property) //获取css属性
element.style.removeProperty(property) //删除css属性
操作非内联样式
//ie8
element.currentStyle[attrName]
//ie9+
window.getComputedStyle(el,null)[attrName]
window.getComputedStyle(el,null).getPropertyValue(attrName)
//伪类
window.getComputedStyle(el,':after')[attrName]动态添加样式规则
1
2
3var style=document.createElement('style');
style.innerHTML='body{color:red} #top:hover{background-color: red;color: white;}'
document.head.appendChild(style)类名操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20//ie8以下
Element.className //获取元素节点的类名
Element.className += ' ' + newClassName //新增一个类名
//判断是否有某个类名
function hasClass(element,className){
return new RegExp(className,'gi').test(element.className);
}
//移除class
function removeClass(element,className){
element.className = element.className.replace(new RegExp('(^|\\b)' + className.split(' ').join('|') + '(\\b|$)', 'gi'),'');
}
//ie10
ele.classList.remove('foo','bar');
ele.classList.add('anotherClass','bar');
ele.classList.toggle('visible');//存在就去掉,不存在就添加
ele.classList.toggle('visible',i<10)//根据条件增加、删除属性
ele.classList.contains('foo');//是否包含属性
ele.classList.replace('foo','bar');//替换属性