diff --git a/view/frontend/templates/bfcache/handler.phtml b/view/frontend/templates/bfcache/handler.phtml index b48b663..4f36a14 100644 --- a/view/frontend/templates/bfcache/handler.phtml +++ b/view/frontend/templates/bfcache/handler.phtml @@ -150,11 +150,38 @@ $script = << (window._bfcacheHandler ??= new BFCacheHandler()).init(); + + // 1️⃣ Chrome / Firefox / Safari / Edge — BFCache restore + window.addEventListener('pageshow', (event) => { - if (event.persisted) { - (window._bfcacheHandler ??= new BFCacheHandler()).init(); - } + const navType = performance.getEntriesByType('navigation')[0]?.type; + if (event.persisted || navType === 'back_forward') { + initHandler(); + } }, { passive: true }); + + // 2️⃣ Chrome / Edge — prerendering API + if ('prerendering' in document || 'onprerenderingchange' in document) { + document.addEventListener('prerenderingchange', () => { + if (!window._bfcacheHandler?._initialized) { + window._bfcacheHandler = new BFCacheHandler(); + window._bfcacheHandler._initialized = true; + window._bfcacheHandler.init(); + } + }, { passive: true }); + } + + // 3️⃣ Safari / Legacy fallback — visibilitychange + + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible' && !window._bfcacheHandler?._initialized) { + window._bfcacheHandler = new BFCacheHandler(); + window._bfcacheHandler._initialized = true; + window._bfcacheHandler.init(); + } + }, { passive: true }); + })(); JS; ?> diff --git a/view/frontend/templates/hyva/bfcache/handler.phtml b/view/frontend/templates/hyva/bfcache/handler.phtml index fc1c444..29fef18 100644 --- a/view/frontend/templates/hyva/bfcache/handler.phtml +++ b/view/frontend/templates/hyva/bfcache/handler.phtml @@ -166,10 +166,35 @@ $autoCloseMenuMobile = $bfcacheConfig->autoCloseMenuMobile() ? 'true' : 'false'; + */ + // --- Initialization with full browser coverage ---?> + const initHandler = () => (window._bfcacheHandler ??= new BFCacheHandler()).init(); + + window.addEventListener('pageshow', (event) => { - if (event.persisted) { - (window._bfcacheHandler ??= new BFCacheHandler()).init(); + const navType = performance.getEntriesByType('navigation')[0]?.type; + if (event.persisted || navType === 'back_forward') { + initHandler(); + } + }, { passive: true }); + + + if ('prerendering' in document || 'onprerenderingchange' in document) { + document.addEventListener('prerenderingchange', () => { + if (!window._bfcacheHandler?._initialized) { + window._bfcacheHandler = new BFCacheHandler(); + window._bfcacheHandler._initialized = true; + window._bfcacheHandler.init(); + } + }, { passive: true }); + } + + + document.addEventListener('visibilitychange', () => { + if (document.visibilityState === 'visible' && !window._bfcacheHandler?._initialized) { + window._bfcacheHandler = new BFCacheHandler(); + window._bfcacheHandler._initialized = true; + window._bfcacheHandler.init(); } }, { passive: true }); })();