如何创建和读取Cookie中的值?


Answers:


234

以下是可用于创建和检索Cookie的功能。

function createCookie(name, value, days) {
    var expires;
    if (days) {
        var date = new Date();
        date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toGMTString();
    }
    else {
        expires = "";
    }
    document.cookie = name + "=" + value + expires + "; path=/";
}

function getCookie(c_name) {
    if (document.cookie.length > 0) {
        c_start = document.cookie.indexOf(c_name + "=");
        if (c_start != -1) {
            c_start = c_start + c_name.length + 1;
            c_end = document.cookie.indexOf(";", c_start);
            if (c_end == -1) {
                c_end = document.cookie.length;
            }
            return unescape(document.cookie.substring(c_start, c_end));
        }
    }
    return "";
}

23
如果您的Cookie值包含任何编码/解码不正确的内容,则此方法将无效。w3schools上的一个似乎工作得很美
Richard Rout

13
来自Mozilla的这个简单的包装器还提到了显式的unicode支持
Brad Parks 2014年

4
@BradParks太糟糕了,它在GPL上发布。
2014年

1
如果cookie没有值,则在IE8或9上将不起作用,因为IE不会在cookie名称后面添加等号(=)。我们要做的是检查indexOf(“ =”)==-1,如果是,则使用整个cookie作为cookie名称。
Mohoch 2014年

@jahu我也想说它也是公共领域的:developer.mozilla.org/en-US/docs/MDN/…–
慢性

51

简约且功能齐全的ES6方法:

const setCookie = (name, value, days = 7, path = '/') => {
  const expires = new Date(Date.now() + days * 864e5).toUTCString()
  document.cookie = name + '=' + encodeURIComponent(value) + '; expires=' + expires + '; path=' + path
}

const getCookie = (name) => {
  return document.cookie.split('; ').reduce((r, v) => {
    const parts = v.split('=')
    return parts[0] === name ? decodeURIComponent(parts[1]) : r
  }, '')
}

const deleteCookie = (name, path) => {
  setCookie(name, '', -1, path)
}

2
toGMTString()已弃用,请toUTCString()改用。
Thanh Nguyen

@NguyenThanh Thx!更新
artnikpro

1
有时cookie值本身可能包含=符号。在这种情况下,功能getCookie将产生意外的结果。为了避免这种情况,请考虑在内部使用以下箭头函数减小const [n, ...val] = v.split('='); return n === name ? decodeURIComponent(val.join('=')) : r
Dmitriy Zhura

可以选择保留未设置的到期日为好。这将允许Cookie在浏览器退出时自动删除。
xji

4
864e5 = 86400000 = 1000*60*60*24表示一天24小时的毫秒数。
亨里克·坎图尼

41

jQuery Cookie

或纯Javascript:

function setCookie(c_name,value,exdays)
{
   var exdate=new Date();
   exdate.setDate(exdate.getDate() + exdays);
   var c_value=escape(value) + ((exdays==null) ? "" : ("; expires="+exdate.toUTCString()));
   document.cookie=c_name + "=" + c_value;
}

function getCookie(c_name)
{
   var i,x,y,ARRcookies=document.cookie.split(";");
   for (i=0; i<ARRcookies.length; i++)
   {
      x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
      y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
      x=x.replace(/^\s+|\s+$/g,"");
      if (x==c_name)
      {
        return unescape(y);
      }
   }
}

1
我之所以这么做,主要是因为您提到了JQuery Cookies。我建议。该代码非常小,如果您已经在使用JQuery,那将是正确的选择。
w0rp 2014年

17

Mozilla提供了 简单的框架,框架具有完整的unicode支持用于读取和写入cookie,以及有关如何使用它的示例。

一旦包含在页面上,您就可以设置Cookie:

docCookies.setItem(name, value);

读取Cookie:

docCookies.getItem(name);

或删除Cookie:

docCookies.removeItem(name);

例如:

// sets a cookie called 'myCookie' with value 'Chocolate Chip'
docCookies.setItem('myCookie', 'Chocolate Chip');

// reads the value of a cookie called 'myCookie' and assigns to variable
var myCookie = docCookies.getItem('myCookie');

// removes the cookie called 'myCookie'
docCookies.removeItem('myCookie');

Mozilla的document.cookie页面上查看更多示例和详细信息

这个简单的js文件的版本在github上


2
请注意,MDN上提供的cookie库是在GPL(而不是LGPL)下发布的。
所有工人都很重要

我需要导入什么JavaScript文件?找不到它:(
AlikElzin-kilaka

请参阅此页面上“库”下的部分:developer.mozilla.org/en-US/docs/Web/API/document/…-您可以将其保存到文件中并包含或粘贴到现有js文件中,您想使用它。
布伦丹·尼

因此,没有独立的javascript文件?因此,这是一个代码段-不是实际的库。
2015年

很棒的输入!“库”是一个约80行的单个.js文件;它是此文件(在GitHub上):github.com/madmurphy/cookies.js/blob/master/cookies.js
Philipp

8

ES7,将正则表达式用于get()。基于MDN

const Cookie =
    { get: name => {
        let c = document.cookie.match(`(?:(?:^|.*; *)${name} *= *([^;]*).*$)|^.*$`)[1]
        if (c) return decodeURIComponent(c)
        }
    , set: (name, value, opts = {}) => { 
        if (opts.days) { 
            opts['max-age'] = opts.days * 60 * 60 * 24; 
            delete opts.days 
            }
        opts = Object.entries(opts).reduce((str, [k, v]) => `${str}; ${k}=${v}`, '')
        document.cookie = name + '=' + encodeURIComponent(value) + opts
        }
    , delete: (name, opts) => Cookie.set(name, '', {'max-age': -1, ...opts}) 
    // path & domain must match cookie being deleted 
    }

Cookie.set('user', 'Jim', {path: '/', days: 10}) 
// Set the path to top level (instead of page) and expiration to 10 days (instead of session)

用法-Cookie.get(name,value [,options]):
选项支持所有标准cookie选项并添加“天”:

  • path:'/'-任何绝对路径。默认值:当前文档位置,
  • :“ sub.example.com”-不能以点开头。默认值:没有子域的当前主机。
  • secure:true-仅通过https提供cookie。默认值:false。
  • :2天-直到cookie过期。默认值:会话结束。
    设置到期时间的其他方法:
    • 过期:'Sun,18 Feb 2018 16:23:42 GMT'-到期日期为GMT字符串。
      当前日期可以通过以下方式获取:new Date(Date.now())。toUTCString()
    • “最大年龄”:30-与天相同,但以秒而不是天为单位。

其他答案使用“过期”而不是“最大年龄”来支持较旧的IE版本。此方法需要ES7,因此IE7仍然不可用(这没什么大不了的)。

注意:有趣的字符,例如“ =”和“ {:}”作为cookie值受支持,正则表达式处理前导和尾随空格(来自其他库)。
如果要存储对象,请使用和JSON.stringify和JSON.parse对其进行编码之前和之后,对其进行编辑,或者添加其他方法。例如:

Cookie.getJSON = name => JSON.parse(Cookie.get(name))
Cookie.setJSON = (name, value, opts) => Cookie.set(name, JSON.stringify(value), opts);

反对者会好心地解释我的方法有什么问题吗?
SamGoody

1
1.较短,并且IMO易于维护。2.更完整(这是接受安全的,任意顺序的参数,最大寿命的唯一答案)。3.更多标准默认值(路径等默认为标准,与此处的大多数答案不同)。4.最佳实践(根据MDN,正则表达式是提取值的最可靠方法)。5. Futureprook(如果将更多选项添加到cookie中,则将保留它们)。6.一个对象对代码的污染少于一堆函数。7.获取,设置和删除,易于添加更多方法。8. ES7(美味的流行词)。
SamGoody

7

对于需要保存{foo:'bar'}之类的对象的人,我分享了@KevinBurke答案的编辑版本。我已经添加了JSON.stringify和JSON.parse。

cookie = {

    set: 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 + "=" + JSON.stringify(value) + expires + "; path=/";
    },

    get : function(name){
        var nameEQ = name + "=",
            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  JSON.parse(c.substring(nameEQ.length,c.length));
        }

        return null;
    }

}

因此,现在您可以执行以下操作:

cookie.set('cookie_key', {foo: 'bar'}, 30);

cookie.get('cookie_key'); // {foo: 'bar'}

cookie.set('cookie_key', 'baz', 30);

cookie.get('cookie_key'); // 'baz'

5

我已经多次使用此线程的可接受答案。这是一段很棒的代码:简单且可用。但是我通常使用babel和ES6及其模块,因此,如果您像我一样,请复制以下代码,以使用ES6进行更快的开发

接受的答案被ES6重写为模块:

export const createCookie = ({name, value, days}) => {
  let expires;
  if (days) {
    let date = new Date();
    date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
    expires = '; expires=' + date.toGMTString();
  } else {
    expires = '';
  }
  document.cookie = name + '=' + value + expires + '; path=/';
};

export const getCookie = ({name}) => {
  if (document.cookie.length > 0) {
    let c_start = document.cookie.indexOf(name + '=');
    if (c_start !== -1) {
      c_start = c_start + name.length + 1;
      let c_end = document.cookie.indexOf(';', c_start);
      if (c_end === -1) {
        c_end = document.cookie.length;
      }
      return unescape(document.cookie.substring(c_start, c_end));
    }
  }
  return '';
};

然后,您可以将其简单地导入为任何模块(路径可能会有所不同):

import {createCookie, getCookie} from './../helpers/Cookie';

5

这是在JavaScript中获取,设置和删除Cookie的代码。

function getCookie(name) {
    name = name + "=";
    var cookies = document.cookie.split(';');
    for(var i = 0; i <cookies.length; i++) {
        var cookie = cookies[i];
        while (cookie.charAt(0)==' ') {
            cookie = cookie.substring(1);
        }
        if (cookie.indexOf(name) == 0) {
            return cookie.substring(name.length,cookie.length);
        }
    }
    return "";
}

function setCookie(name, value, expirydays) {
 var d = new Date();
 d.setTime(d.getTime() + (expirydays*24*60*60*1000));
 var expires = "expires="+ d.toUTCString();
 document.cookie = name + "=" + value + "; " + expires;
}

function deleteCookie(name){
  setCookie(name,"",-1);
}

来源:http : //mycodingtricks.com/snippets/javascript/javascript-cookies/


2

我用这个对象。值是经过编码的,因此在从服务器端进行读取或写入时必须考虑它。

cookie = (function() {

/**
 * Sets a cookie value. seconds parameter is optional
 */
var set = function(name, value, seconds) {
    var expires = seconds ? '; expires=' + new Date(new Date().getTime() + seconds * 1000).toGMTString() : '';
    document.cookie = name + '=' + encodeURIComponent(value) + expires + '; path=/';
};

var map = function() {
    var map = {};
    var kvs = document.cookie.split('; ');
    for (var i = 0; i < kvs.length; i++) {
        var kv = kvs[i].split('=');
        map[kv[0]] = decodeURIComponent(kv[1]);
    }
    return map;
};

var get = function(name) {
    return map()[name];
};

var remove = function(name) {
    set(name, '', -1);
};

return {
    set: set,
    get: get,
    remove: remove,
    map: map
};

})();

0

在ES6中读取cookie的简单方法。

function getCookies() {
    var cookies = {};
    for (let cookie of document.cookie.split('; ')) {
        let [name, value] = cookie.split("=");
        cookies[name] = decodeURIComponent(value);
    }
    console.dir(cookies);
}

0

我已经使用js-cookie取得成功。

<script src="/path/to/js.cookie.js"></script>
<script>
  Cookies.set('foo', 'bar');
  Cookies.get('foo');
</script>

0

您可以使用我的cookie ES模块获取/设置/删除cookie。

用法:

在head标签中,包含以下代码:

<script src="https://raw.githack.com/anhr/cookieNodeJS/master/build/cookie.js"></script>

要么

<script src="https://raw.githack.com/anhr/cookieNodeJS/master/build/cookie.min.js"></script>

现在,您可以使用window.cookie将用户信息存储在网页中。

cookie.isEnabled()

您的网络浏览器是否启用了cookie?

returns {boolean} true if cookie enabled.

if ( cookie.isEnabled() )
    console.log('cookie is enabled on your browser');
else
    console.error('cookie is disabled on your browser');

cookie.set(名称,值)

设置一个cookie。

name: cookie name.
value: cookie value.

cookie.set('age', 25);

cookie.get(name [,defaultValue]);

得到一个饼干。

name: cookie name.
defaultValue: cookie default value. Default is undefined.
returns cookie value or defaultValue if cookie was not found
var age = cookie.get('age', 25);

cookie.remove(name);

删除Cookie。

name: cookie name.
cookie.remove( 'age' );

使用例


-1

readCookie的改进版本:

function readCookie( name )
{
    var cookieParts = document.cookie.split( ';' )
    ,   i           = 0
    ,   part
    ,   part_data
    ,   value
    ;

    while( part = cookieParts[ i++ ] )
    {
        part_data = part.split( '=' );

        if ( part_data.shift().replace(/\s/, '' ) === name )
        {
            value = part_data.shift();
            break;
        }

    }
    return value;
}

找到cookie值并返回其值后,该操作应该立即中断。我认为双重分割非常优雅。

如果条件为条件,则替换为空白修剪,以确保其正确匹配


-1
function setCookie(cname,cvalue,exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires=" + d.toGMTString();
    document.cookie = cname+"="+cvalue+"; "+expires;
}

function getCookie(cname) {
    var name = cname + "=";
    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);
        if (c.indexOf(name) == 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

function checkCookie() {
    var user=getCookie("username");
    if (user != "") {
        alert("Welcome again " + user);
    } else {
       user = prompt("Please enter your name:","");
       if (user != "" && user != null) {
           setCookie("username", user, 30);
       }
    }
}

-1

我已经编写了简单的cookieUtils,它具有创建cookie,读取cookie和删除cookie的三个功能。

var CookieUtils = {
    createCookie: function (name, value, expireTime) {
        expireTime = !!expireTime ? expireTime : (15 * 60 * 1000); // Default 15 min
        var date = new Date();
        date.setTime(date.getTime() + expireTime);
        var expires = "; expires=" + date.toGMTString();
        document.cookie = name + "=" + value + expires + "; path=/";
    },
    getCookie: function (name) {
        var value = "; " + document.cookie;
        var parts = value.split("; " + name + "=");
        if (parts.length == 2) {
            return parts.pop().split(";").shift();
        }
    },
    deleteCookie: function(name) {
        document.cookie = name +'=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;';
    }
};

-1

这是来自w3chools的示例。

function setCookie(cname, cvalue, exdays) {
    var d = new Date();
    d.setTime(d.getTime() + (exdays*24*60*60*1000));
    var expires = "expires="+ d.toUTCString();
    document.cookie = cname + "=" + cvalue + ";" + expires + ";path=/";
}

function getCookie(cname) {
    var name = cname + "=";
    var decodedCookie = decodeURIComponent(document.cookie);
    var ca = decodedCookie.split(';');
    for(var i = 0; i <ca.length; i++) {
        var c = ca[i];
        while (c.charAt(0) == ' ') {
            c = c.substring(1);
        }
        if (c.indexOf(name) == 0) {
            return c.substring(name.length, c.length);
        }
    }
    return "";
}

-1

简单阅读

var getCookie = function (name) {
    var valueStart = document.cookie.indexOf(name + "=") + name.length + 1;
    var valueEnd = document.cookie.indexOf(";", valueStart); 
    return document.cookie.slice(valueStart, valueEnd)
}

-2

轻松而简单的读取Cookie的方式可能类似于:

let username, id; 
eval(document.cookie); 
console.log(username + ", " + id); // John Doe, 123

如果您知道Cookie包含以下内容,则可以使用username="John Doe"; id=123;。请注意,字符串将需要在cookie中加引号。可能不是推荐的方法,但是可以用于测试/学习。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.