【问题标题】:My Javascript cookie expires at session, not in 30 days我的 Javascript cookie 在会话中过期,而不是在 30 天内
【发布时间】:2014-11-26 11:24:20
【问题描述】:
jQuery(document).ready(function(){
        if (document.cookie.indexOf('visited=true') === -1) {
            var expires = new Date();
            expires.setDate(expires.getDate()+30);
            document.cookie = "visited=true; path=/; expires="+expires.toUTCString();
            jQuery.colorbox({open:true,href:"<?=home_url()?>/popup/?site_type=2",iframe:true, innerWidth:"700px", innerHeight:"410px"});
        }                   
});

当我关闭浏览器时,此 cookie 过期,但我希望它持续 30 天,直到他们再次看到弹出窗口。

【问题讨论】:

  • 你知道你只需要写一次长格式的jQuery吗?通过将代码包装在(function($) { .... })(jQuery); 中,无论noConflict 是否已使用,您都可以使用$。由于您使用的是 DOM 就绪事件:jQuery 对象也被传递给此事件的函数,即您可以使用 jQuery(document).ready(function($){
  • 这可能是由您的浏览器 cookie 设置强制执行的?代码对我来说似乎没问题。

标签: javascript jquery cookies


【解决方案1】:

不要使用expires,而是尝试max-age(以秒为单位)。这不涉及Date 实例的创建和修改。

if (document.cookie.indexOf('visited=true') === -1) {
    document.cookie = "visited=true; path=/; max-age=2592000;";

【讨论】:

  • 原来是我的浏览器,但这是一个很好的答案,代码更简单,谢谢:)
【解决方案2】:

使用 Cookie 对象:

var CookieExpiryTime = {
    END_OF_SESSION : 0,
    SECOND : 1000,
    MINUTE : 1000 * 60,
    HOUR : 1000 * 60 * 60,
    DAY : 1000 * 60 * 60 * 24,
    YEAR : 1000 * 60 * 60 * 24 * 365,
    NEVER : 1000 * 60 * 60 * 24 * 365 * 20
}
var Cookie = {
    Set: function (n, v, time, path) {
        var e = '', d;
        if (time) {
            d = new Date();
            d.setTime(d.getTime() + (time));
            e = "; expires=" + d.toGMTString();
        }
        if (!path) path = "/";
        document.cookie = n + "=" + v + e + "; path="+path;
    },
    Get: function (n) {
        var match = n + "=", c = '', ca = document.cookie.split(';'), i;
        for (i = 0; i < ca.length; i++) {
            c=String(ca[i]).trim()
            if (c.indexOf(match) === 0) {
                return c.substring(match.length, c.length);
            }
        }
        return null;
    },
    Unset: function (n) {
        this.Set(n, "", -1);
    }
};

只需使用以下代码设置您的 cookie:

Cookie.Set("visited", "true", CookieExpiryTime.MONTH);

就这么简单!

此外,要在日期上增加 30 天,您必须这样做:

expires.setDate(expires.getDate()+30*24*60*60*1000);

因为时间是毫秒而不是天。

【讨论】:

  • 当通过.setDate() 修改日期时,您处理的是天数,而不是毫秒数。
【解决方案3】:

一种可能的替代方法是使用 html5 localStorage。它在 IE8+ 中受支持,并且与会话没有任何关系,因此您不会在那里遇到任何问题。如果您采用 localStorage 方法,您可能希望采用以下方式构建代码。

var 30_DAYS = 1000 * 60 * 60 * 24 * 30;
var msgSent = localStorage.msgSent;
var now = new Date().getTime();
var diff = now - msgSent;
if (!msgSent || msgSent > 30_DAYS) {
  sendMsg();
}

function sendMsg() {
 // do your popup thing
 localStorage.msgSent = new Date.getTime();
}

【讨论】:

  • 我认为这可能更符合他的目的,但可能有点离题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-16
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-30
相关资源
最近更新 更多