#javascript #json #session-storage
#javascript #json #хранилище сеанса
Вопрос:
У меня есть кнопка, которая изменяет цвет фона, и я хочу сохранить цвет в локальном хранилище, чтобы он оставался неизменным при обновлении страницы. Используя console.log(field.value), я вижу, что моя функция добавляет новый цвет в локальное хранилище, однако при обновлении страницы хранилище сеансов кажется пустым, а цвет фона не такой, как до его обновления.
class DrumKit {
constructor() {
this.backgroundColor = document.querySelector('body');
}
saveSessionColor() {
let field = this.backgroundColor;
sessionStorage.setItem('currentColor', JSON.stringify(this.backgroundColor.style.background));
let x = JSON.parse(sessionStorage.getItem('currentColor'));
field.value = x;
}
}
drumKit.themeBtn.addEventListener('click', () => {
drumKit.saveSessionColor();
});
Комментарии:
1. Можете ли вы также опубликовать свою HTML-часть?
2. Это выглядит синтаксически недопустимым.
saveSessionColor
похоже, это не метод класса.3. О, извините, то, как я ввел это здесь, выглядит так, но в моем js-файле это находится внутри класса. Я довольно новичок в js, поэтому я предполагаю, что я делаю довольно очевидную ошибку, которую я просто не могу обнаружить.
4. Пара вещей. У вас есть переменная с именем «backgroundColor», которая является ссылкой на элемент. Вы должны назвать это «bodyEl» или что-то в этом роде. Однако вам это вообще не нужно, потому что элемент body уже имеет специальную постоянную ссылку, вызываемую
document.body
, всегда. Затем вы создаетеfield
переменную, но не используете ее в следующей строке. Вы используете его позже, ноfield
это просто еще одна ссылка наdocument.body
. У него нетvalue
. Вы можете добавитьvalue
, но это ничего не даст. При загрузке страницы необходимо задать стиль фона элемента body.
Ответ №1:
Я создал скрипку, потому что это не сработало в редакторе фрагментов
Это позволяет получить цвет сеанса при сохранении, что позволяет избежать проблем с контекстом
https://jsfiddle.net/9zwef8ht/2/
CSS
body {
background-color: #ddd; /* default value */
}
HTML
<button id="go">Go</button>
<button id="check">Check</button>
JavaScript
"use strict";
class DrumKit {
constructor(id) {
// set up the button ... ?
this.themeBtn = document.getElementById(id);
// if the button exists, add a click handler
if (this.themeBtn !== null) {
this.themeBtn.addEventListener('click', this.saveSessionColor);
}
// clear the current color
sessionStorage.removeItem('currentColor');
}
saveSessionColor() {
// get the style
// thanks to: https://developer.mozilla.org/en-US/docs/Web/API/ElementCSSInlineStyle/style
let style = window.getComputedStyle(document.body, null);
let backgroundColor = style.backgroundColor;
sessionStorage.setItem('currentColor', backgroundColor);
}
setSessionColor() {
let color = sessionStorage.getItem('currentColor');
// if currentColor is set
if (color !== null) {
document.body.style.backgroundColor = color;
} else {
// otherwise ...
document.body.style.backgroundColor = "pink";
}
}
}
let drumKit = new DrumKit("go");
// use a button to check the code, remove before launch
document.getElementById("check").addEventListener('click', drumKit.setSessionColor);
Комментарии:
1. Большое спасибо за это, я попытался реализовать это в своем проекте, и в журнале консоли я вижу, что цвет сохраняется в хранилище сеансов, но когда страница обновляется, цвет фона возвращается к значению по умолчанию, а не к тому, которое было до того, как я его обновил. Как я могу это изменить?
2. Возможно, вы захотите использовать localStorage вместо sessionStorage — developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API /… — sessionStorage длится в течение сеанса, localStorage длится до тех пор, пока вы его не очистите