<ulid="container"></ul> <script> let now = Date.now(); const total = 100000; let ul = document.getElementById('container'); for (let i = 0; i < total; i++) { let li = document.createElement('li'); li.innerText = ~~(Math.random() * total); ul.appendChild(li); } console.log('JS运行时间:', Date.now() - now); setTimeout(() => { console.log('总运行时间:', Date.now() - now); }, 0) </script>
这个时候快速下拉,页面直接卡顿了
至于为什么会出现卡顿现象, 可以看回上一篇文章
优化方案一 - 时间分片
可以采用setTimeout去追加
<script> let ul = document.getElementById('container'); let total = 100000; let once = 20; let page = total / once let index = 0; functionloop(curTotal, curIndex) { if (curTotal <= 0) { returnfalse; } let pageCount = Math.min(curTotal, once); setTimeout(() => { for (let i = 0; i < pageCount; i++) { let li = document.createElement('li'); li.innerText = curIndex + i + ' : ' + ~~(Math.random() * total) ul.appendChild(li) } loop(curTotal - pageCount, curIndex + pageCount) }, 0) } loop(total, index); </script>
<body> <ulid="container"></ul> <script> let ul = document.getElementById('container'); let total = 100000; let once = 20; let page = total / once let index = 0; functionloop(curTotal, curIndex) { if (curTotal <= 0) { returnfalse; } let pageCount = Math.min(curTotal, once); window.requestAnimationFrame(() => { for (let i = 0; i < pageCount; i++) { let li = document.createElement('li'); li.innerText = curIndex + i + ' : ' + ~~(Math.random() * total) ul.appendChild(li) } loop(curTotal - pageCount, curIndex + pageCount); }) } loop(total, index); </script> </body>
其实,对于dom的操作,我们还可以换成操作DocumentFragment
<script> let ul = document.getElementById('container'); let total = 100000; let once = 1000; let page = total / once let index = 0; functionloop(curTotal, curIndex) { if (curTotal <= 0) { returnfalse; } let pageCount = Math.min(curTotal, once); window.requestAnimationFrame(function () { let fragment = document.createDocumentFragment(); for (let i = 0; i < pageCount; i++) { let li = document.createElement('li'); li.innerText = curIndex + i + ' : ' + ~~(Math.random() * total) fragment.appendChild(li) } ul.appendChild(fragment) loop(curTotal - pageCount, curIndex + pageCount) }) } loop(total, index); </script>