首先要了解
在
js
每次操作dom
时都会对DOM进行一次重排,所谓重排也就是当元素的大小,位置结构发生变化的时候,就会引起浏览器对当前页面的结构进行一次重新的计算,这是非常耗费浏览器性能的。 虚拟
DOM
的出现很好的解决了这一问题,而js
中的文档碎片就类似于虚拟DOM。
什么是文档碎片?
document.createDocumentFragment()
利用上述语法,创建一个空的容器,用于存放创建的DOM
元素
利用普通的方式修改页面内容
需操作多次DOM才能成功的修改页面内容,如图
for (var i = 10; i > 0; i--) {
var elem = document.createElement('div');
elem.innerHTML='修改后'
console.log(elem);
document.body.appendChild(elem); //放到body中
}
利用文档碎片进行修改
而利用文档碎片修改,只需要进行一次的DOM操作,即可完成,如图
// 1、创建一个空的容器
var fragment = document.createDocumentFragment()
// console.dir(fragment);
// 2、获取ul标签
var li = document.querySelector('#liBox')
// console.log(li);
// 判断一下,这个获取到的第一个子节点是否存在
while (li.firstChild) {
fragment.appendChild(li.firstChild)
}
let child = fragment.childNodes
// console.log(child);
// 3、修改
Array.from(child).forEach(itemNode => {
/*
这里不懂得同学可以先打印看一下,只要有换行都有#text
#text ==>nodeType:3
li===>nodeType:1
*/
// console.log(child);
if (itemNode.nodeType === 1) {
itemNode.innerHTML = '这是修改后的文档碎片'
}
})
// console.log(frag);
// 4、将frag进行添加
li.appendChild(fragment)
类似于虚拟DOM的思想,在内存中先开辟出一块地方,对于所有节点的操作都在内存中先完成,完成后再一次更新到页面中,又花了浏览器的性能。
最后,完整代码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>文档碎片</title>
<style>
li {
list-style: none;
}
</style>
</head>
<body>
<ul id="liBox">
<li>这是一个文档碎片</li>
<li>这是一个文档碎片</li>
<li>这是一个文档碎片</li>
<li>这是一个文档碎片</li>
<li>这是一个文档碎片</li>
</ul>
</body>
</html>
<script>
var fragment = document.createDocumentFragment()
var li = document.querySelector('#liBox')
while (li.firstChild) {
fragment.appendChild(li.firstChild)
}
let child = fragment.childNodes
// 3、修改
Array.from(child).forEach(itemNode => {
if (itemNode.nodeType === 1) {
itemNode.innerHTML = '这是修改后的文档碎片'
}
})
li.appendChild(fragment)
console.log(li);
</script>