首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JavaScript cookie误解?

JavaScript cookie误解?
EN

Stack Overflow用户
提问于 2018-09-28 00:27:00
回答 2查看 0关注 0票数 0

我正在使用以下代码来设置/删除cookie:

代码语言:javascript
复制
function get_cookie(cookie_name)
{
    var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]*)(;|$)');

    if (results)
        return ( decodeURI(results[2]) );
    else
        return null;
}


function set_cookie(name, value, exp_y, exp_m, exp_d, path, domain, secure)
{
    var cookie_string = name + "=" + encodeURI(value);

    if (exp_y)
    {
        var expires = new Date(exp_y, exp_m, exp_d);
        cookie_string += "; expires=" + expires.toGMTString();
    }

    if (path)
        cookie_string += "; path=" + encodeURI(path);

    if (domain)
        cookie_string += "; domain=" + encodeURI(domain);

    if (secure)
        cookie_string += "; secure";

    document.cookie = cookie_string;
}


function delete_cookie(cookie_name)
{
    var cookie_date = new Date();  // current date & time
    cookie_date.setTime(cookie_date.getTime() - 1);
    document.cookie = cookie_name += "=; expires=" + cookie_date.toGMTString();
}

但我得到的结果不一致。例如,在首页(www.example.com/start)上设置的Cookie不会始终显示在后续页面(www.example.com/foo/thing.jsp)上。我正在使用页面设置cookie“onUnload”

代码语言:javascript
复制
set_cookie("beginrequest", (new Date()).getTime(), null, null, null, "/");

并通过检索+删除它“onLoad”

代码语言:javascript
复制
loadDur = (new Date()).getTime() - get_cookie("beginrequest");
delete_cookie("beginrequest");

测量页面加载的总时间。

当使用firebug时,我经常会看到“剩余的”beginrequest-cookies和带有过去时间戳的beginrequest的多个实例。

我怎样才能在每个页面上看到一个beginrequest-cookie?

EN

回答 2

Stack Overflow用户

发布于 2018-09-28 09:06:19

如果您正在获取旧cookie,可能是因为您的页面包含大量内容,并且在onunload之前未调用onload(因为页面未完成加载)。因此,通过从onload和onunload调用类似的东西来删除cookie:

代码语言:javascript
复制
var deleted_cookie = false;
function delete_timestamp() {
    if(!deleted_cookie) delete_cookie("beginrequest");
    deleted_cookie = true;
}

如果您正在快速加载下一页以使'delete_cookie'cookie未正确过期,并且您的get_cookie实现正在捡起它,那么您可能也会遇到竞争条件。因此,尝试更改get_cookie中的正则表达式,只选择带有值的cookie:

代码语言:javascript
复制
var results = document.cookie.match('(^|;) ?' + cookie_name + '=([^;]+)(;|$)');

此外,如果您在多个窗口(或标签)中查看该网站,他们的cookie可能会混淆,所以不要这样做。但是尝试使用全局正则表达式来获取所有值,并且仅使用最新值。

票数 0
EN

Stack Overflow用户

发布于 2018-09-28 09:53:22

我同意amix的两个方面:乍一看你的代码看起来还不错,这可能会更好地处理服务器端的东西。

无论如何,我猜你现在遇到的问题很可能是事件没有以你认为的方式发射。有两种方法可以清除正在发生的事情,方法是在视觉上明显表明事件正在发生,并通过增加输出的详细程度。任何数量的东西可能会干扰实际触发的事件:插件,插件,按键等等,如果你打开一个新的窗口(或警报,或其他什么)当onload和onunload事件触发时,你将能够分辨确定正在调用函数。同样,如果您在cookie中存储更多数据,如原始URL等,您将能够更好地确定哪些页面正在生成额外的cookie。

我猜你的一个Firefox扩展会间歇性地干扰onunload事件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100000805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档