/** * P1-7: 強制重排優化 (Forced Layout Reflow Prevention) * 使用 requestAnimationFrame 批處理 DOM 讀寫操作 */ (function() { 'use strict'; // 延遲初始化,避免立即強制重排 if (window.requestIdleCallback) { // 高優先級:等待閒置時間 requestIdleCallback(function() { optimizeCarouselInit(); optimizeMapInit(); }, { timeout: 2000 }); } else { // 低優先級:等待當前 task 完成 setTimeout(function() { optimizeCarouselInit(); optimizeMapInit(); }, 100); } /** * 優化 Owl Carousel 初始化 * 避免在初始化時多次測量 DOM */ function optimizeCarouselInit() { // 預先設定容器尺寸,避免初始化時重排 var carousels = document.querySelectorAll('.owl-carousel'); if (carousels.length === 0) return; // 使用 requestAnimationFrame 批處理所有 carousel 初始化 requestAnimationFrame(function() { carousels.forEach(function(carousel) { // 確保容器有寬度/高度,避免重排測量 if (!carousel.style.width) { carousel.style.width = '100%'; } if (!carousel.style.height) { var rect = carousel.getBoundingClientRect(); if (rect.height === 0) { // 預設高度,避免初始化時重排 carousel.style.minHeight = '300px'; } } }); }); } /** * 優化 Google Maps 初始化 * 延遲 initMap 調用,避免強制重排 */ function optimizeMapInit() { var mapContainer = document.getElementById('map'); if (!mapContainer) return; // 確保地圖容器有固定尺寸 if (!mapContainer.style.width) { mapContainer.style.width = '100%'; } if (!mapContainer.style.height) { mapContainer.style.height = '400px'; } // 如果 initMap 已定義,推遲執行以避免強制重排 if (typeof window.initMap === 'function') { requestAnimationFrame(function() { try { window.initMap(); } catch (e) { console.warn('initMap failed:', e); } }); } } /** * 優化 HoldOn 初始化 * 避免頻繁的 width/height 查詢 */ window.optimizeHoldOn = function() { // 如果多次呼叫 HoldOn.open(),使用防抖 var holdOnTimeout; var originalOpen = window.HoldOn && window.HoldOn.open; if (originalOpen) { window.HoldOn.open = function(options) { clearTimeout(holdOnTimeout); holdOnTimeout = setTimeout(function() { originalOpen.call(window.HoldOn, options); }, 16); // 一幀延遲 }; } }; // 呼叫優化 if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', window.optimizeHoldOn); } else { window.optimizeHoldOn(); } })();