3 回答

TA貢獻1810條經(jīng)驗 獲得超5個贊
您不能將 DOM 元素保存到 LocalStorage。LocalStorage 僅存儲字符串(這很重要!您甚至不能存儲數(shù)字或日期)。通常,如果需要保存復(fù)雜數(shù)據(jù),人們會存儲 JSON,但這里存儲主題名稱(恰好是一個字符串)就足夠了。
總的來說,我會推薦一種不同的方法。我會制作一個函數(shù)changeTheme(),它采用主題名稱并對所有主題都相同,并使用一個對象來存儲可用的主題和 CSS 路徑。
const themes = {
"theme-dark": "../assets/css/syntax-highlighting/dark.css",
"theme-light": "../assets/css/syntax-highlighting/light.css",
"theme-cyberpunk": "../assets/css/syntax-highlighting/cyberpunk.css",
"theme-tron": "../assets/css/syntax-highlighting/tron.css",
"theme-synthwave-84": "../assets/css/syntax-highlighting/synthwave-84.css"
};
function changeTheme(newTheme) {
var allThemes = Object.keys(themes);
if (!allThemes.includes(newTheme)) return;
allThemes.forEach(theme => document.body.classList.remove(theme));
document.body.classList.add(newTheme);
document.getElementById('theme_css').href = themes[newTheme];
localStorage.setItem('theme', newTheme);
}
// wire up buttons
document.querySelectorAll('.theme-switch').forEach(button => {
button.onclick = () => changeTheme(button.id);
});
// load saved theme
changeTheme(localStorage.getItem('theme'));
與這樣的按鈕一起,您將擁有一個沒有代碼重復(fù)的工作主題切換器。
<button class="theme-switch" id="theme-synthwave-84">Synthwave 84</button>
<button class="theme-switch" id="theme-tron">Tron</button>
當(dāng)然你可以使用鏈接代替按鈕,或者changeTheme()你能想到的任何其他觸發(fā)方式。

TA貢獻1801條經(jīng)驗 獲得超16個贊
您只能將字符串作為值存儲在本地存儲中。您要存儲的任何對象都必須首先使用JSON.stringify
. 但是,您也不能序列化 DOM 元素?;蛘吣憧梢裕悄阒粫玫揭粋€空對象,因為 DOM 元素的所有屬性都存儲在 DOM 元素的原型上,并且JSON.stringify
只作用于對象自己的屬性,所以你必須做類似的事情:
localStorage.setItem('theme-css', element.href);
添加回答
舉報