Мы можем инициализировать шаблон с помощью этой функции стрелки:
const initTemplate = temp =>
document.createRange().createContextualFragment( temp.innerHTML );
const frag = initTemplate( window['someTemplate'] );
Или с помощью этого метода, определенного на template
прототипе (я предпочитаю этот способ):
Object.defineProperty(HTMLTemplateElement.prototype, 'initialise', {
enumerable: false,
value() {
return document.createRange().createContextualFragment( this.innerHTML );
}
});
const frag = window['someTemplate'].initialise();
В любом случае в результате этот код будет работать нормально:
for (const elem of frag.querySelectorAll('x-element') )
elem.foo();
window['someNode'].appendChild( frag );
Я не уверен, являются ли эти методы наиболее эффективным способом инициализации пользовательских элементов в шаблоне.
Также обратите внимание, что нет необходимости в клонировании шаблона.