这是我用来获取特定Cookie的脚本lastvisit
:
编辑后
// This document writes a cookie
// called from index.php
window.onload = makeLastVisitCookie;
function makeLastVisitCookie() {
var now = new Date();
var last = new Date();
now.setFullYear(2020);
// set the cookie
document.cookie = "lastvisit=" + last.toDateString() + ";path=/;expires=" + now.toGMTString();
var allCookies = document.cookie.split(";");
for( var i=0 ; i < allCookies.length ; i++ ) {
if(allCookies[i].split("=")[0]== "lastvisit") {
document.getElementById("last_visit").innerHTML = "You visited this site on" + allCookies[i].split("=")[1];
} else {
alert("testing..testing..");
}
}
}
虽然从我的网站上存储了5个cookie,但if
部分从此脚本无效。 (包括我从此脚本保存的cookie)在获取名为lastvisit
的cookie时我犯的错误是什么?
答案 0 :(得分:1)
您正在通过;
分割Cookie,并将这些令牌与lastvisit
进行比较。您需要先将=
这样的令牌拆分。 allCookies[i]
看起来像key=val
,永远不会等于lastvisit
。如果allCookies[i] == "lastvisit"
为真,则结果仍然不符合预期,因为您显示的allCookies[i + 1]
值为this=the_cookie_after_lastvisit
。
if(allCookies[i].split("=") == "lastvisit") {
应该是:
var pair = allCookies[i].split("=", 2);
if (pair[0].replace(/^ +/, "") == "lastvisit") {
"You visited this site on" + allCookies[i+1];
应该是:
"You visited this site on" + pair[1];
2
的{{1}}参数可以正确读取split
之类的Cookie。在按sum=1+1=2
拆分Cookie时,密钥可能包含一个前导空格,在比较之前会将其删除。 (;
是一个正则表达式,/^ +/
匹配字符串的开头,^
一个或多个空格。)
或者,将它直接与RE进行比较以匹配可选空格(+
匹配零个或多个空格字符的出现,*
匹配字符串的结尾):
$
我已经测试过几种获取cookie的方法,包括使用正则表达式,以下是最正确的表现方式:
if (/^ *lastvisit$/.test(pair[0])) {
答案 1 :(得分:0)
在与字符串"lastvisit"
进行比较之前,您需要删除Cookie密钥周围可能的空白区域。这可以使用正则表达式方便地完成。 /^\s+/
匹配开头的所有空格,/\s+$/
匹配末尾的所有空格。匹配项由空字符串替换,即删除:
for( var i = 0 ; i < allCookies.length ; i++ ) {
var c = allCookies[i].split("="); // split only once
var key = c[0].replace(/^\s+/, '').replace (/\s+$/, ''); // remove blanks around key
if (key == "lastvisit") {
document.getElementById("last_visit").innerHTML = "You visited on " + c[1];
}
//...
}