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

Javascript 在页面卸载时使cookie过期,然后在下一页面加载时设置cookie,javascript,php,cookies,browser,Javascript,Php,Cookies,Browser,我正在通过setcookie'anies,json_encodearray'tiger',time+3600*24',/'设置cookie动物;在PHP中,当请求页面时 然后,我将使用以下内容使第页上的cookie过期: 这会将cookie设置为过期。这很有效 问题是,当我刷新页面时,setcookie试图设置cookie,但浏览器将cookie设置为过期,因此浏览器在PHP返回时删除cookie,而不是使用新的数据/过期时间。所以cookie被删除了,我无法在页面加载后访问动物 这在FF和Ch

我正在通过setcookie'anies,json_encodearray'tiger',time+3600*24',/'设置cookie动物;在PHP中,当请求页面时

然后,我将使用以下内容使第页上的cookie过期:

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

问题是,当我刷新页面时,setcookie试图设置cookie,但浏览器将cookie设置为过期,因此浏览器在PHP返回时删除cookie,而不是使用新的数据/过期时间。所以cookie被删除了,我无法在页面加载后访问动物

这在FF和Chrome中都会发生。问题只出现在页面刷新上;如果我转到另一个站点,然后返回,或者第一次访问该页面,cookie设置正确

有没有办法让浏览器明白不要删除cookie,而是使用新参数?浏览器何时决定删除cookie,为什么不查看来自PHP的新参数

我称之为黑客的可能解决方案是在每个cookie中添加一个唯一的标识符,即时间戳,以便每个页面加载都有自己的cookie。我还可以从PHP中回显一个document.cookie来设置cookie,因此在页面加载后,JS会设置cookie。但是,我更希望看到一个指示浏览器不要删除cookie的解决方案


更新:我将为每个cookie添加一个唯一的标识符,因为我实际上无论如何都需要考虑打开的多个选项卡,并允许它们各自存在。因为我不明白浏览器为什么会这样做,所以我将保留这个问题。

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

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

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

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

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

所以,你的问题基本上是我告诉浏览器在页面关闭时销毁cookie,如果我再次打开页面,我如何告诉浏览器保留cookie?如何-只是不要在页面卸载时杀死cookie?@zebediah49 cookie是页面上组件选项的一部分。如果用户没有保存任何内容就离开了页面,我不希望这些选项在他们回来创建其他内容时仍然被加载,这样它就可以正常工作了。重新加载页面是关闭页面,然后再次打开页面的快捷方式。也许短期的cookie生命周期更有意义——比如说,它在半小时后过期,足够长的时间使意外关闭/重新打开可以保留他们的工作,但足够短的时间使第二天返回将重置它。这会使cookie立即过期,还是在浏览器会话结束时过期?另外,我如何通过PHP设置最大年龄?这是假设问题在于删除过去的cookie速度不够快,考虑到导航到其他地方解决问题的时间延迟,这似乎是有意义的。我只是尝试了一下,ifisset$_cookie['animals']{始终返回为false-我假设PHP读取到它已过期。您是否尝试过通过JS而不是PHP检查、设置和删除cookie?不确定这是否是一个选项将cookie设置为站点其他部分使用的组件的PHP代码,因此我不太容易携带cookie设置为t的值o取决于javascript。
waitToSetCookie(){
    if (checkCookie(animals))
            setTimeout(waitToSetCookie(), 1000);
        else
            setcookie('animals, json_encode(array('tiger')), time()+(3600*24), '/');
}