Add checks for container presence in animation functions to prevent errors when elements are removed from the DOM [skip ci]
This commit is contained in:
@@ -245,6 +245,7 @@ function animateRabbit(rabbit) {
|
|||||||
|
|
||||||
isAnimating = false;
|
isAnimating = false;
|
||||||
rabbitTimeout = setTimeout(() => {
|
rabbitTimeout = setTimeout(() => {
|
||||||
|
if (!document.body.contains(rabbit)) return;
|
||||||
animateRabbit(document.querySelector('#rabbit'));
|
animateRabbit(document.querySelector('#rabbit'));
|
||||||
}, restTime);
|
}, restTime);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ function startFireworks() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fireworksInterval = setInterval(() => {
|
fireworksInterval = setInterval(() => {
|
||||||
|
if (!document.body.contains(fireworkContainer)) { clearInterval(fireworksInterval); return; }
|
||||||
const randomCount = Math.floor(Math.random() * maxFireworks) + minFireworks;
|
const randomCount = Math.floor(Math.random() * maxFireworks) + minFireworks;
|
||||||
for (let i = 0; i < randomCount; i++) {
|
for (let i = 0; i < randomCount; i++) {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
|||||||
@@ -61,12 +61,12 @@ function createFriday13(container) {
|
|||||||
cat.parentNode.removeChild(cat);
|
cat.parentNode.removeChild(cat);
|
||||||
}
|
}
|
||||||
// Respawn with random delay between 5 to 25 seconds
|
// Respawn with random delay between 5 to 25 seconds
|
||||||
setTimeout(spawnCat, Math.random() * 20000 + 5000);
|
setTimeout(() => { if (document.body.contains(container)) spawnCat(); }, Math.random() * 20000 + 5000);
|
||||||
}, (catWalkDurationSeconds * 1000) + 500); // Wait for duration + 500ms safety margin
|
}, (catWalkDurationSeconds * 1000) + 500); // Wait for duration + 500ms safety margin
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initial spawn with random delay
|
// Initial spawn with random delay
|
||||||
setTimeout(spawnCat, Math.random() * 5000);
|
setTimeout(() => { if (document.body.contains(container)) spawnCat(); }, Math.random() * 5000);
|
||||||
}
|
}
|
||||||
|
|
||||||
function initializeFriday13() {
|
function initializeFriday13() {
|
||||||
|
|||||||
@@ -51,8 +51,9 @@ function createMarioDay(container) {
|
|||||||
container.appendChild(wrapper);
|
container.appendChild(wrapper);
|
||||||
|
|
||||||
// Periodically throw out an 8-bit coin
|
// Periodically throw out an 8-bit coin
|
||||||
setInterval(() => {
|
const intervalId = setInterval(() => {
|
||||||
if (!document.querySelector('.marioday-container')) return;
|
if (!document.body.contains(container)) { clearInterval(intervalId); return; }
|
||||||
|
if (container.style.display === 'none') return;
|
||||||
const coin = document.createElement('div');
|
const coin = document.createElement('div');
|
||||||
coin.className = 'mario-coin';
|
coin.className = 'mario-coin';
|
||||||
|
|
||||||
|
|||||||
@@ -136,6 +136,7 @@ function createElements() {
|
|||||||
for(let i=0; i<maxTrails; i++) trails.push(new Trail());
|
for(let i=0; i<maxTrails; i++) trails.push(new Trail());
|
||||||
|
|
||||||
function loop() {
|
function loop() {
|
||||||
|
if (!document.body.contains(container)) { clearInterval(window.matrixInterval); return; }
|
||||||
if (isHidden) return; // Pause drawing when hidden
|
if (isHidden) return; // Pause drawing when hidden
|
||||||
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
ctx.clearRect(0, 0, canvas.width, canvas.height);
|
||||||
ctx.font = 'bold ' + fontSize + 'px monospace';
|
ctx.font = 'bold ' + fontSize + 'px monospace';
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ function createOscar(container) {
|
|||||||
container.appendChild(carpet);
|
container.appendChild(carpet);
|
||||||
container.appendChild(spotlights);
|
container.appendChild(spotlights);
|
||||||
|
|
||||||
// Paparazzi flashes with randomized intervals
|
|
||||||
function flashLoop() {
|
function flashLoop() {
|
||||||
if (!document.querySelector('.oscar-container')) {
|
if (!document.body.contains(container)) return; // Kill the loop if container is removed
|
||||||
|
if (container.style.display === 'none') {
|
||||||
setTimeout(flashLoop, 1000); // Check again later if hidden
|
setTimeout(flashLoop, 1000); // Check again later if hidden
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -238,7 +238,7 @@ function animateSanta() {
|
|||||||
function startAnimation() {
|
function startAnimation() {
|
||||||
const santaHeight = santa.offsetHeight;
|
const santaHeight = santa.offsetHeight;
|
||||||
if (santaHeight === 0) {
|
if (santaHeight === 0) {
|
||||||
setTimeout(startAnimation, 100);
|
setTimeout(() => { if (document.body.contains(santa)) startAnimation(); }, 100);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// console.log('Santa height: ', santaHeight);
|
// console.log('Santa height: ', santaHeight);
|
||||||
@@ -283,7 +283,7 @@ function animateSanta() {
|
|||||||
animationFrameIdSanta = requestAnimationFrame(move);
|
animationFrameIdSanta = requestAnimationFrame(move);
|
||||||
} else {
|
} else {
|
||||||
const pause = Math.random() * ((maxSantaRestTime - minSantaRestTime) * 1000) + minSantaRestTime * 1000;
|
const pause = Math.random() * ((maxSantaRestTime - minSantaRestTime) * 1000) + minSantaRestTime * 1000;
|
||||||
setTimeout(animateSanta, pause);
|
setTimeout(() => { if (document.body.contains(santa)) animateSanta(); }, pause);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -252,7 +252,8 @@ function createSpace() {
|
|||||||
// Swap to a random image from the pool every time it completes an orbit (disappears)
|
// Swap to a random image from the pool every time it completes an orbit (disappears)
|
||||||
if (imageArr.length > 1) {
|
if (imageArr.length > 1) {
|
||||||
// The animation delay pushes the initial cycle, so we use setInterval matched to duration
|
// The animation delay pushes the initial cycle, so we use setInterval matched to duration
|
||||||
setInterval(() => {
|
const intervalId = setInterval(() => {
|
||||||
|
if (!document.body.contains(container)) { clearInterval(intervalId); return; }
|
||||||
// Update only if currently out of bounds to avoid popping
|
// Update only if currently out of bounds to avoid popping
|
||||||
const rect = symbol.getBoundingClientRect();
|
const rect = symbol.getBoundingClientRect();
|
||||||
if (rect.right < 0 || rect.left > window.innerWidth) {
|
if (rect.right < 0 || rect.left > window.innerWidth) {
|
||||||
|
|||||||
@@ -203,12 +203,12 @@ function createSports() {
|
|||||||
}, arcDuration * 1000 + 500);
|
}, arcDuration * 1000 + 500);
|
||||||
|
|
||||||
// Schedule the next trophy
|
// Schedule the next trophy
|
||||||
setTimeout(launchTrophy, Math.random() * 20000 + 10000); // Wait 10-30s until next trophy
|
setTimeout(() => { if (document.body.contains(container)) launchTrophy(); }, Math.random() * 20000 + 10000); // Wait 10-30s until next trophy
|
||||||
}
|
}
|
||||||
|
|
||||||
// Launch initial trophy after a short delay
|
// Launch initial trophy after a short delay
|
||||||
if (enableTrophy) {
|
if (enableTrophy) {
|
||||||
setTimeout(launchTrophy, Math.random() * 5000 + 2000);
|
setTimeout(() => { if (document.body.contains(container)) launchTrophy(); }, Math.random() * 5000 + 2000);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add Germany Colored confetti (Black, Red, Gold)
|
// Add Germany Colored confetti (Black, Red, Gold)
|
||||||
|
|||||||
@@ -295,7 +295,7 @@ function createBird(container) {
|
|||||||
wrapper.addEventListener('animationend', (e) => {
|
wrapper.addEventListener('animationend', (e) => {
|
||||||
if (e.animationName.includes('fly-')) {
|
if (e.animationName.includes('fly-')) {
|
||||||
wrapper.remove();
|
wrapper.remove();
|
||||||
createBird(container);
|
if (document.body.contains(container)) createBird(container);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -338,7 +338,7 @@ function createButterfly(container) {
|
|||||||
wrapper.addEventListener('animationend', (e) => {
|
wrapper.addEventListener('animationend', (e) => {
|
||||||
if (e.animationName.includes('fly-')) {
|
if (e.animationName.includes('fly-')) {
|
||||||
wrapper.remove();
|
wrapper.remove();
|
||||||
createButterfly(container);
|
if (document.body.contains(container)) createButterfly(container);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -385,7 +385,7 @@ function createBee(container) {
|
|||||||
wrapper.addEventListener('animationend', (e) => {
|
wrapper.addEventListener('animationend', (e) => {
|
||||||
if (e.animationName.includes('fly-')) {
|
if (e.animationName.includes('fly-')) {
|
||||||
wrapper.remove();
|
wrapper.remove();
|
||||||
createBee(container);
|
if (document.body.contains(container)) createBee(container);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -428,7 +428,7 @@ function createLadybugGif(container) {
|
|||||||
wrapper.addEventListener('animationend', (e) => {
|
wrapper.addEventListener('animationend', (e) => {
|
||||||
if (e.animationName.includes('walk-')) {
|
if (e.animationName.includes('walk-')) {
|
||||||
wrapper.remove();
|
wrapper.remove();
|
||||||
createLadybugGif(container);
|
if (document.body.contains(container)) createLadybugGif(container);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user