【问题标题】:When does a DOM-Element belong to the DOM-treeDOM-Element 什么时候属于 DOM-tree
【发布时间】:2015-01-09 16:33:08
【问题描述】:

我最近在做一些 DOM 测试,所以我遇到了一个我还没有找到明确答案的问题。当您使用 document.createElement(...) 创建 DOM-Element 但您没有通过例如 [ElementInDom].appendChild(...) 将其附加到 DOM 时。这个 DOM 元素是否像 Javascript 中的任何其他字符串或数组等一样处理,或者文档是否在将其添加到 DOM 之前处理对 DOM 元素的访问?

我编写了一个小测试,它确实表明访问未附加到 DOM 的 DOM-Element 比访问附加到文档的 DOM-Element 更快(而不是通过将其设置为 display: none 来呈现)。但要求确定。我故意只把它放到 DOM-tree 上而不是 Render-tree 上。

测试是Here

<html>
<body>

<ul style="display:none;"></ul>

<script>
    var inDOM = document.getElementsByTagName('ul')[0];
    var noDOM = document.createElement('ul');
    var array = [];

    var start1 = new Date();

    for (var i=0; i<1000000; i++) {
        inDOM.appendChild(document.createElement('li'));
    };

    var end1 = new Date() - start1;

    var start2 = new Date();

    for (var i=0; i<1000000; i++) {
            noDOM.appendChild(document.createElement('li'));
    };

    var end2 = new Date() - start2;

    var start3 = new Date();

    for (var i=0; i<1000000; i++) {
        array[i] = document.createElement('li');
    };

    var end3 = new Date() - start3;

    console.log('in DOM: ' + end1);
    console.log('not in DOM: ' + end2);
    console.log('to Array: ' + end3);
</script>

</body>
</html>

【问题讨论】:

  • 它只有在附加到文档或其子级后才成为 DOM 的一部分,否则它就像任何其他具有分配给变量的方法的对象一样。我想这就是你真正要问的?

标签: javascript dom


【解决方案1】:

每个 DOM 元素在 JavaScript 中都表示为一个对象,无论它是否在文档中。文档中的 DOM 元素和文档中 not 的 DOM 元素的区别在于对 DOM 元素的突变所产生的影响。

如果 DOM 元素不在文档中,它不会影响当前视图,因此如果您改变它,浏览器就不必执行重排。回流很昂贵,所以不必须这样做更快。

如果存在从元素到文档根目录 (document.documentElement) 的路径,则该 DOM 元素位于文档中。

【讨论】:

  • 比我的评论更清楚。
  • 啊,好吧,但是将 DOM 元素附加到文档但显示设置为无。比它在文档(DOM-tree)中但不在渲染树中,但就像我的测试说它似乎对访问元素有影响,但它不会影响当前视图,因此不会影响浏览器,因为它不执行回流。
  • 好点。我不确定,我假设浏览器仍然需要执行一些其他的簿记。或者它可能会抢先计算一些样式(例如颜色),以防父级变得可见。
猜你喜欢
  • 2021-03-10
  • 2010-11-30
  • 1970-01-01
  • 2012-01-12
  • 2021-10-22
  • 2014-07-19
  • 2021-04-04
  • 2014-09-05
  • 1970-01-01
相关资源
最近更新 更多