website/assets/js/page.js

65 lines
2.1 KiB
JavaScript

import '/assets/scss/page.scss';
document.addEventListener("readystatechange", event => {
if(event.target.readyState === 'complete') {
initExternalLinks();
initEasterEgg();
}
});
function initExternalLinks() {
document.querySelectorAll('a').forEach(elem => {
if(isExternalURL(elem.getAttribute('href'))) {
elem.setAttribute('target', '_blank');
}
})
}
function initEasterEgg() {
document.body.addEventListener('click', function(event) {
// Check if the clicked element is an interactive element or triggers an event
if (!isInteractiveElement(event.target)) {
let randomhue = Math.floor(Math.random() * 360)
let randomstring = Math.floor(Math.random() * eastereggstrings.length);
// Apply the color shift filter to the body
document.body.style.filter = 'hue-rotate(' + randomhue + 'deg)';
document.querySelector('.easter-egg').innerHTML = eastereggstrings[randomstring];
}
});
}
let eastereggstrings = [
"No",
"Stop it",
"It not funny anymore",
"Odette does not like this",
"Garry has asked to stop scaring the birds",
"Seriously?",
"I'm out of here",
"Stop poking me. I' thinking",
"Oh boy"
]
function isInteractiveElement(element) {
// Check if the element is an interactive element or triggers an event
return (
element.tagName === 'A' ||
element.tagName === 'BUTTON' ||
element.tagName === 'INPUT' ||
element.tagName === 'SELECT' ||
element.tagName === 'TEXTAREA' ||
element.getAttribute('onclick') !== null ||
element.getAttribute('onmousedown') !== null ||
element.getAttribute('onmouseup') !== null ||
element.getAttribute('onmouseover') !== null ||
element.getAttribute('onmouseout') !== null ||
element.getAttribute('onmousemove') !== null ||
element.getAttribute('oncontextmenu') !== null
);
}
const isExternalURL = (url) => {
if(url.startsWith('/')) return false;
return new URL(url).origin !== location.origin;
}