How do I create and read a value from cookie?

前端 未结 19 1688
梦如初夏
梦如初夏 2020-11-21 04:42

How can I create and read a value from a cookie in JavaScript?

19条回答
  •  醉梦人生
    2020-11-21 05:19

    ES7, using a regex for get(). Based on MDN

    const Cookie = {
        get: name => {
            let c = document.cookie.match(`(?:(?:^|.*; *)${name} *= *([^;]*).*$)|^.*$`)[1]
            if (c) return decodeURIComponent(c)
        },
        set: (name, value, opts = {}) => {
            /*If options contains days then we're configuring max-age*/
            if (opts.days) {
                opts['max-age'] = opts.days * 60 * 60 * 24;
    
                /*Deleting days from options to pass remaining opts to cookie settings*/
                delete opts.days 
            }
    
            /*Configuring options to cookie standard by reducing each property*/
            opts = Object.entries(opts).reduce(
                (accumulatedStr, [k, v]) => `${accumulatedStr}; ${k}=${v}`, ''
            )
    
            /*Finally, creating the key*/
            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)
    

    Usage - Cookie.get(name, value [, options]):
    options supports all standard cookie options and adds "days":

    • path: '/' - any absolute path. Default: current document location,
    • domain: 'sub.example.com' - may not start with dot. Default: current host without subdomain.
    • secure: true - Only serve cookie over https. Default: false.
    • days: 2 - days till cookie expires. Default: End of session.
      Alternative ways of setting expiration:
      • expires: 'Sun, 18 Feb 2018 16:23:42 GMT' - date of expiry as a GMT string.
        Current date can be gotten with: new Date(Date.now()).toUTCString()
      • 'max-age': 30 - same as days, but in seconds instead of days.

    Other answers use "expires" instead of "max-age" to support older IE versions. This method requires ES7, so IE7 is out anyways (this is not a big deal).

    Note: Funny characters such as "=" and "{:}" are supported as cookie values, and the regex handles leading and trailing whitespace (from other libs).
    If you would like to store objects, either encode them before and after with and JSON.stringify and JSON.parse, edit the above, or add another method. Eg:

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

提交回复
热议问题