diff --git a/src/runtime/internal/dom.ts b/src/runtime/internal/dom.ts index 287c16b5fc5..417b697d221 100644 --- a/src/runtime/internal/dom.ts +++ b/src/runtime/internal/dom.ts @@ -650,7 +650,7 @@ export class HtmlTag { // html tag nodes n: ChildNode[]; // target - t: HTMLElement; + t: HTMLElement | DocumentFragment; // anchor a: HTMLElement; @@ -665,7 +665,7 @@ export class HtmlTag { m(html: string, target: HTMLElement, anchor: HTMLElement = null) { if (!this.e) { this.e = element(target.nodeName as keyof HTMLElementTagNameMap); - this.t = target; + this.t = target.tagName !== 'TEMPLATE' ? target : (target as HTMLTemplateElement).content; this.c(html); } @@ -674,7 +674,7 @@ export class HtmlTag { h(html: string) { this.e.innerHTML = html; - this.n = Array.from(this.e.childNodes); + this.n = Array.from(this.e.nodeName == 'TEMPLATE' ? (this.e as HTMLTemplateElement).content.childNodes : this.e.childNodes); } i(anchor) { diff --git a/test/runtime/samples/template/_config.js b/test/runtime/samples/template/_config.js index 6e92d771bd9..2a65b787165 100644 --- a/test/runtime/samples/template/_config.js +++ b/test/runtime/samples/template/_config.js @@ -6,6 +6,7 @@ export default {
foo
+ `, test({ assert, target }) { @@ -27,5 +28,16 @@ export default { assert.equal(template2.content.firstChild.textContent, '123'); assert.htmlEqual(template2.innerHTML, '123'); + const template3 = target.querySelector('#t3'); + assert.equal(template3.childNodes.length, 0); + assert.equal(template3.content.childNodes.length, 3); + // test: (with hydration from ssr rendered html) + // out of order render. + // may render as for ssr+hydration case. + // we bypass it by using symmetric siblings. hence