在javascript中定义阴影DOM模板
我正在使用shadowdom创建一个元素,最终用于自定义元素。我的HTML文件已经有点臃肿了,因此理想情况下,我希望将所有模板移到java脚本中,而不是在HTML主体中引用模板 为此,我尝试了这种方法:在javascript中定义阴影DOM模板,javascript,shadow-dom,Javascript,Shadow Dom,我正在使用shadowdom创建一个元素,最终用于自定义元素。我的HTML文件已经有点臃肿了,因此理想情况下,我希望将所有模板移到java脚本中,而不是在HTML主体中引用模板 为此,我尝试了这种方法: var template = document.createElement('template'), div = document.createElement('div'); div.textContent = 'foo'; template.appendChild(div); var
var template = document.createElement('template'),
div = document.createElement('div');
div.textContent = 'foo';
template.appendChild(div);
var shadow = document.body.appendChild('div').createShadowRoot();
shadow.appendChild(template.content.cloneNode());
但是,这会引发NotFoundError。深入挖掘,它看起来像template.content只是定义为#documentFragment
,这似乎可能是问题所在,但我对影子dom或模板了解不够,无法确定
我的代码中是否存在bug,或者是否有更好的方法在javascript中创建模板
首先,此呼叫无效:
document.body.appendChild('div')
为了装载阴影DOM,您需要DOM中的常规元素:
var mountingPoint = document.createElement('div');
document.body.appendChild(mountingPoint);
是包含名为content
的文档片段的元素:
该接口对Web组件也很有用:元素的HTMLTemplateElement.content属性中包含DocumentFragment。()
因此,您可以替换template.appendChild(div)代码>带有:
template.content.appendChild(div);
还要注意,对于Chrome,方法cloneNode
的第一个参数deep
必须是true
,因为
但是您不需要
元素。直接使用创建的DIV:
var div = document.createElement('div');
div.textContent = 'foo';
var mountingPoint = document.createElement('div');
document.body.appendChild(mountingPoint);
var shadow = mountingPoint.attachShadow({mode: 'open'});
shadow.appendChild(div);
首先,此调用无效:
document.body.appendChild('div')
为了装载阴影DOM,您需要DOM中的常规元素:
var mountingPoint = document.createElement('div');
document.body.appendChild(mountingPoint);
是包含名为content
的文档片段的元素:
该接口对Web组件也很有用:元素的HTMLTemplateElement.content属性中包含DocumentFragment。()
因此,您可以替换template.appendChild(div)代码>带有:
template.content.appendChild(div);
还要注意,对于Chrome,方法cloneNode
的第一个参数deep
必须是true
,因为
但是您不需要
元素。直接使用创建的DIV:
var div = document.createElement('div');
div.textContent = 'foo';
var mountingPoint = document.createElement('div');
document.body.appendChild(mountingPoint);
var shadow = mountingPoint.attachShadow({mode: 'open'});
shadow.appendChild(div);