javascript - 文档片段与 `div` 容器

标签 javascript html dom

我搜索了 stackoverflow 问题,发现了几个关于同一主题的问题,但没有一个能提供我正在寻找的广泛答案。大多数答案都集中在性能上,但我也在寻找其他差异。基本上,this one简明扼要地总结了这个问题:

if I create an element (a for example) in a variable but DO NOT APPEND IT TO THE DOM, add elements (divs, tables, etc ) and stuff and after all the work has been done (loops, validations, styling of elements), that element is appended, is it the same as a fragment?

我决定再试一次,看看有没有人能给出好的答案。

那么,我为什么要使用它:

var fragment = document.createDocumentFragment();
var divContainer = document.createElement("div");
var divHeader = document.createElement("div");
divContainer.appendChild( divHeader );
fragment.appendChild( divContainer );
document.getElementById("someElement").appendChild( fragment.cloneNode(true) );

而不是这个:

var divContainer = document.createElement("div");
var divHeader = document.createElement("div");
divContainer.appendChild( divHeader );
document.getElementById("someElement").appendChild( divContainer );

最佳答案

这两种方法在很大程度上是相同的,因为它们都可以用于存储元素而无需立即修改 DOM。不过也有一些问题。

差异:

  • div 具有原型(prototype)链 HTMLDivElement - HTMLElement - Element - Node - EventTarget,而 document-fragment 具有 DocumentFragment - 节点 - 事件目标。这意味着 div 有更多可用的方法和属性(如 innerHTML)。
  • 当将 div 附加到 DOM 时,整个元素被插入,变量仍然引用该元素。附加一个 document-fragment 插入它的所有内容,留下变量引用一个空片段。

用法文档片段:

var fragment = document.createDocumentFragment();
var div1 = document.createElement('div');
var div2 = document.createElement('div');
var div3 = document.createElement('div');

fragment.appendChild(div1);
fragment.appendChild(div2);
div2.appendChild(div3);              //fragment now contains the sub-tree

document.body.appendChild(fragment); //fragment is now an empty document-fragment, and is not in the DOM.

结果:

<body>
    <div></div>       <!--div1-->
    <div>             <!--div2-->
         <div></div>  <!--div3-->
    </div>
</body>

用法div:

var container = document.createElement('div');
var div1 = document.createElement('div');
var div2 = document.createElement('div');
var div3 = document.createElement('div');

container.appendChild(div1);
container.appendChild(div2);
div2.appendChild(div3);               //container is now a div with the sub-tree inside.

document.body.appendChild(container); //container is still the div with the sub-tree, but is now in the DOM.

结果:

<body>
    <div>                 <!--container-->
        <div></div>       <!--div1-->
        <div>             <!--div2-->
             <div></div>  <!--div3-->
        </div>
    </div>
</body>

简而言之:

  • 如果您只想插入一个元素(其中包含其他元素),请使用元素
  • 如果您想使用 innerHTML 解析文本格式的 html,请使用 元素
  • 如果要插入多个相邻 元素,请使用document-fragment

关于javascript - 文档片段与 `div` 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38180780/

相关文章:

javascript - 为什么在函数内部时不调用 google chart 函数?

javascript - 如何在 div 中设置第三个单词的样式并在新代码的一部分中使用该文本?

javascript - 如果有多个同名输入,如何检查文本输入的值?

android - Android 上的 WebKit 可以使用哪些 DOM 事件?

javascript - 页面重新加载后恢复所选/突出显示的文本

javascript - 如果打开的浏览器具有焦点,则使用 Selenium2 和 Behat 监听单击事件将不起作用

javascript - 传递给组件的 ReactJS/Jest : How to test/mock a function,

javascript - 为什么 stopPropagation 在回调中采用事件参数而不是使用 'this' ?

javascript - 如何在Blogger的widget Feed中显示 'showItemThumbnail'?

php - 服务器重启后javascript不工作