问题描述

限制函数被频繁调用,如短时间内往页面中大量添加DOM节点,会让浏览器吃不消,往往会看到浏览器假死。

解决方案

分时函数,分批进行,比如把1秒钟1000次节点创建,改为每隔200ms创建8个节点。

TimeChunk代码

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. </body>
  11. <script>
  12. /**
  13. timeChunk,接受4个参数,第一个是创建节点时需要用到的数据,第二个参数是封装了创建节点函数的逻辑,第三个参数是表示每一批创建的节点数量,
  14. 第四个参数是想要每隔多长ms时间执行。
  15. */
  16. const arr = [];
  17. for (let i = 0; i < 1000; i++) {
  18. arr.push(i);
  19. }
  20. function timeChunk(arr, fn, limit=1, interval=200) {
  21. let obj;
  22. let start = function() {
  23. for (let i = 0; i < Math.min(arr.length, limit); i++) {
  24. obj = arr.shift();
  25. fn(obj);
  26. }
  27. }
  28. // 分片执行
  29. // setTimeInterval
  30. return function() {
  31. let timer = null;
  32. const me = this;
  33. timer = setInterval(function(){
  34. // 如果arr为空了,则处理完成
  35. if (arr.length === 0) {
  36. return clearInterval(timer);
  37. }
  38. start();
  39. }, interval);
  40. }
  41. }
  42. const renderFriendList = timeChunk(arr, function(data) {
  43. const div = document.createElement('div');
  44. div.innerHTML = data;
  45. document.body.appendChild(div);
  46. }, 8, 200);
  47. func();
  48. </script>
  49. </html>