一.概念
DOM(Document Object Model)的缩写,即文档对象模型
DOM是针对HTML和XML文档的一个API。
DOM描绘了一个层次化的节点树,即HTML文档中的所有内容都是节点(node)。
DOM树中的所有节点均可通过JS进行访问,允许开发人员添加.移除.修改和查询页面的某一部分
二.DOM
1.节点类型
1.1.文档节点
整个文档是一个'文档节点'
1.2.元素节点
每一个HTML元素是'元素节点'
1.3.文本节点
HTML元素内的文本是'文本节点'(回车也是文本节点)
1.4.属性节点
每个HTML的属性是'属性节点'
1.5.注释节点
注释是'注释节点'
2.nodeType属性
返回一个整数,这个数值代表节点的类型
1.元素节点 返回1
2.属性节点 返回2
3.文本节点 返回3
4.注释节点 返回8
5.文档节点 返回9
3.nodeName属性
返回节点的名称
1.元素节点 返回 标签名称(大写)
2.属性节点 返回 属性名称
3.文本节点 返回 永远都是 #text
4.注释节点 返回 永远都是 #comment
5.文档节点 返回 永远都是 #document
4.tagName属性
返回元素的标签名
在HTML中,tagName属性的返回值始终是大写的
5.nodeValue属性
返回节点的值
1.元素节点 返回 undefined或者null
2.文本节点 返回 文本内容
3.属性节点 返回 属性值
4.注释节点 返回 注释内容
5.文档节点 返回 null
注:对于元素节点,用innerHTML/innerText/value设置或取值
6.节点关系
节点之间的关系,通常用家庭中的辈分关系来描述
- parentNode:父节点
- children:所有元素子节点
- childNodes:所有子节点,ie678与高版本浏览器返回值不一样
- nextSibling:下一个兄弟节点
- previousSibling: 上一个兄弟节点
- firstChild:第一个子节点
-lastChild:最后一个子节点
属性1 属性2 描述
nextSibling nextElementSibling 不兼容IE678 下一个兄弟节点
previousSibling previousElementSibling 不兼容IE678 上一个兄弟节点
firstChild firstElementChild 不兼容IE678 第一个子节点
lastChild lastElementChild 不兼容IE678 最后一个子节点
7.节点方法
| 方法 | 描述 | 兼容性 |
|---|---|---|
| createElement(‘标签名’) | 创建元素节点 | |
| createTextNode(’’) | 创建文本节点 | |
| document.getElementById(’’) | 根据id获取元素 | |
| document.getElementByName(’’) | 根据name属性获取元素,name属性不唯一 | |
| document.getElementByTagName(’’) | 获取指定标签名的所有元素列表 | |
| document.getElementByClassName(‘类名’) | 获取指定className的元素 | IE678不支持 |
| document.querySelector('选择器') | 通过选择器方式获取元素(返回一个元素) | IE678不支持 |
| document.querySelectorAll('选择器') | 通过选择器方式获取元素(返回多个元素) | IE678不支持 |
| document.documentElement | 获取html元素对象 | |
| document.body | 获取body元素对象 | |
| appendChild(node) | 末尾插入一个节点node | |
| insertBefore(newNode,target) | target之前插入节点node | |
| removeChild(node) | 移除某个子节点 | |
| replaceChild(newNode,oldNode) | newNode替换oldNode | |
| cloneNode(boolean) | 复制一个节点:true:深复制,复制节点及整个子节点树false :浅复制,只复制节点本身 | |
| getAttribute(‘name’) | 获取节点上的name属性的值 | |
| setAttribute(‘name’,‘value’) | 设置节点上name属性的值为value | |
| removeAttribute(‘name’) | 删除节点上name属性 | |
| getAttributeNode(‘type’) | 获取节点上的type属性节点 |
DocumentFragment
documentFragment是一个文档碎片,是一种‘轻量级节点’,是一个虚拟的节点对象
documentFragment的nodeType值为11,nodeName的值为f#document-fragment
通常作为仓库来使用,不存在DOM树上,将多个需要插入的新节点放在文档碎片上,再插入文档中可以优化DOM操作
var Fragment=document.createDocumentFragment(); //创建一个文档碎片
8.获取元素样式
行间样式和非行间样式
8.1行间样式:
<div class="box2" style="width: 200px;height: 100px;background:blue;"></div>
console.log( box1.style.width );
8.2非行间样式:
css:
.box1{
width: 100px;
height: 100px;
background: red;
}
html:
<div class="box1"></div>
console.log( box2.style.width );
8.3getComputedStyle获取样式(不兼容IE678)
getComputedStyle(对象,参数).样式
第一个参数是元素对象
第二个参数可以是任何数据,通常写为null或false
eg:
getComputedStyle(box1,null).width;
注:currentStyle:IE678获取样式的方法
如:obj.currentStyle.样式
兼容性处理:
function getStyle(dom,attr){
if (dom.currentStyle) {//IE
return dom.currentStyle[attr];
} else {
return getComputedStyle(dom,null)[attr];
}
}
9.offset/client系列属性
| 属性 | 描述 |
|---|---|
| offsetLeft | 获取对象左侧与定位父级之间的距离(默认是body) |
| offsetTop | 获取对象上侧面与定位父级之间的距离(默认是body) |
| offsetWidth | 获取元素自身的宽度(包含边框) |
| offsetHeight | 获取元素自身的高度(包含边框) |
| clientLeft,clientTop | 获取元素内容到边框的距离,效果和边框宽度相同,很少使用 |
| clientWidth | 获取元素自身的宽度(不含边框) |
| clientHeight | 获取元素自身的高度(不含边框) |
| document.documentElement.clientWidth | 浏览器的可视区宽度 |
| document.documentElement.clientHeight | 浏览器可视区高度 |
| document.body.clientWidth | body的宽度 |
| document.body.clientHeight | body的高度 |
| document.documentElement.offsetWidth | 整个文档宽度 |
| douument.documentElement.offsetHeight | 整个文档高度 |
| document.body.scrollTop | 获取当前滚动的高度(有兼容性问题) |
获取滚动条高度一般使用如下方式:
var scrollTop = document.body.scrollTop || document.documentElement.scrollTop;