一、DOM的增删改查
- DOM的新增
- 方法一
- innerHTML
var oDiv = document.querySelector('.a') ;
oDiv.innerHTML = '<p>666</p>'
- 方法二
- 创建一个文本节点 createTextNode()
- 创建标签节点 createElement()
- 插入
(1)在最后面插入 appendChild()
在指定的元素前面插入
(2)insertBefore(要插入的元素 , 指定的元素)
// 1 创建一个标签 createElement
var oP = document.createElement('p') ;
console.log(oP);
// 2 创建一个文本节点
var oText = document.createTextNode('666');
console.log(oText);
// 3 添加子元素 把文本插入标签中
oP.appendChild(oText) ;
// 4 把p插入div中
oDiv.appendChild(oP)
// 同一个标签只能操作一次 --- 标签是对象,对象都有唯一的地址
// oDiv.appendChild(oP)
// oDiv.innerHTML = oP ; // 无法解析?
- 两种方法的区别
- oP 在创建标签的时候,是一个对象
- innerHTML 只能解析字符串
- DOM的删除
- remove() 删除自己和所有的子元素
var oDiv = document.querySelector(".a")
// oDiv.remove()
- removeChild() 删除指定的子元素
var oP = document.querySelector("p")
oDiv.removeChild(oP)
- innerHTML = "" 删除所有的子元素
- DOM的替换
- 替换子元素 replaceChild(new , old)
var oDiv = document.querySelector('.a') ;
var oSpan = document.querySelector('span') ;
var oStrong = document.createElement('strong') ;
oStrong.innerHTML = '888'
oDiv.replaceChild(oStrong , oSpan)
- DOM的查找
- 查找父元素
- parentNode
- 查找子元素
- node 节点 :注释,换行,标签,文本都是节点
- 节点集合: NodeList (伪数组)
- 标签 HTMLCollection
- childNodes 子节点 --- 包含所有的文本,换行,标签,注释等
- children 子元素 --- 只包含标签
- firstElementChild 第一个子元素标签
- lastElementChild 最后一个子元素标签
- firstChild 第一个子节点
- lastChild 最后一个字节点
- 查找兄弟元素
- previousElementSibling 前一个标签兄弟
- nextElementSibling 后一个标签兄弟元素
- previousSibling 前一个兄弟节点
- nextSibling 后一个兄弟节点
- 节点的克隆
- cloneNode() 克隆节点,默认只复制标签
- cloneNode(true) 克隆节点,包含子元素
- 重绘和回流
- 重绘:重新绘画 比如颜色的改变会引发页面重绘
- 回流: 比如插队 display:none /block
- 回流比引发重绘,但重绘不一定引发回流
- 回流的代价大于重绘
- 重绘和回流是无法避免的
- 这个问题只能优化,不能完全解决
- 任何的DOM操作都会引发回流
- 文档碎片
-fragment
- 创建
var fragment = document.createDocumentFragment();
// 给页面上添加100个p标签
for(var i = 0;i<100;i++){
var oP = document.createElement("p");
oP.innerHTML = i;
fragment.appendChild(oP)
}
document.body.appendChild(fragment)