【问题标题】:Why does jQuery cookie not actually set a cookie?为什么 jQuery cookie 实际上没有设置 cookie?
【发布时间】:2012-02-21 19:01:20
【问题描述】:

我正在使用 jQuery 开发一个使用 cookie 的应用程序。现在,它位于我 PC 桌面上的application.html

但是,我无法存储和检索 cookie。我已经按顺序在我的 HTML 文件中包含了 jquery-1.7.1.min.jsjson2.jsjquery.cookie.js

这是我如何存储 cookie 以持续 7 天:

$.cookie("people", JSON.stringify(people_obj_array), {expires: 7});

全局数组people_obj_array 的样子

[
        {
            "name": "Adam",
            "age": 1,
        },
        {
            "name": "Bob",
            "age": 2,
        },
        {
            "name": "Cathy",
            "age": 3,
        },
    ]

当我使用alert(JSON.stringify(people_obj_array)) 测试 JSON 加密时,它看起来不错:

但是,当我通过以下方式检索此 cookie 时:

alert($.cookie("people"));

甚至在刷新页面之前,就会弹出一条警告,内容为“null”。文本不应该是警报 JSON 字符串吗?我是否正确使用了 JQuery cookie 库?


澄清一下,这是我的测试方式:

$.cookie("people", JSON.stringify(people_obj_array), {expires: 7}); // store
alert($.cookie("people")); // attempt to retrieve

我有 Firebug,我愿意做一些控制台测试。

【问题讨论】:

  • 我认为问题是没有为本地磁盘上的文件定义cookie机制。您是否尝试过设置本地 Web 服务器并将文件作为 http://localhost/application.html 提供?
  • 谢谢!我最终只使用本地存储。它更简单,可以在本地和 Web 服务器上工作。当然,缺点是旧的浏览器不支持它,这对我来说很好。 coding.smashingmagazine.com/2010/10/11/…

标签: javascript jquery json jquery-cookie


【解决方案1】:

可能是文件在您的桌面上导致了问题。浏览器通常会根据接收到的域及其路径来提供 cookie。

您可能无法在设置 cookie 后立即读取它:写入 cookie 涉及在 HTTP 请求中设置标头,同样,读取它们涉及读取 HTTP 响应中的标头。

尝试在网络服务器上托管您的页面,看看是否适合您。

【讨论】:

  • 谢谢,我将网站托管在公共网络服务器上,并且 cookie 有效。此页面有更多详细信息:code.google.com/p/chromium/issues/detail?id=535
  • @DavidFaux 看起来您正在使用 Chromium,所以我可以假设您也在使用 linux...如果您想设置本地网络服务器进行测试,您可以 sudo apt-get install lamp-server^ 然后 sudo adduser <username> www-data ,然后是以下两个命令。 sudo chown -R www-data:www-data /var/wwwsudo chmod -R g+rw /var/www 应该差不多了!然后你所有的网络开发都进入/var/www,然后你通过导航到localhost进行测试
【解决方案2】:

根据我的研究,jquery.cookie.js 已经相当老了,并且 似乎 不再需要维护了。改用this library 可能会更好。它在 Google 代码上的描述是“带有 jQ​​uery 绑定和 JSON 支持的 Javascript Cookie 库”,并且包含了您想要做的所有事情的方法!

【讨论】:

  • jquery.cookie 的最后一次更新是 7 天前,2013-09-11。我们正在使用那个非常有用的组件。
  • 可能是他们又开始开发了。当我发表此评论时,库已超过 2 年没有更新。
  • 截至今天,2015 年 10 月 28 日,该项目已完全更新,并具有不同的名称和实现:github.com/js-cookie/js-cookie ... 旧的 jquery.cookie 脚本根本不适合我,所以我查看了它并切换到这个新项目,它运行良好。
【解决方案3】:

如果您在使用 cookie 插件时遇到问题,为什么不自己制作 cookie 函数呢?读取、写入和(可选)删除。

var createCookie = function(name, value, days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        var expires = '; expires=' + date.toGMTString();
    }
    else var expires = '';
        document.cookie = name + '=' + value + expires + '; path=/';
};
var readCookie = function(name) {
    var nameEQ = name + '=';
    var ca = document.cookie.split(';');
    for (var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') c = c.substring(1, c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
    }
    return null;
};
var eraseCookie = function(name) {
    createCookie(name, '', -1);
};

我无法评论特定插件,因为我从未使用过它。但是这些功能都可以工作并且已经过测试。

所以对于你的例子:

createCookie("people", JSON.stringify(people_obj_array), 7); // store
alert(readCookie("people")); // retrieve
eraseCookie("people"); // remove
alert(readCookie("people")); // oo look i'm no longer here.

【讨论】:

  • 确定这适用于本地磁盘上的网页? AFAIK 某些浏览器根本不处理本地 cookie。
  • 我还没有测试过这种情况.. 但是,如果 cookie 在本地不可用,假设 OP 使用现代浏览器 本地存储 应该可以解决..
  • 谢谢!本地存储运行良好。也很简单。 coding.smashingmagazine.com/2010/10/11/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 2011-10-21
  • 1970-01-01
  • 2014-01-03
相关资源
最近更新 更多