首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以在JavaScript中模拟document.cookie吗?

可以在JavaScript中模拟document.cookie吗?
EN

Stack Overflow用户
提问于 2011-06-23 23:16:45
回答 6查看 29K关注 0票数 27

document.cookie类似于字符串,但它不是字符串。引用Mozilla doc中的示例

代码语言:javascript
复制
document.cookie = "name=oeschger";
document.cookie = "favorite_food=tripe";
alert(document.cookie);
// displays: name=oeschger;favorite_food=tripe

如果您尝试仅使用一个字符串创建模拟cookie,则不会得到相同的结果:

代码语言:javascript
复制
var mockCookie = "";
mockCookie = "name=oeschger";
mockCookie = "favorite_food=tripe";
alert(mockCookie);
// displays: favorite_food=tripe

因此,如果您想对在cookie上操作的模块进行单元测试,并且想要使用模拟cookie进行这些测试,可以吗?How?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-06-23 23:20:50

您可以使用cookie的setter和getter创建一个对象。下面是一个非常简单的实现:

代码语言:javascript
复制
var mock = {
    value_: '', 

    get cookie() {
        return this.value_;
    },

    set cookie(value) {
        this.value_ += value + ';';
    }
};

可能并不是所有的浏览器都能工作(尤其是IE)。更新:它只能在支持ECMAScript 5的浏览器中工作!

代码语言:javascript
复制
mock.cookie = "name=oeschger";
mock.cookie = "favorite_food=tripe";
alert(mock.cookie);
// displays: name=oeschger;favorite_food=tripe;
票数 22
EN

Stack Overflow用户

发布于 2013-04-24 22:27:28

此实现允许覆盖cookies,并添加document.clearCookies()

代码语言:javascript
复制
(function (document) {
    var cookies = {};
    document.__defineGetter__('cookie', function () {
        var output = [];
        for (var cookieName in cookies) {
            output.push(cookieName + "=" + cookies[cookieName]);
        }
        return output.join(";");
    });
    document.__defineSetter__('cookie', function (s) {
        var indexOfSeparator = s.indexOf("=");
        var key = s.substr(0, indexOfSeparator);
        var value = s.substring(indexOfSeparator + 1);
        cookies[key] = value;
        return key + "=" + value;
    });
    document.clearCookies = function () {
        cookies = {};
    };
})(document);
票数 9
EN

Stack Overflow用户

发布于 2011-06-23 23:54:23

@Felix Kling的答案是正确的,我只是想指出在ECMAScript 5中定义setter和getter有另一种语法:

代码语言:javascript
复制
function MockCookie() {
  this.str = '';
  this.__defineGetter__('cookie', function() {
    return this.str;
  });
  this.__defineSetter__('cookie', function(s) {
    this.str += (this.str ? ';' : '') + s;
    return this.str;
  });
}
var mock = new MockCookie();
mock.cookie = 'name=oeschger';
mock.cookie = 'favorite_food=tripe';
mock.cookie; // => "name=oeschger;favorite_food=tripe"

同样,大多数浏览器支持MSIE5(由ECMA262第5版定义),但不支持ECMAScript (或JScript)。

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

https://stackoverflow.com/questions/6456429

复制
相关文章

相似问题

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