####节点的属性
Node.textContent
Node.textContent 返回当前节点和所有后代节点的文本内容,会忽略HTML标签
|
|
Node.baseURI
Node.baseURI 返回一个字符串,表示当前网页的绝对路径,如果无法取到这个值,返回null
|
|
#####Node.ownerDocument
Node.ownerDocument 返回当前节点所在的顶层文档对象。document 对象的ownerDocument属相,返回null。
Node.nextSibling && Node.previousSibling / Element.nextElementSibling & Element.previousElementSibling
Node.nextSibling 返回后面的第一个兄弟节点,如果没有则返回null,包括文本节点。
区别Element.nextElementSibling
属性返回当前HTML元素节点的后一个同级HTML元素节点,如果没有则返回null
。
注:该属性包括文本节点和评论节点,所以当前节点后面有空格的话,会返回一个文本节点,内容为空格。!!
|
|
Node.parentNode
返回当前节点的父节点。document的父节点为null。
#####Node.parentElement
返回当前节点的父Element节点。如果当前节点没有父节点,或者父节点类型不是Element节点,则返回null
Node.childNodes && Element.children
- 返回一个NodeList集合,成员包括当前节点的所有子节点。由于NodeList对象是一个动态集合,一旦子节点发生变化,立刻会反映在返回结果之中。
注:包含了text节点和comment节点
|
|
- 返回一个包含当前元素节点的所有子元素
HTMLCollection
对象,它只包含HTML元素类型,不包含其他类型的子节点。
Node.firstChild && Node.lastChild / Element.firstElementChild & Element.lastElementChild
返回当前节点的第一个子节点,如果当前节点没有子节点,则返回null
,包括文本节点 。
然而Element.firstElementChild 返回的是第一个HTML节点,不包括文本节点。
|
|
节点的方法
Node.appendChild()
方法接受一个节点对象作为参数,将其作为最后一个子节点,插入当前节点。
|
|
*如果参数节点是DOM中已经存在的节点,appendChild
方法会将其从原来的位置,移动到新位置。
Node.hasChildNodes() && Node.contains()
返回一个布尔值,表示当前节点是否有子节点。
返回一个布尔值,表示参数节点是否为当前节点的后代节点。(自身节点返回true nodeA.contains(nodeA)
)
Node.cloneNode()
用于克隆一个节点。它接受一个布尔值作为参数,表示是否同时克隆子节点,默认是false
。
需要注意的是,克隆一个节点,会拷贝该节点的所有属性,但是会丧失addEventListener
方法。也会克隆两个有相同ID属性的HTML元素。
Node.insertBefore()
Node.insertBefore
在当前节点的某个子节点之前再插入一个子节点。返回被插入的新节点。
语法:var insertedElement = parentElement.insertBefore(newElement, referenceElement);
如果referenceElement
为null
则newElement
将被插入到子节点的末尾。如果newElement
已经在DOM树中,newElement
首先会从DOM树中移除。
insertedElement
是被插入的节点,即newElement
parentElement
是新插入节点的父节点newElement
是被插入的节点referenceElement
在插入newElement之前的那个节点
|
|
Node.removeChild()
接受一个子节点作为参数,用于从当前节点移除该子节点。它返回被移除的子节点。
|
|
Node.replaceChild()
语法:replacedNode = parentNode.replaceChild(newChild, oldChild)
|
|
Document节点
- document.links 属性返回当前文档所有设定了
href
属性的a
及area
元素。 - document.forms 属性返回页面中所有表单元素
form
。 - document.images 属性返回页面所有图片元素(即
img
标签)。
注:如果一个元素有id
或name
属性,就可以直接引用。
|
|
|
|
document.documentURI && document.URL
都返回一个字符串,表示当前文档的网址。documentURI
属性可用于所有文档(包括 XML 文档),URL
属性只能用于 HTML 文档。
还有类似的document.baseURI
document.domain
返回当前文档的域名
|
|
document.lastModified
返回当前文档最后修改的时间戳,格式为字符串。字符串是不能比较的,用Date.parse()方法转换成时间戳才能进行比较
|
|
document.location
|
|
|
|
|
|
#####document.referrer , document.title , document.characterSet
document.referrer
属性返回一个字符串,表示当前文档的访问来源,如果是无法获取来源或是用户直接键入网址,而不是从其他网页点击,则返回一个空字符串。document.referre
的值,总是与HTTP头信息的Referer
保持一致,但是它的拼写有两个r
。document.title
属性返回当前文档的标题,该属性是可写的。document.title = '新标题'
document.characterSet
属性返回渲染当前文档的字符集,比如UTF-8
document.readyState
返回当前文档的状态,共有三种可能的值。
loading
:加载HTML代码阶段(尚未完成解析)interactive
:加载外部资源阶段时complete
:加载完成时
|
|
查找节点
document.querySelector() && document.queryselectorAll() /Element.querySelector() & Element.querySelectorAll()
document.querySelector
方法接受一个CSS选择器作为参数,返回匹配该选择器的元素节点。如果有多个节点满足匹配条件,则返回第一个匹配的节点。如果没有发现匹配的节点,则返回null
。
document.querySelectorAll() 方法返回NodeList对象,有多个选择器可以用逗号分开
|
|
需要注意的是,浏览器执行querySelector
方法时,是先在全局范围内搜索给定的CSS选择器,然后过滤出哪些属于当前元素的子元素。因此,会有一些违反直觉的结果,请看下面的HTML代码。
|
|
那么,下面代码实际上会返回第一个p
元素,而不是第二个。
|
|
document.getElementsByTagName() / Element.getElementsByTagName()
方法返回所有指定HTML标签的元素,返回值是一个类似数组的HTMLCollection
对象。
注:HTML元素本身也定义了getElementsByTagName
方法,这个方法不仅可以在document
对象上调用,也可以在任何元素节点上调用。
|
|
document.getElementsByClassName() / Element.getElementsByClassName()
和上面一样,可以在任何元素节点上调用该方法
|
|
#####document.getElementById()
注:只能用在document上,不能用在其他元素身上
|
|
document.getElementsByName()
document.getElementsByName
方法用于选择拥有name
属性的HTML元素(比如<form>
、<radio>
、<img>
、<frame>
、<embed>
和<object>
等),返回一个类似数组的的对象(NodeList
对象的实例)
|
|
Element.querySelector()
Element.querySelectorAll()
Element.getElementsByTagName()
Element.getElementsByClassName()
上面四个方法只返回Element子节点,因此可以采用链式写法。
|
|
生成节点
document.createElement()
用来生成网页元素的节点,参数为标签名。
|
|
document.createTextNode()
用来生成文本节点,参数为文本的内容。
|
|
这个方法可以确保返回的节点,被浏览器当作文本渲染,而不是当作HTML代码渲染。因此,可以用来展示用户的输入,避免XSS攻击。
|
|
innerHTML & outerHTML & textContent的区别
|
|
属性操作
document.createAttribute()
生成一个新的属性对象节点
|
|
Element.getAttribute(name)
返回当前元素节点的指定属性。如果指定属性不存在,则返回null
。
|
|
Element.setAttribute(name,value)
用于为当前元素节点新增属性。如果同名属性已存在,则相当于编辑已存在的属性。
|
|
Element.hasAttribute(name)
返回一个布尔值,表示当前元素是否包含指定属性
|
|
Element.removeAttribute(name)
从当前节点移除属性
|
|
dataset属性
有时需要再HTML元素上附加数据,可以使用标准提供的data-属性。然后使用节点对象的dataset属性来操作元素标签的data-\属性
|
|
除了dataset
属性,也可以用getAttribute('data-foo')
、removeAttribute('data-foo')
、setAttribute('data-foo')
、hasAttribute('data-foo')
等方法操作data-*
属性。
注意,data-
后面的属性名有限制,只能包含字母、数字、连词线(-
)、点(.
)、冒号(:
)和下划线(_
)。而且,属性名不应该使用A
到Z
的大写字母,比如不能有data-helloWorld
这样的属性名,而要写成data-hello-world
。
转成dataset
的键名时,连词线后面如果跟着一个小写字母,那么连词线会被移除,该小写字母转为大写字母,其他字符不变。反过来,dataset
的键名转成属性名时,所有大写字母都会被转成连词线+该字母的小写形式,其他字符不变。比如,dataset.helloWorld
会转成data-hello-world
。
Element对象
#####Element.className ,Element.classList
className
属性用来读写当前元素节点的class
属性。它的值是一个字符串,每个class
之间用空格分割。
classList
属性则返回一个类似数组的对象,当前元素节点的每个class
就是这个对象的一个成员。
|
|
- Element.classList.add():增加一个class。
- Element.classList.remove():移除一个class。
- Element.classList.contains():检查当前元素是否包含某个class。
- Element.classList.toggle():将某个class移入或移出当前元素。
- Element.classList.item():返回指定索引位置的class。
- Element.classList.toString():将class的列表转为字符串。
|
|
Element.closest()
|
|
盒模型相关属性
#####Element.clientHeight, Element.clientWidth
Element.clientWidth 属性表示元素的内部宽度,以像素计。该属性包括内边距,但不包括垂直滚动条(如果有)、边框和外边距。
Element.clientLeft ,Element.clientTop
返回元素周围边框的厚度即border的宽度,不包括padding和margin
#####Element.scrollHeight ,Element.scrollWidth
Element.scrollHeight 是计量元素内容高度的只读属性,包括overflow样式属性导致的视图中不可见内容。没有垂直滚动条的情况下,scrollHeight值与元素视图填充所有内容所需要的最小值clientHeight相同。包括元素的padding,但不包括元素的margin.
|
|
Element.scrollLeft, Element.scrolltop
Element.scrollLeft
属性表示网页元素的水平滚动条向右侧滚动的像素数量,Element.scrollTop
属性表示网页元素的垂直滚动条向下滚动的像素数量。对于那些没有滚动条的网页元素,这两个属性总是等于0。
如果要查看整张网页的水平的和垂直的滚动距离,要从document.documentElement
元素上读取。
|
|
这两个属性都可读写,设置该属性的值,会导致浏览器将指定元素自动滚动到相应的位置。
Element.offsetHeight, Element.offsetWidth
这两个属性值包括Padding
和Border
、以及滚动条。
|
|
#####Element.getBoundingClientRect()
Element.getBoundingClientRect
方法返回一个对象,该对象提供当前元素节点的大小、位置等信息,基本上就是CSS盒状模型提供的所有信息。
|
|
上面代码中,getBoundingClientRect
方法返回的rect
对象,具有以下属性(全部为只读)。
x
:元素左上角相对于视口的横坐标left
:元素左上角相对于视口的横坐标,与x
属性相等right
:元素右边界相对于视口的横坐标(等于x
加上width
)width
:元素宽度(等于right
减去left
)y
:元素顶部相对于视口的纵坐标top
:元素顶部相对于视口的纵坐标,与y
属性相等bottom
:元素底部相对于视口的纵坐标height
:元素高度(等于y
加上height
)
由于元素相对于视口(viewport)的位置,会随着页面滚动变化,因此表示位置的四个属性值,都不是固定不变的。如果想得到绝对位置,可以将left
属性加上window.scrollX
,top
属性加上window.scrollY
。
注意,getBoundingClientRect
方法的所有属性,都把边框(border
属性)算作元素的一部分。也就是说,都是从边框外缘的各个点来计算。因此,width
和height
包括了元素本身 + padding
+ border
。
获取某个网页元素距离视口左上角的坐标
|
|
|
|
|
|
Element.getClientRects()
Element.getClientRects
方法返回一个类似数组的对象,里面是当前元素在页面上形成的所有矩形。每个矩形都有bottom
、height
、left
、right
、top
和width
六个属性,表示它们相对于视口的四个坐标,以及本身的高度和宽度。
|
|
上面代码是一个行内元素<span>
,如果它在页面上占据三行,getClientRects
方法返回的对象就有三个成员,如果它在页面上占据一行,getClientRects
方法返回的对象就只有一个成员。
|
|
这个方法主要用于判断行内元素是否换行,以及行内元素的每一行的位置偏移。
Element.insertAdjacentHTML()
语法:element.insertAdjacentHTML(position, text)
指定位置共有四个。
beforebegin
:在当前元素节点的前面。afterbegin
:在当前元素节点的里面,插在它的第一个子元素之前。beforeend
:在当前元素节点的里面,插在它的最后一个子元素之后。afterend
:在当前元素节点的后面。
|
|
该方法不是彻底置换现有的DOM结构,这使得它的执行速度比innerHTML
操作快得多。
|
|
Element.remove()
Element.remove
方法用于将当前元素节点从DOM树删除。
|
|
####Text节点
通常我们使用Node
节点的firstChild
、nextSibling
等属性获取Text
节点,或者使用Document
节点的createTextNode
方法创造一个Text
节点。