题目

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>