if ('PerformanceObserver' in window) {
let lcp;
const observer = new PerformanceObserver((entryList) => {
const entries = entryList.getEntries();
lcp = entries[entries.length - 1];
console.log('LCP candidate:', lcp);
});
observer.observe({ type: 'largest-contentful-paint', buffered: true });
['click', 'scroll', 'keydown', 'pointerdown'].forEach((event) => {
window.addEventListener(event, () => {
observer.disconnect();
console.log('Final LCP:', lcp);
}, { once: true });
});
}
if ('PerformanceObserver' in window) {
const observer = new PerformanceObserver((list) => {
const entries = list.getEntries();
entries.forEach((entry) => {
if (entry.name === 'first-paint') {
console.log('FP (First Paint) time:', entry.startTime);
}
if (entry.name === 'first-contentful-paint') {
console.log('FCP (First Contentful Paint) time:', entry.startTime);
}
});
});
observer.observe({ type: 'paint', buffered: true });
}
let fmpTime = 0;
const checkVisibility = () => {
const targetElement = document.querySelector('.important-element');
if (targetElement && isElementInViewport(targetElement)) {
fmpTime = performance.now();
console.log('First Meaningful Paint Time:', fmpTime);
return;
}
requestAnimationFrame(checkVisibility);
};
const isElementInViewport = (el) => {
const rect = el.getBoundingClientRect();
return (
rect.top < (window.innerHeight || document.documentElement.clientHeight) &&
rect.bottom > 0 &&
rect.left < (window.innerWidth || document.documentElement.clientWidth) &&
rect.right > 0
);
};
document.addEventListener('DOMContentLoaded', () => {
requestAnimationFrame(checkVisibility);
});