DOM DOM概述 DOM 文档对象模型(document object model) 主要是用于操作html文档及相关内容(css)。对于文档的操作会造成浏览器的重新渲染(重绘(改变的一个元素的显示内容及部分样式) 重排(改变一个元素的位置及大小尺寸)(回流)重绘不一定重排 重排必定发生重绘)
DOM具备的内容
document (属于BOM)文档对象
rootElement (根元素)
element (所有的标签都是element)
attribute (所有标签的属性都是attribute)
text (所有标签内容的文本都是text)
从上的包含关系可以看出大的内容可以获取或操作包含的内容也就是
document可以获取rootElement
document可以获取element
element可以获取里面的element
element可以获取里面attribute以及text
获取元素相关的操作 document和element都有的方法
getElementById 通过id来获取元素 (元素 element)
getElementsByClassName 通过classname获取所有的符合的元素 (伪数组)
getElementsByTagName 通过标签名获取所有符合的元素 (伪数组)
getElementsByName 通过name属性来获取符合的元素 (伪数组)
querySelector 通过传入选择器来获取符合的第一个元素 (元素 element)
querySelectorAll 通过传入选择器获取符合的所有元素 (伪数组)
所有跟上面一致后面带NS表示命名空间获取查找
1 2 3 4 5 6 7 8 9 10 11 12 13 console .log (document .getElementById ('box' ))console .log (document .getElementsByClassName ('context' ))console .log (document .getElementsByTagName ('div' ))console .log (document .getElementsByName ('hello' ))console .log (document .querySelector ('.context' )) console .log (document .querySelectorAll ('#box' )) var box = document .getElementById ('box' )console .log (box.querySelector ('a' ))console .log ( document .getRootNode ())
伪数组具备下标的特性及length属性 但是不具备数组的方法
element操作attribute getAttribute 获取属性值的方法 setAttribute 设置属性的方法 1 2 3 4 5 6 7 var element = document .getElementById ('box' )var value = element.getAttribute ('href' ) console .log (value)element.setAttribute ('number' ,'10' ) element.setAttribute ('number' ,'20' )
getAttributeNode 获取属性对象 setAttributeNode 设置属性对象 1 2 3 4 5 var obj = element.getAttributeNode ('class' ) console .log (obj.value )
获取所有的属性名 getAttributeNames 1 2 var attrNames = element.getAttributeNames () console .log (attrNames)
attributes 属性 (属于element的属性) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 console .log (element.attributes )console .log (element.attributes [2 ])console .log (element.attributes ['class' ].value )console .log (element.attributes [2 ].value )var attrs = element.attributes console .log (attrs.getNamedItem ('class' ).value )console .log (attrs.item (2 ).value )attrs[0 ].value = 'http://www.baidu.com' attrs.removeNamedItem ('hello' )
element都具备的属性 (直接赋值或者获取)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 var box = document .querySelector ('div' )console .log (box.id )console .log (box.className )console .log (box.style ) console .log (box.tagName ) console .log (box.title ) console .log (box.hi )box.id = 'box' box.className = 'context' element.href = 'http://www.bilibili.com'
元素内样式的操作 获取样式 style 返回一个样式对象 通过样式对象.样式名来获取 1 2 3 4 5 6 7 8 9 var div = document .querySelector ('div' )console .log (div.style ) console .log (div.style [0 ]) console .log (div.style .fontSize )console .log (div.style .color )
getComputedStyle 返回一个样式对象 通过样式对象.样式名来获取 1 2 3 4 5 6 console .log (getComputedStyle (div))console .log (getComputedStyle (div).position )console .log (getComputedStyle (div).color )console .log (getComputedStyle (div).fontSize )
存在兼容问题
1 2 3 4 5 6 function getStyle (ele,name ){ return getComputedStyle?getComputedStyle (ele)[name]:ele.currentStyle [name] }
设置样式 style来进行设置 优点
缺点
每次只能设置一个样式
他会发生多次重绘和重排 (效率低)
1 2 3 4 div.style .fontWeight = 700 div.style .fontSize = '40px'
通过指定class名字来设置
优点
可以一次性设置多个样式
只会发生一次重绘和重排 (效率高)
缺点
创建对应的内容
创建元素 createElement
创建属性 createAttribute
创建文本 createTextNode
创建片段 createDocumentFragment
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 var ele = document .createElement ('a' ) console .log (ele)var attr = document .createAttribute ('href' )attr.value = 'http://www.baidu.com' console .log (attr)ele.setAttributeNode (attr) var text = document .createTextNode ('你好' )console .log (text)ele.appendChild (text) console .log (ele)
节点相关操作 节点主要分为三类 分别为
元素节点 (element)
属性节点 (attribute)
文本节点 (textNode)
关于节点的属性
nodeType 节点类型
nodeName 节点名
nodeValue 节点值
节点名
nodeType
nodeName
nodeValue
元素节点
1
标签名
null
属性节点
2
属性名
属性值
文本节点
3
#text
文本值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 var ele = document .createElement ('a' ) var attr = document .createAttribute ('href' )attr.value = 'http://www.baidu.com' var text = document .createTextNode ('你好' )console .log (ele.nodeType )console .log (attr.nodeType )console .log (text.nodeType )console .log (ele.nodeName )console .log (ele.tagName )console .log (attr.nodeName )console .log (text.nodeName )console .log (ele.nodeValue )console .log (attr.nodeValue )console .log (text.nodeValue )
节点操作的方法 节点的添加
append 追加到后面(支持追加多个)
appendChild (追加到最后)
insertBefor (插入到某个子元素之前)
insertAdjacentHTML (插入html)
insertAdjacentText (插入文本)
insertAdjacentElement (插入元素)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 var ele = document .createElement ('a' ) var ele1 = document .createElement ('p' ) var box = document .getElementById ('box' )box.appendChild (ele) box.insertBefore (ele,box.querySelector ('b' )) box.append ('<b>hello</b>' ) box.insertAdjacentHTML ("afterbegin" ,'<header>hahahah</header>' ) box.insertAdjacentHTML ("beforeBegin" ,'<header>hahahah</header>' ) box.insertAdjacentHTML ("beforeend" ,'<header>hahahah</header>' ) box.insertAdjacentHTML ("afterend" ,'<header>hahahah</header>' ) box.insertAdjacentText ("afterend" ,'<header>hahahah</header>' ) box.insertAdjacentElement ("beforeBegin" ,document .createElement ('footer' ))
删除
remove 移除本身
removeChild 传入对应的子节点进行删除
1 2 3 4 box.removeChild (box.querySelector ('b' ))
替换
replaceChild 替换子节点
replaceChildren 替换所有的子节点
1 2 3 4 box.replaceChild (document .createElement ('div' ),box.querySelector ('b' )) box.replaceChildren (document .createElement ('canvas' ),document .createTextNode ('文本' ))
克隆节点 (返回新的节点)
cloneNode 返回一个新的节点传入一个boolean类型的值是否深度克隆
1 2 3 console .log ( box.cloneNode ()) console .log ( box.cloneNode (true ))
判断是否存在子节点
1 2 console .log (div.hasChildNodes ())
判断是否存在属性的相关方法
hasAttribute 判断是否存在指定属性
hasAttributes 判断是否存在属性
1 2 3 4 5 6 7 <div hello ="你好" > </div > <script > var div = document .querySelector ('div' ) console .log (div.hasAttribute ('hello' )) console .log (div.hasAttribute ('id' )) </script >
节点的关系 (关系查询)(只读属性) 父子关系
childNodes 获取所有的子节点
children 获取所有的子元素节点
firstChild 获取第一个子节点
firstElementChild 获取第一个子元素节点
lastChild 获取最后一个节点
lastElementChild 获取最后一个子元素节点
parentNode 父节点
parentElement 父元素节点
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 console .log (div.childNodes )console .log (div.childNodes .length )console .log (div.children )console .log (div.children .length )console .log (div.firstChild )console .log (div.firstElementChild )console .log (div.lastChild )console .log (div.lastElementChild )console .log (div.parentNode ) console .log (div.parentElement )
兄弟关系
previousSibling 前一个节点
previousElementSibling 前一个元素节点
nextSibling 后一个节点
nextElementSibling 后一个元素节点
1 2 3 4 5 console .log (div.previousSibling ) console .log (div.previousElementSibling ) console .log (div.nextSibling ) console .log (div.nextElementSibling )
去除空文本节点 1 2 3 4 5 6 7 8 9 10 11 function removeEmptyTextNode (node ) { var childs = node.childNodes for (var child of childs) { if (child.nodeType == 3 && child.nodeValue .trim () == '' ) { child.remove () } } }