FE-Interview javascript 66
-
setTimeout(
() => {
-
// 总共加载10万条数据
-
const total =
100000
-
// 一次加载20条
-
const once =
20
-
// 需要加载多少次
-
const loopCount = total / once
-
// 加载到第几次了
-
let currentNum =
0
-
-
function add() {
-
// 创建一个文档碎片(上古朕哥叫法)
-
let bigBox =
document.createDocumentFragment()
-
let ul =
document.querySelector(
'ul')
-
// 每次加载once条
-
for (
let i =
0; i < once; i++) {
-
let li =
document.createElement(
'li');
-
li.innerText =
Math.random() *
100
-
bigBox.appendChild(li)
-
}
-
// 插进UI
-
ul.appendChild(bigBox)
-
currentNum++
-
loop()
-
}
-
-
function loop() {
-
if (currentNum < loopCount) {
-
// requestAnimationFrame(add) 每隔10000/屏幕刷新率 毫秒执行一次函数
-
window.requestAnimationFrame(add)
-
}
-
}
-
loop()
-
},
0)
知识点
document.createDocumentFragment( )
没什么好讲的,老知识了,科普一下吧😄
如果当我们要向document中添加大量数据时(比如10w条),如果逐条添加节点,这个过程就会十分缓慢。
当然,你也可以建个新的节点,比如说ul,先将li添加到ul上,然后再将ul添加到页面中.但这样要在父元素中多添加一个<ul>但文档碎片不会产生这种额外节点。
window.requestAnimationFrame( )
与setTimeout相比,requestAnimationFrame最大的优势是由系统来决定回调函数的执行时机。具体一点讲,如果屏幕刷新率是60Hz,那么回调函数就每16.7ms被执行一次,如果刷新率是75Hz,那么这个时间间隔就变成了1000/75=13.3ms,换句话说就是,requestAnimationFrame的步伐跟着系统的刷新步伐走。它能保证回调函数在屏幕每一次的刷新间隔中只被执行一次,这样就不会引起丢帧现象,也不会导致动画出现卡顿的问题。
转载:https://blog.csdn.net/qq_42044542/article/details/106024710
查看评论