javascript - 防止使用 jquery 函数加载原始 DOM 状态
问题描述
对不起,如果我的标题措辞不佳。我有一个浅色主题和深色主题的切换。我可以使用 jquery 将选定的主题保存在 cookie 中,如下所示:
jQuery(document).ready(function ($) {
$(".theme__switch").on("click", () => {
$(".theme__switch").toggleClass("active");
$("body").toggleClass("dark__theme");
$.cookie("toggle", $(".theme__switch").hasClass("active"));
});
if ($.cookie("toggle") === "true") {
$(".theme__switch").addClass("active");
$("body").addClass("dark__theme");
}
});
所以当我用深色主题刷新页面时,它会等待文档完全加载,然后添加类,所以我会得到一个白色的闪烁(原始 bg)。
我尝试了几种解决方案,例如通过在以下位置放置一个小<script>
标签来阻止页面呈现<head>
:
<script>
// Render blocking JS:
if ($.cookie('toggle') === 'true') document.documentElement.setAttribute("class", dark__theme);
</script>
这个解决方案几乎可以工作,它可以防止白色闪烁,但是当我改回浅色主题时,dark__theme
文档周围有一个非常轻微的颜色边框,如果你滚动到页面的顶部或底部,它的dark__theme
颜色而不是白色,所以我认为这对用户来说会很奇怪。
这个解决方案还需要我在<head>
其中加载我不太满意的 jquery 和 jquery-cookie 库,但是如果有一种方法可以让这种方法起作用,我会接受它,因为它是一个相当小的项目。
我也尝试过创建一个叠加层:
<div id="overlay"></div>
#overlay {
position: fixed;
top: 0;
right: 0;
left: 0;
bottom: 0;
background: #fff;
}
然后将其添加到我的原件中jQuery(document).ready(function ($) {
jQuery('#overlay').hide();
但这个解决方案对我不起作用。
有没有人对这个问题有任何聪明的解决方案,或者应该重新开始并找到一种保存黑暗主题的新方法?
感谢您的关注!
解决方案
由于客户端和服务器端语言都可以访问 cookie,因此您可以执行以下操作。
您使用您的服务器端语言访问 cookie,并根据所选的 cookie 更改服务器端的主体类。
通过这样做,当 HTML 到达浏览器时,body 的类就已经被应用了。
推荐阅读
- python - 如何从 Angular 网站中提取文本信息?
- android - 文件上传不适用于 Cordova 项目中的 Android
- node.js - 在nodeJS中使用fs.createWriteStream添加json时如何避免最后一个逗号
- pdf - 使用 PDFBox 合并多个 PDF 后如何从 XSL-FO 管理书签
- vue.js - Vuetify 导航抽屉拖动以调整大小
- powershell - 用于捕获错误的自定义 Ping 调整
- angular - Angular 告诉其他组件发生了变化而不使用间隔
- python - 通过 Python 脚本删除 Jira 问题
- amazon - Mechanical Turk 结果顺序不正确
- asp.net - ASP.NET 中的会话修复漏洞