我一直在尝试创建一个简单的cookie box通知,实际上我想使用这个特定的idea
问题是,当我在页脚中运行这个js时,我只需单击“是”或“否”,然后刷新页面后,我会再次看到cookie框的开头。我只想在那里设置一个非常简单的到期日期,例如10天,等等,当我单击“依赖于答案”时,功能正常。
我真的不擅长js,所以如果有人能帮助我,我将不胜感激。:)
!(function() {
var e = function(e, t, o) {
(this.text = e),
(this.acceptText = t),
(this.denyText = o),
(this.element = null),
this.init();
};
(e.prototype = {
init: function() {
this.create(), this.load(), this.actions();
},
load: function() {
null === localStorage.getItem("cookie-box-accepted") && this._show();
},
actions: function() {
var e = document.querySelector("#cookie-box-accept"),
t = document.querySelector("#cookie-box-deny"),
o = this;
e.addEventListener(
"click",
function(e) {
e.preventDefault(),
localStorage.setItem("cookie-box-accept", "yes"),
o._hide();
},
!1
),
t.addEventListener(
"click",
function(e) {
e.preventDefault(),
localStorage.setItem("cookie-box-deny", "no"),
o._hide();
},
!1
);
},
create: function() {
var e = document.createElement("div");
this.element = e;
var t =
"<div id=\'cookie-box-wrap\'><div id=\'cookie-box-text\'>" +
this.text +
"</div>";
(e.id = "cookie-box"),
(t +=
"<div id=\'cookie-box-btns\'><button type=\'button\' id=\'cookie-box-accept\'>" +
this.acceptText +
"</button>"),
(t +=
"<button onclick=deleteAllCookies() type=\'button\' id=\'cookie-box-deny\'>" +
this.denyText +
"</button></div>"),
(t += "</div>"),
(e.innerHTML = t),
document.body.appendChild(e);
},
_show: function() {
var e = this;
(e.element.style.display = "block"),
setTimeout(function() {
e.element.className = "visible";
}, 500);
},
_hide: function() {
var e = this;
(e.element.className = ""),
setTimeout(function() {
e.element.style.display = "none";
}, 500);
}
}),
document.addEventListener("DOMContentLoaded", function() {
new e(
"This website uses «cookies» to give you the best experience when you visit. You can manage or block them <a href=\'https://www.aboutcookies.org/how-to-control-cookies/\' target=\'_blank\'>in your browser settings</a>. <span id=\'open\'><svg height=\'100\' width=\'35\'><text x=\'0\' y=\'0\' fill=\'#c9770c\' transform=\'rotate(90 1,10)\'>Cookies</text>Your browser does not support inline SVG.</svg></span> Do you accept cookies?",
"Yes",
"No"
);
});
})();
var sheet = (function() {
var e = document.createElement("style");
return (
e.appendChild(
document.createTextNode(
"#cookie-box{position:fixed;bottom:1px;left:1px;width:99%;max-width:290px;min-height:3em;background:#f1f1f1;border:dotted 1px #555;color:#555;z-index:10000000000;display:none;transition:all .5s ease-in;transform:scaleY(0)}#cookie-box.visible{transform:scaleY(1)}#cookie-box{margin-left:-293px}#cookie-box:hover{margin-left:1px}#cookie-box-wrap{margin:0 auto;max-width:285px;text-align:center}#cookie-box-text{padding:17px 3px 7px;font-family:Arial;font-size:13px;line-height:17px;margin-bottom:5px}#cookie-box-text a{color:#c9770c;text-decoration:underline;text-decoration-style:dotted}#cookie-box-btns{margin:15px auto}#cookie-box-btns button{border-radius:1px;border:none;padding:7px 33px;font-size:13px!important;line-height:17px;font-family:Arial;color:#fff;text-transform:uppercase;cursor:pointer;margin-right:7px;transition:all .5s ease-in}#cookie-box-btns button:hover{background-color:grey}button#cookie-box-accept{background:olivedrab}button#cookie-box-deny{background:#c9770c;}#open{ float:right;margin-top:-25px;margin-right:-40px;color:black;font-size:23px;cursor:all-scroll;background:#f1f1f1;border:dotted 1px #555;border-left:none}"
)
),
document.head.appendChild(e),
e.sheet
);
})();
function deleteAllCookies() {
(document.cookie = "=; expires=Fri, 31 Dec 2000 23:59:59 UTC; path=/"),
alert(
"I am cookie with an expiry date 31 Dec 2000 23:59:59. I don\'t live after: " +
document.cookie
);
}
EDIT ------------------------------------
我尝试过的代码思想
load: function() {
null === checkCookie("cookie-box-accept") && this._show();
},
actions: function() {
var e = document.querySelector("#cookie-box-accept"),
t = document.querySelector("#cookie-box-deny"),
o = this;
e.addEventListener(
"click",
function(e) {
e.preventDefault(),
setcookie("cookie-box-accept", \'visited\',time()+60*60*24*31, "yes"),
o._hide();
},
!1
),
t.addEventListener(
"click",
function(e) {
e.preventDefault(),
unsetcookie("cookie-box-deny", "no"),
o._hide();
},
!1
);
},
不幸的是,无法工作:(
最合适的回答,由SO网友:Dexter0015 整理而成
我明白了,这只是个打字错误。
但需要明确的是,此代码不使用cookie存储用户选择,而是localStorage, 这是不同的,但可以在这里使用。
因此,在测试了给定的代码后,看看这两种方法:
load: function() {
null === localStorage.getItem("cookie-box-accepted") && this._show();
},
actions: function() {
var e = document.querySelector("#cookie-box-accept"),
t = document.querySelector("#cookie-box-deny"),
o = this;
e.addEventListener(
"click",
function(e) {
e.preventDefault(),
localStorage.setItem("cookie-box-accept", "yes"),
o._hide();
},
!1
),
t.addEventListener(
"click",
function(e) {
e.preventDefault(),
localStorage.setItem("cookie-box-deny", "no"),
o._hide();
},
!1
);
},
load方法负责测试cookie选项是否存储在localStorage中,如果没有,则显示cookie块。方法在选项按钮上添加监听器,以创建要存储在localStorage中的选项的值。
该值创建为键>值,代码中的问题是加载方法要查找的值的名称与操作方法创建的名称不同:
load方法正在查找与名为“cookie box accept”的键对应的值,其中actions方法将其存储在名为“cookie box accept”的键上
因此,如果更改加载方法要查找的关键字名称与操作方法创建的关键字名称相同,它将按预期工作。
EDIT TO ANSWER YOUR OTHER QUESTIONS ------------------------------------
好的,去看看我给你的关于localStorage的链接,它解释得很好,很简洁。
现在回答您的问题:
1 - localStorage不是基于过期的概念构建的(与Cookie不同),因此它不会被自动删除,您必须在代码中实现一种方法来测试存储的数据的年龄,并在数据太旧时将其删除。请参见以下答案:https://stackoverflow.com/questions/2326943/when-do-items-in-html5-local-storage-expire
2 - 正如我在给您的链接(关于localStorage)中所解释的,有两种“类型”的Web存储:
HTML web存储为在客户端上存储数据提供了两个对象:
窗localStorage—存储没有过期日期窗口的数据。会话存储-存储一个会话的数据(关闭浏览器选项卡时数据丢失)
因此,您可以使用sessionStorage代替localStorage,但用户在退出/重新启动浏览器后,每次返回您的网站时都必须重新选择其首选项。
请注意,您可以通过浏览器的开发人员控制台手动从浏览器中删除localStorage数据:
单击Chrome/Firefox上的“F12”,它将显示开发人员工具栏(这里有很多有用的工具,顺便说一句),导航到左列的“应用程序”选项卡,您应该会看到“存储”部分,然后是“本地存储”在这里,您可以看到由域存储的本地存储数据(本地存储数据像cookie一样链接到域),并且可以删除一些。但由于它必须手动完成,我会将其保留到开发/调试会话中(更好的方法是在您的代码中实现它,正如前面提到的那样),因为普通用户当然永远不会这样做(而且无论如何也不能这样做)。
3 - 在我看来,localStorage是一个很好的机制,但在这种情况下,我更喜欢cookie,因为它更符合预期的行为,而且它是基于过期的概念构建的,您只需在创建时设置它,过期后浏览器会自动删除它(如果用户手动删除cookie,则会更快……)。