PageSpeed Optimization to reduce TBT by ~2000ms: - Add YoutubeFacade module following Clean Architecture - Replace YouTube iframes with thumbnail + play button - Load real iframe only on user click (lazy-load) - Reduces initial page blocking time significantly Files added: - Public/YoutubeFacade/Infrastructure/Wordpress/YoutubeFacadeHooksRegistrar.php - Public/YoutubeFacade/Infrastructure/Services/YoutubeFacadeContentFilter.php - Public/YoutubeFacade/Infrastructure/Ui/YoutubeFacadeRenderer.php - Public/YoutubeFacade/Infrastructure/Ui/Assets/Css/youtube-facade.css - Public/YoutubeFacade/Infrastructure/Ui/Assets/Js/youtube-facade.js 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
72 lines
2.1 KiB
JavaScript
72 lines
2.1 KiB
JavaScript
/**
|
|
* YouTube Facade - Lazy Load Handler
|
|
*
|
|
* PageSpeed Optimization Phase 2.4:
|
|
* - Loads YouTube iframe only on user click
|
|
* - Reduces TBT by ~2000ms
|
|
*
|
|
* @package ROITheme
|
|
* @since 1.0.6
|
|
*/
|
|
|
|
(function() {
|
|
'use strict';
|
|
|
|
/**
|
|
* Initialize facade click handlers
|
|
*/
|
|
function initYoutubeFacades() {
|
|
var facades = document.querySelectorAll('.youtube-facade[data-video-id]');
|
|
|
|
facades.forEach(function(facade) {
|
|
facade.addEventListener('click', handleFacadeClick);
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Handle click on facade - load real iframe
|
|
* @param {Event} event Click event
|
|
*/
|
|
function handleFacadeClick(event) {
|
|
event.preventDefault();
|
|
|
|
var facade = event.currentTarget;
|
|
var videoId = facade.getAttribute('data-video-id');
|
|
|
|
if (!videoId) {
|
|
return;
|
|
}
|
|
|
|
// Show loading state
|
|
facade.classList.add('youtube-facade--loading');
|
|
|
|
// Create iframe
|
|
var iframe = document.createElement('iframe');
|
|
iframe.setAttribute('src', 'https://www.youtube-nocookie.com/embed/' + videoId + '?autoplay=1&rel=0');
|
|
iframe.setAttribute('title', 'YouTube video');
|
|
iframe.setAttribute('frameborder', '0');
|
|
iframe.setAttribute('allow', 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share');
|
|
iframe.setAttribute('allowfullscreen', '');
|
|
|
|
// Wait for iframe to load before showing
|
|
iframe.addEventListener('load', function() {
|
|
facade.classList.remove('youtube-facade--loading');
|
|
});
|
|
|
|
// Clear facade content and add iframe
|
|
facade.innerHTML = '';
|
|
facade.appendChild(iframe);
|
|
|
|
// Remove click handler (one-time activation)
|
|
facade.removeEventListener('click', handleFacadeClick);
|
|
facade.style.cursor = 'default';
|
|
}
|
|
|
|
// Initialize when DOM is ready
|
|
if (document.readyState === 'loading') {
|
|
document.addEventListener('DOMContentLoaded', initYoutubeFacades);
|
|
} else {
|
|
initYoutubeFacades();
|
|
}
|
|
})();
|