Files
roi-theme/Public/YoutubeFacade/Infrastructure/Ui/Assets/Js/youtube-facade.js
FrankZamora 133b364c78 feat(pagespeed): implement YouTube Facade Pattern - Phase 2.4
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>
2025-11-27 13:28:20 -06:00

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();
}
})();