#javascript #html #toggle #addeventlistener
Вопрос:
Я написал код, который вместо включения светлого/темного режима включает режим весна/лето/осень/зима. Вот пример одного сезона:
const springThemeOn = sessionStorage.getItem("springtheme")
if (springThemeOn==="true"){
document.body.className = "spring-theme";
spring.classList.add('hide-icon');
summer.classList.remove('hide-icon');
autumn.classList.remove('hide-icon');
winter.classList.remove('hide-icon');
}
//spring change
springIcon.addEventListener('click', () => {
document.body.classList.toggle('spring-theme');
spring.classList.toggle('show-icon');
summer.classList.toggle('show-icon');
autumn.classList.toggle('show-icon');
winter.classList.toggle('show-icon');
// Store toggle info between pages
if (document.body.className.includes("spring-theme")){
// Currently in spring mode
sessionStorage.setItem("spring-theme", "true")
} else {
// Currently in other mode
sessionStorage.setItem("spring-theme", "false")
}
})
Представьте себе это со всеми четырьмя временами года.
Код работает, но когда я нажимаю на каждый значок соответственно, каждый из них добавляет себя в класс тела следующим образом: <body class="b-page spring-theme summer-theme autumn-theme winter-theme">
и отображает только режим последнего нажатия.
Я хочу иметь возможность переключаться между всеми четырьмя значками и не нажимать на/выключать каждый значок, чтобы добавлять/удалять их из тела класса. Я не хочу, чтобы они складывались в тело класса. Есть ли решение для этого? Спасибо!
Ответ №1:
Вместо того, чтобы иметь элемент хранения для каждой темы, пусть все они совместно используют один элемент хранения.
const theme = sessionStorage.getItem("theme");
if (theme === 'spring') {
// ...
} else if (theme === 'summer') {
// ...
}
// etc
И в прослушивателе щелчков что-то вроде:
if (document.body.className.includes("spring-theme")){
sessionStorage.setItem('theme', ''); // remove any existing themes
} else {
sessionStorage.setItem('theme', 'spring'); // add it
}
Таким образом, не будет никаких столкновений.
Комментарии:
1. Привет, я ценю ваш ответ! К сожалению, я попробовал ваш путь, но они все еще складываются/складываются вместе в классе тела 🙁 попробую несколько разных комбинаций и посмотрю, смогу ли я найти решение. В любом случае, спасибо тебе.
2. Когда тема изменится, установите для класса только новую тему — не пытайтесь сохранить старый класс. Например, сделайте
document.body.className = newTheme
, гдеnewTheme
то же значение, которое вы установилиsessionStorage
.