javascript - 切换状态 Cookie 设置成功,但是没有 cookie 存在时的行为呢?
问题描述
我已成功编码以下行为:
- 三个 div 用 .toggle() 隐藏/显示;
- 当用户使用 .toggle(); 它还设置了一个 cookie 来记住切换状态
这是上面代码的 jQuery,它可以工作,带有注释:
<script>
$(document).ready(function () {
// If user clicks the toggle it hides/shows the divs
$(" .togglediv ").click(function () {
var closed = $(" .siemaholder, .c_l_off, .c_r_off ").is(":hidden");
if (closed)
$(" .siemaholder, .c_l_off, .c_r_off ").show();
else
$(" .siemaholder, .c_l_off, .c_r_off ").hide();
// If user uses the toggle it sets a cookie to remember the toggle state
setCookie("open", closed, 365);
});
var openToggle = getCookie("open");
if (openToggle=="true") {
$(" .siemaholder, .c_l_off, .c_r_off ").show();
}
else {
$(" .siemaholder, .c_l_off, .c_r_off ").hide();
}
});
function setCookie(c_name, value, exdays) {
var exdate = new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value = escape(value) + ((exdays == null) ? "" : "; expires=" + exdate.toUTCString());
document.cookie = c_name + "=" + c_value;
}
function getCookie(c_name) {
var i, x, y, ARRcookies = document.cookie.split(";");
for (i = 0; i < ARRcookies.length; i++) {
x = ARRcookies[i].substr(0, ARRcookies[i].indexOf("="));
y = ARRcookies[i].substr(ARRcookies[i].indexOf("=") + 1);
x = x.replace(/^\s+|\s+$/g, "");
if (x == c_name) {
return unescape(y);
}
}
}
</script>
我遇到的问题是,当不存在 cookie 时(当用户第一次访问该页面并且尚未生成任何 cookie 时),默认情况下隐藏div 。我不希望这样 - 我希望它们默认显示。
我的意图是默认显示它们,直到使用 .toggle(); 设置 cookie;我之前提到的。这样当用户第一次访问页面时,内容正在显示,然后可以由用户手动“隐藏”(从那里开始记住)。
谁能帮帮我?
到目前为止,我已经尝试$(" .siemaholder, .c_l_off, .c_r_off ").show();
在脚本的开头使用,因此默认情况下会显示 div,直到涉及到 cookie。这没有用。
解决方案
1)
有用于授权用户的服务器端 cookie。这些 cookie永远不应在客户端脚本中设置,因为它们会导致安全问题(在我的原始答案中有所描述)。
2)
如果客户端 cookie不用于授权用户,则它们可以用于默认用户设置(如您的情况)。
你应该做的是让jquery设置一个cookie,$(document).ready(
如下所示:
$(document).ready(function () {
if (!$.cookie('open') || !$.cookie('closed')) {
$.cookie('open', 1, {expires: 10});
}
$(" .togglediv ").click(function () {
var closed = $(" .siemaholder, .c_l_off, .c_r_off ").is(":hidden");
if (closed)
$(" .siemaholder, .c_l_off, .c_r_off ").show();
$.removeCookie('closed');
$.cookie('open', 1, {expires: 10});
else
$(" .siemaholder, .c_l_off, .c_r_off ").hide();
$.removeCookie('open');
$.cookie('closed', 1, {expires: 10});
推荐阅读
- regex - 正则表达式,如何首先匹配更长的字符串?
- google-chrome - 最近我只在 Google Chrome 中遇到了 CORS 问题
- r - 如何将函数的结果应用于 data.frame (R) 的因子?
- docker - cURL 错误 7:无法连接到 test.localhost 端口 80
- java - 导入 com.google 无法在 Eclipse 中解析
- node.js - collection.findOne 匹配整个集合中的查询,而我需要它在对象数组中查找
- asp.net - 如何在大型项目中管理 ASP.NET Core 授权?
- angular - 如果某些条件为真,Angular Material Stepper 会阻止 Step forward
- c# - 如何获取 IEnumerable 的属性