cookie.js 2.27 KB
/**
 * [MDN](https://developer.mozilla.org/zh-CN/docs/Web/API/Document/cookie#Syntax)
 */
const Cookies = {
  get: function (sKey) {
    return decodeURIComponent(
      document.cookie.replace(
        new RegExp(
          "(?:(?:^|.*;)\\s*" +
          encodeURIComponent(sKey).replace(/[-.+*]/g, "\\$&") +
          "\\s*\\=\\s*([^;]*).*$)|^.*$"
        ), "$1"
      )
    ) || null
  },
  /**
   * 写入
   * @param {string} sKey necessary
   * @param {string} sValue necessary
   * @param {number|null|date|object|Infinity|string} vEnd optional
   * @param {string|null} sPath optional
   * @param {string|null} sDomain optional
   * @param {boolean|null} bSecure optional
   */
  set: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
    if (!sKey ||
      /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)
    ) {
      return false
    }

    let sExpires = ''
    if (vEnd) {
      switch (vEnd.constructor) {
        case Number:
          sExpires = vEnd === Infinity
            ? '; expires=Fri, 31 Dec 9999 23:59:59 GMT'
            : '; max-age=' + vEnd
          break;
        case String:
          sExpires = '; expires=' + vEnd
          break;
        case Date:
          sExpires = '; expires=' + vEnd.toUTCString()
          break;
      }
    }
    document.cookie = encodeURIComponent(sKey) + '=' +
      encodeURIComponent(sValue) + sExpires +
      (sDomain ? '; domain=' + sDomain : '') +
      (sPath ? '; path=' + sPath : '') +
      (bSecure ? '; secure' : '')
    return true
  },
  remove: function (sKey, sPath, sDomain) {
    if (!sKey || !this.has(sKey)) return false
    document.cookie = encodeURIComponent(sKey) +
      '=; expires=Thu, 01 Jan 1970 00:00:00 GMT' +
      (sDomain ? '; domain=' + sDomain : '') +
      (sPath ? '; path=' + sPath : '')

    return true
  },
  has: function (sKey) {
    return (
      new RegExp('(?:^|;\\s*)' +
        encodeURIComponent(sKey).replace(/[-.+*]/g, '\\$&') +
        '\\s*\\='
      )
    ).test(document.cookie)
  },
  keys: function () {
    let aKeys = document.cookie.replace(
      /((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g,
      ''
    ).split(/\s*(?:\=[^;]*)?;\s*/)

    for (let nIdx = 0;nIdx < aKeys.length;nIdx++) {
      aKeys[nIdx] = decodeURIComponent(aKeys[nIdx])
    }

    return aKeys
  }
}