Изменение события на hashchange:
['DOMContentLoaded', 'hashchange'].forEach((event) => {
window.addEventListener(event, () => {
document.getElementById('loginSection')?.style.setProperty('display', 'none');
document.getElementById('signupSection')?.style.setProperty('display', 'none');
document.getElementById(`${location.hash.slice(1)}Section`)?.style.removeProperty('display');
});
});
Более гибкий вариант:
Если ключ в хэше не совпадает ни с одним блоком, то текущий блок не будет скрыт. Код будет выполняться не только при изменении хэша, но и после инициализации страницы (с проверкой, загружена ли уже сейчас страница).
const getBlocks = () => ({
login: document.getElementById('loginSection'),
signup: document.getElementById('signupSection'),
});
const updateBlocks = (href) => {
const url = new URL(href);
const hash = url.hash.slice(1);
const blocks = getBlocks();
if (hash in blocks === false) {
return;
}
for (const key in blocks) {
blocks[key]?.style.setProperty('display', 'none');
}
blocks[hash]?.style.removeProperty('display');
};
window.addEventListener('hashchange', (event) => {
updateBlocks(event.newURL);
});
if (document.readyState === 'interactive' || document.readyState === 'complete') {
updateBlocks(location.href);
} else {
window.addEventListener('DOMContentLoaded', () => {
updateBlocks(location.href);
});
}
Вариант без for:
const getBlocks = () => ({
login: document.getElementById('loginSection'),
signup: document.getElementById('signupSection')
});
const updateBlocks = (href) => {
const url = new URL(href);
const blocks = getBlocks();
const hash = url.hash.slice(1);
if (hash in blocks === false) {
return;
}
blocks.login.style.setProperty('display', 'none');
blocks.signup.style.setProperty('display', 'none');
blocks[hash]?.style.removeProperty('display');
};
window.addEventListener('hashchange', (event) => {
updateBlocks(event.newURL);
});
if (
document.readyState === 'interactive' ||
document.readyState === 'complete'
) {
updateBlocks(location.href);
} else {
window.addEventListener('DOMContentLoaded', () => {
updateBlocks(location.href);
});
}