@@ -2079,14 +2079,16 @@ export class FxFore extends HTMLElement {
20792079 if ( ! newNode || ! parentNodeset ) {
20802080 continue ;
20812081 }
2082- if ( newNode . nodeType === Node . ATTRIBUTE_NODE ) {
2083- parentNodeset . setAttributeNode ( newNode ) ;
2084- } else {
2085- const referenceNode = this . _findReferenceNodeForNewElement ( newNode , parentNodeset , null ) ;
2086- if ( referenceNode ) {
2087- referenceNode . after ( newNode ) ;
2082+ if ( ! this . _isNodeAlreadyAttached ( newNode ) ) {
2083+ if ( newNode . nodeType === Node . ATTRIBUTE_NODE ) {
2084+ parentNodeset . setAttributeNode ( newNode ) ;
20882085 } else {
2089- parentNodeset . prepend ( newNode ) ;
2086+ const referenceNode = this . _findReferenceNodeForNewElement ( newNode , parentNodeset , null ) ;
2087+ if ( referenceNode ) {
2088+ referenceNode . after ( newNode ) ;
2089+ } else {
2090+ parentNodeset . prepend ( newNode ) ;
2091+ }
20902092 }
20912093 }
20922094 bound . evalInContext ( ) ;
@@ -2130,23 +2132,25 @@ export class FxFore extends HTMLElement {
21302132 continue ;
21312133 }
21322134
2133- if ( newNode . nodeType === Node . ATTRIBUTE_NODE ) {
2134- parentNodeset . setAttributeNode ( newNode ) ;
2135- } else {
2136- let referenceNode = this . _findReferenceNodeForNewElement (
2137- newNode ,
2138- parentNodeset ,
2139- siblingControl ,
2140- ) ;
2135+ if ( ! this . _isNodeAlreadyAttached ( newNode ) ) {
2136+ if ( newNode . nodeType === Node . ATTRIBUTE_NODE ) {
2137+ parentNodeset . setAttributeNode ( newNode ) ;
2138+ } else {
2139+ let referenceNode = this . _findReferenceNodeForNewElement (
2140+ newNode ,
2141+ parentNodeset ,
2142+ siblingControl ,
2143+ ) ;
21412144
2142- if ( referenceNode ) {
2143- if ( referenceNode . nodeType === Node . DOCUMENT_NODE ) {
2144- referenceNode . firstElementChild . append ( newNode ) ;
2145+ if ( referenceNode ) {
2146+ if ( referenceNode . nodeType === Node . DOCUMENT_NODE ) {
2147+ referenceNode . firstElementChild . append ( newNode ) ;
2148+ } else {
2149+ referenceNode . after ( newNode ) ;
2150+ }
21452151 } else {
2146- referenceNode . after ( newNode ) ;
2152+ parentNodeset . prepend ( newNode ) ;
21472153 }
2148- } else {
2149- parentNodeset . prepend ( newNode ) ;
21502154 }
21512155 }
21522156
@@ -2159,6 +2163,17 @@ export class FxFore extends HTMLElement {
21592163 }
21602164 }
21612165 }
2166+ /**
2167+ * `createNodes()` sometimes splices a created node directly into an existing real parent
2168+ * (when it reused an already-existing intermediate step) instead of returning a detached
2169+ * node for the caller to position. Callers use this to skip their own insertion logic in
2170+ * that case.
2171+ * @param {Node } node
2172+ */
2173+ _isNodeAlreadyAttached ( node ) {
2174+ return node . nodeType === Node . ATTRIBUTE_NODE ? ! ! node . ownerElement : ! ! node . parentNode ;
2175+ }
2176+
21622177 /**
21632178 * Create Nodes from an XPath
21642179 * @param {string } ref
0 commit comments