You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

页面昼夜模式切换器优化:解决切换需刷新及代码冗余问题

解决深色/浅色模式切换的两个问题:无需刷新保持状态 + 精简代码

嘿,我来帮你搞定这两个问题!咱们先拆解下当前代码的问题,再给出优化后的方案:

问题1:返回页面后模式需刷新才生效

这是因为页面从浏览器缓存加载时(比如后退返回),初始的localStorage读取代码不会重新执行。咱们可以通过监听pageshow事件,确保每次页面显示时都同步状态。

问题2:代码冗长重复

你现在的点击事件写了两次(一次存localStorage,一次改UI),完全可以把模式切换的逻辑抽成一个复用函数,避免重复代码。

优化后的完整代码

HTML(保持不变)

<div class="switcher">
  <p class="day active">Day</p>
  <p class="night">Night</p>
</div>

jQuery(精简+修复状态同步)

// 封装模式切换的核心函数
function setMode(mode) {
  // 更新localStorage
  localStorage.setItem('screenModeNightTokenState', mode);
  // 更新body的类
  $('body').removeClass('day night').addClass(mode);
  // 更新切换器的active状态
  $('.switcher p').removeClass('active');
  $(`.switcher .${mode}`).addClass('active');
}

// 页面加载/显示时同步状态
function syncMode() {
  const savedMode = localStorage.getItem('screenModeNightTokenState') || 'day'; // 默认day模式
  setMode(savedMode);
}

// DOM加载完成后初始化
$(function() {
  // 绑定点击事件
  $('.switcher p').click(function() {
    const mode = $(this).hasClass('day') ? 'day' : 'night';
    setMode(mode);
  });

  // 初始同步状态
  syncMode();

  // 监听页面显示事件,解决后退缓存不生效的问题
  $(window).on('pageshow', function() {
    syncMode();
  });
});

优化点说明

  • 复用核心逻辑:把设置模式的操作都放到setMode函数里,不管是初始化还是点击切换,都调用这个函数,避免重复代码。
  • 自动同步状态:syncMode函数负责从localStorage读取状态并应用,页面初始化和每次显示时(包括后退返回)都会执行,确保状态始终一致。
  • 简化点击事件:给切换器的两个p标签统一绑定点击事件,通过判断当前元素的类来确定要切换到的模式,不用写两个单独的点击事件。
  • 默认值处理:如果localStorage里没有保存的状态,默认使用day模式,避免首次加载时没有类的情况。

这样修改后,不管是切换模式,还是离开页面再返回,状态都会自动生效,不需要刷新页面,同时代码也精简了很多~

内容的提问来源于stack exchange,提问作者alexkodr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:45:35