题目
DOM 的体积过大会影响页面性能,如果你想在用户敞开页面时统计(计算并反馈给服务器)以后页面元素节点的数量总和、元素节点的最大嵌套深度以及最大子元素个数,请用 JS 配合原生 DOM API 实现需求(不必思考古老浏览器以及在古代浏览器中的兼容性,能够应用任意浏览器的最新个性;不必思考 shadow DOM)。比方在如下页面中运行后:
<html> <head></head> <body> <div> <span>f</span> <span>o</span> <span>o</span> </div> </body></html>
会输入:
{ totalElementsCount: 7, maxDOMTreeDepth: 4, maxChildrenCount: 3}
编程实现(能够查阅相干 DOM API,然而不能够应用前端框架 or 类库):
export function calculateDOMNodes () { // your implementation code here:}window.addEventListener('close', calculateDOMNodes);
答复记录
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title></head><body> <div> <div> <div></div> </div> <div></div> </div> <div> <div></div> </div><script>let counts;window.addEventListener('beforeunload', () => { counts = walk(document.body); navigator.sendBeacon('http://127.0.0.1:10000/beacon', JSON.stringify(counts));});window.addEventListener('close', calculateDOMNodes);function calculateDOMNodes () { navigator.sendBeacon('http://127.0.0.1:10000/beacon', JSON.stringify(counts));}console.log(walk(document.body));function walk (root) { let start = Date.now(); let stack = [root]; let nextLevel = []; let totalElementsCount = -1; let maxDOMTreeDepth = 0; let maxChildrenCount = 0; while (stack.length || nextLevel.length) { if (!stack.length) { stack = nextLevel; nextLevel = []; maxDOMTreeDepth++; continue; } let ele = stack.pop(); totalElementsCount++; if (maxChildrenCount < ele.children.length) maxChildrenCount = ele.children.length; nextLevel.push(...ele.children); } return { totalElementsCount, maxDOMTreeDepth, maxChildrenCount, time: Date.now() - start };}</script></body></html>