vertically-challenged
@vertically-challenged

Почему этот код не работает?

Я сделал состояние темы, зависимое от состояния чекбокса с помощью CSS, тема переключается, но встала потребность сохранить состояние темы при перезагрузки страницы, и я написал скрип ниже, но почему-то после первого переключения после перезагрузке страницы тема устанавливается всегда светлой, кажется, что значение, записанное в localStorage, никак на это не влияет, будь там хоть true, хоть false.
В общем, программа ведет себя крайне странно, при загрузке всегда устанавливается светлая темя, и я не могу понять почему

(function () {
  const themeCheckBox = document.querySelector('#theme-toggle')
  const themeLabel = document.querySelector('.theme-toggle')

  themeLabel.addEventListener('click', () => {
    localStorage.setItem('themeCheckBox', themeCheckBox.checked)
  })

  themeCheckBox.checked = localStorage.getItem('themeCheckBox')
})()
  • Вопрос задан
  • 143 просмотра
Решения вопроса 3
MrDecoy
@MrDecoy Куратор тега JavaScript
Верставший фронтендер
Локал стораж хранит строки. Поэтому при установке в него false, будет храниться 'false'.
checked ожидает - boolean.
строка 'false' - конвертируется в true, потому что любая не пустая строка конвертируется в true. Это основа языка.

соответтсвенно:
-themeCheckBox.checked = localStorage.getItem('themeCheckBox')
+themeCheckBox.checked = localStorage.getItem('themeCheckBox') === 'true'
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
localStorage хранит только текстовые значения. Соответственно, когда вы пишете в него булево значение true/false, то после считывания получаете строку "true"/"false". Ну а непустая строка всегда эквивалентна true.
Ответ написан
Комментировать
delphinpro
@delphinpro Куратор тега JavaScript
frontend developer
(function () {
   const themeCheckBox = document.querySelector('#theme-toggle')
   const themeLabel = document.querySelector('.theme-toggle')

   themeLabel.addEventListener('click', () => {
-    localStorage.setItem('themeCheckBox', themeCheckBox.checked)
+    localStorage.setItem('themeCheckBox', themeCheckBox.checked ? '1' : '')
   })

-  themeCheckBox.checked = localStorage.getItem('themeCheckBox')
+  themeCheckBox.checked = !!localStorage.getItem('themeCheckBox')
})()


Вариант попроще
themeCheckBox.checked = localStorage.getItem('themeCheckBox')==='true'
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы