在页面卸载时使cookie过期,然后在下一页加载时设置cookie

时间:2014-08-07 17:14:15

标签: javascript php cookies browser

在请求页面时,我在PHP中通过animals设置了Cookie setcookie('animals, json_encode(array('tiger')), time()+(3600*24), '/');

然后我在第unload页上的Cookie到期时使用:

window.addEventListener('unload', function() {
    document.cookie = 'animals=; expires=Thu, 01 Jan 1970 00:00:01 GMT; path=/';
});

这会将Cookie设置为已过期。这很有效。

问题,当我刷新页面时,setcookie()尝试设置cookie,但浏览器将cookie设置为过期,因此浏览器在PHP时删除cookie回来而不是使用新的数据/到期时间。因此cookie被删除,我在页面加载后无法访问animals

在FF和Chrome中都会发生这种情况。问题仅在于页面刷新;如果我去另一个站点然后回来,或者第一次来到页面,那么cookie就会被正确设置。

有什么方法可以让浏览器了解不删除cookie,而是使用新参数?浏览器何时决定删除cookie,为什么不查看来自PHP的新参数?

可能的解决方案(我称之为“hacks”)是为每个cookie添加一个唯一的标识符(即时间戳),因此动物-1407435704,以便每个页面加载都有自己的cookie。我也可以从PHP中回显document.cookie来设置cookie,所以在页面加载之后,JS会设置cookie。但是,我宁愿看到一个解决方案,指示浏览器不要删除cookie。

更新:我要为每个Cookie添加一个唯一标识符,因为我实际上还需要考虑打开多个标签(并允许它们各自存在)。我要打开这个问题,因为我不明白为什么浏览器会这样做。

2 个答案:

答案 0 :(得分:0)

我认为此解决方案应该重置cookie:

document.cookie = 'animals=; Max-Age=0'

答案 1 :(得分:0)

您可以做的是检查并查看cookie是否存在,然后做出相应的反应。

如果cookie仍然存在新的负载,请继续检查延迟直到删除,然后再次添加:

waitToSetCookie(){
    if (checkCookie(animals))
            setTimeout(waitToSetCookie(), 1000);
        else
            setcookie('animals, json_encode(array('tiger')), time()+(3600*24), '/');
}