@@ -236,11 +236,22 @@ FrameTrail.defineType(
236236
237237 self . _clearContentCollection ( ) ;
238238
239+ var _cvContents = self . contentViewContainer . querySelector ( '.contentViewContents' ) ;
240+ var existingContainer = _cvContents . querySelector ( '.customhtmlContainer' ) ;
241+
242+ // Skip rebuild if the source HTML hasn't changed since last render.
243+ // This preserves DOM elements dynamically created by onReady/custom scripts.
244+ if ( existingContainer && self . _lastCustomHTML === self . contentViewData . html ) {
245+ break ;
246+ }
247+
248+ var htmlChanged = ( self . _lastCustomHTML !== undefined && self . _lastCustomHTML !== self . contentViewData . html ) ;
249+ self . _lastCustomHTML = self . contentViewData . html ;
250+
239251 var customhtmlContainer = document . createElement ( 'div' ) ;
240252 customhtmlContainer . className = 'customhtmlContainer' ;
241253 customhtmlContainer . innerHTML = self . contentViewData . html ;
242254
243- var _cvContents = self . contentViewContainer . querySelector ( '.contentViewContents' ) ;
244255 _cvContents . innerHTML = '' ;
245256 _cvContents . appendChild ( customhtmlContainer ) ;
246257
@@ -250,6 +261,19 @@ FrameTrail.defineType(
250261 }
251262 } ) ;
252263
264+ // Re-fire onReady when HTML source changed so dynamic content is recreated
265+ if ( htmlChanged ) {
266+ var HypervideoModel = FrameTrail . module ( 'HypervideoModel' ) ;
267+ if ( HypervideoModel . events . onReady ) {
268+ try {
269+ var readyEvent = new Function ( 'FrameTrail' , 'hypervideo' , HypervideoModel . events . onReady ) ;
270+ readyEvent ( FrameTrail , FrameTrail . module ( 'HypervideoController' ) ) ;
271+ } catch ( e ) {
272+ console . warn ( 'onReady handler error after CustomHTML update: ' + e . message ) ;
273+ }
274+ }
275+ }
276+
253277 break ;
254278
255279 case 'Transcript' :
0 commit comments