JavaScript:复制节点到DocumentFragment
JavaScript: Copy Node to DocumentFragment
我认为 DocumentFragment 的全部意义在于能够在不触及 DOM 的情况下构建内容,直到它准备好。
鉴于 DocumentFragment 不支持 innerHTML
,它可能有点乏味。另一方面,一旦构造完成,就可以很容易地通过片段本身将内容添加到现有的 DOM 节点。
如果我创建了一个 div
而没有将它添加到 DOM,我可以按照我喜欢的方式填充它,包括 innerHTML
。据我所知,它应该不会对性能产生额外影响。
是否有一种简单的方法(即一行左右)将现有 DOM 节点的内容复制到 DocumentFragment?该过程如下所示:
var div=document.createElement('div');
var fragment=document.createDocumentFragment();
div.innerHTML='…';
// copy contents to fragment
// etc
这样我就可以两全其美了。
回答
下面是@KevBot 的回答并入示例:
var divTest=document.querySelector('div#test');
var html='<p>One</p><p>Two</p>';
var fragment=document.createRange().createContextualFragment(html);
divTest.appendChild(fragment);
您可以使用 appendChild
将新元素添加到片段中。
var div=document.createElement('div');
var fragment=document.createDocumentFragment();
div.innerHTML='…';
fragment.appendChild(div);
如果您只想将元素的内容注入到片段中,那么您可以遍历 childNodes
并将它们插入到片段中。
div.childNodes.forEach(function(node) {
fragment.appendChild(node);
});
试试这些尺码
text = frag.appendChild( document.createTextNode( "insert text here" ) )
或
text = frag.appendChild( document.createTextNode( div.innerHTML ) )
或
text = frag.appendChild( document.createTextNode( div.textContent ) )
text
变量将保存文本节点,同时您还将文本节点全部附加在一行中
您可以创建一个<template>
元素,它是一个文档片段;设置 template
元素的 .innerHTML
,并使用 .content
属性
获取 template
元素的 .innerHTML
var template = document.createElement("template");
var div = document.createElement("div");
div.innerHTML = "<p>abc</p>";
template.innerHTML = div.innerHTML;
document.body.appendChild(template.content);
是的,您可以使用 document.createRange
方法轻松创建带有字符串 HTML 的片段。
document.createRange
returns 一个 Range
object, which has a method called createContextualFragment
允许您从 HTML.
中获取片段
function fragmentFromString(strHTML) {
return document.createRange().createContextualFragment(strHTML);
}
let div = document.createElement('div');
div.innerHTML = '<p>Testing</p>';
let fragment = fragmentFromString(div.innerHTML);
console.log(fragment);
<div>
<p>Random Content</p>
</div>
适用于所有主流浏览器和 IE11。
我认为 DocumentFragment 的全部意义在于能够在不触及 DOM 的情况下构建内容,直到它准备好。
鉴于 DocumentFragment 不支持 innerHTML
,它可能有点乏味。另一方面,一旦构造完成,就可以很容易地通过片段本身将内容添加到现有的 DOM 节点。
如果我创建了一个 div
而没有将它添加到 DOM,我可以按照我喜欢的方式填充它,包括 innerHTML
。据我所知,它应该不会对性能产生额外影响。
是否有一种简单的方法(即一行左右)将现有 DOM 节点的内容复制到 DocumentFragment?该过程如下所示:
var div=document.createElement('div');
var fragment=document.createDocumentFragment();
div.innerHTML='…';
// copy contents to fragment
// etc
这样我就可以两全其美了。
回答
下面是@KevBot 的回答并入示例:
var divTest=document.querySelector('div#test');
var html='<p>One</p><p>Two</p>';
var fragment=document.createRange().createContextualFragment(html);
divTest.appendChild(fragment);
您可以使用 appendChild
将新元素添加到片段中。
var div=document.createElement('div');
var fragment=document.createDocumentFragment();
div.innerHTML='…';
fragment.appendChild(div);
如果您只想将元素的内容注入到片段中,那么您可以遍历 childNodes
并将它们插入到片段中。
div.childNodes.forEach(function(node) {
fragment.appendChild(node);
});
试试这些尺码
text = frag.appendChild( document.createTextNode( "insert text here" ) )
或
text = frag.appendChild( document.createTextNode( div.innerHTML ) )
或
text = frag.appendChild( document.createTextNode( div.textContent ) )
text
变量将保存文本节点,同时您还将文本节点全部附加在一行中
您可以创建一个<template>
元素,它是一个文档片段;设置 template
元素的 .innerHTML
,并使用 .content
属性
template
元素的 .innerHTML
var template = document.createElement("template");
var div = document.createElement("div");
div.innerHTML = "<p>abc</p>";
template.innerHTML = div.innerHTML;
document.body.appendChild(template.content);
是的,您可以使用 document.createRange
方法轻松创建带有字符串 HTML 的片段。
document.createRange
returns 一个 Range
object, which has a method called createContextualFragment
允许您从 HTML.
function fragmentFromString(strHTML) {
return document.createRange().createContextualFragment(strHTML);
}
let div = document.createElement('div');
div.innerHTML = '<p>Testing</p>';
let fragment = fragmentFromString(div.innerHTML);
console.log(fragment);
<div>
<p>Random Content</p>
</div>
适用于所有主流浏览器和 IE11。