470

我有一个 getter 从 cookie 中获取值。

现在我有 2 个名称shares=和名称的cookie obligations=

我想让这个 getter 只是为了从义务 cookie 中获取值。

我该怎么做呢?因此,for将数据拆分为单独的值并将其放入数组中。

 function getCookie1() {
    // What do I have to add here to look only in the "obligations=" cookie? 
    // Because now it searches all the cookies.

    var elements = document.cookie.split('=');
    var obligations= elements[1].split('%');
    for (var i = 0; i < obligations.length - 1; i++) {
        var tmp = obligations[i].split('$');
        addProduct1(tmp[0], tmp[1], tmp[2], tmp[3]);
    }
 }
4

43 回答 43

604

一种避免迭代数组的方法是:

function getCookie(name) {
  const value = `; ${document.cookie}`;
  const parts = value.split(`; ${name}=`);
  if (parts.length === 2) return parts.pop().split(';').shift();
}

演练

通过标记拆分字符串将生成一个具有一个字符串(相同值)的数组,以防字符串中不存在标记,或者生成具有两个字符串的数组,以防在字符串中找到标记。

第一个(左)元素是令牌之前的字符串,第二个(右)是令牌之后的字符串。

(注意:如果字符串以标记开头,则第一个元素是空字符串)

考虑到 cookie 的存储方式如下:

"{name}={value}; {name}={value}; ..."

为了检索特定的 cookie 值,我们只需要获取 "; {name}=" 之后和下一个 ";" 之前的字符串。在我们进行任何处理之前,我们在 cookie 字符串前面加上“;”,这样每个 cookie 名称,包括第一个,都用“;”和“=”括起来:

"; {name}={value}; {name}={value}; ..."

现在,我们可以先用 "; {name}=" 分割,如果在 cookie 字符串中找到 token(即我们有两个元素),我们最终会得到第二个元素,它是以我们的 cookie 值开头的字符串。然后我们从一个数组中取出它(即pop),并重复相同的过程,但现在使用“;” 作为令牌,但这次拉出左侧字符串(即移位)以获得实际令牌值。

于 2013-03-30T22:40:12.903 回答
217

我更喜欢在 cookie 上使用单个正则表达式匹配:

window.getCookie = function(name) {
  var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
  if (match) return match[2];
}

或者我们也可以作为一个函数使用,检查下面的代码。

function check_cookie_name(name) 
    {
      var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
      if (match) {
        console.log(match[2]);
      }
      else{
           console.log('--something went wrong---');
      }
   }

感谢 Scott Jungwirth 在评论中的改进。

于 2014-01-14T22:13:12.390 回答
63

如果你使用 jQuery,我推荐你使用这个插件:

https://github.com/carhartl/jquery-cookie
https://github.com/carhartl/jquery-cookie/blob/master/jquery.cookie.js

<script type="text/javascript"
 src="//cdnjs.cloudflare.com/ajax/libs/jquery-cookie/1.4.1/jquery.cookie.min.js">

所以你可以像这样读取cookie:

var value = $.cookie("obligations");

你也可以写cookie:

$.cookie('obligations', 'new_value');
$.cookie('obligations', 'new_value', { expires: 14, path: '/' });

删除 cookie:

$.removeCookie('obligations');
于 2014-03-20T10:02:58.367 回答
61

其他一些使用正则表达式的答案中的方法并不涵盖所有情况,特别是:

  1. 当 cookie 是最后一个 cookie 时。在这种情况下,cookie 值后面不会有分号。
  2. 当另一个 cookie 名称以正在查找的名称结尾时。例如,您正在寻找名为“one”的 cookie,并且有一个名为“done”的 cookie。
  3. 当 cookie 名称包含在正则表达式中使用时不被解释为自身的字符时,除非它们前面有反斜杠。

以下方法处理这些情况:

function getCookie(name) {
    function escape(s) { return s.replace(/([.*+?\^$(){}|\[\]\/\\])/g, '\\$1'); }
    var match = document.cookie.match(RegExp('(?:^|;\\s*)' + escape(name) + '=([^;]*)'));
    return match ? match[1] : null;
}

null如果未找到 cookie,这将返回。如果 cookie 的值为空,它将返回一个空字符串。

笔记:

  1. 此函数假定cookie 名称区分大小写
  2. document.cookie- 当它出现在分配的右侧时,它表示一个包含以分号分隔的 cookie 列表的字符串,这些 cookie 又是name=value对的。每个分号后似乎有一个空格。
  3. String.prototype.match()-null未找到匹配项时返回。找到匹配时返回一个数组,索引[1]处的元素是第一个匹配组的值。

正则表达式注释:

  1. (?:xxxx)- 形成一个不匹配的组。
  2. ^- 匹配字符串的开头。
  3. |- 为组分离替代模式。
  4. ;\\s*- 匹配一个分号,后跟零个或多个空白字符。
  5. =- 匹配一个等号。
  6. (xxxx)- 形成一个匹配组。
  7. [^;]*- 匹配零个或多个分号以外的字符。这意味着它将匹配最多但不包括分号或字符串末尾的字符。
于 2014-08-17T04:59:35.060 回答
38

4 年后,ES6 方式更简单的版本。

function getCookie(name) {
  let cookie = {};
  document.cookie.split(';').forEach(function(el) {
    let [k,v] = el.split('=');
    cookie[k.trim()] = v;
  })
  return cookie[name];
}

我还创建了一个要点以将其用作Cookie对象。例如,Cookie.set(name,value)Cookie.get(name)

这会读取所有 cookie 而不是扫描。少量饼干没关系。

于 2018-03-11T20:19:27.540 回答
36

这是一个无需任何外部库即可获得具有特定名称的 cookie 值的方法:

const value = ('; '+document.cookie).split(`; COOKIE_NAME=`).pop().split(';')[0];

这个答案基于kirlich 的出色解决方案。此解决方案的唯一妥协是,当 cookie 不存在时,您将得到一个空字符串。不过,在大多数情况下,这不应该是一个交易破坏者。

于 2020-01-05T18:41:44.483 回答
25

我已经修改了 Jonathan 在这里提供的函数,通过使用正则表达式,您可以通过其名称获取 cookie 值,如下所示:

function getCookie(name){
    var pattern = RegExp(name + "=.[^;]*")
    var matched = document.cookie.match(pattern)
    if(matched){
        var cookie = matched[0].split('=')
        return cookie[1]
    }
    return false
}

如果返回空字符串,则表示 cookie 存在但没有值,如果返回 false,则表示 cookie 不存在。我希望这有帮助。

于 2014-01-15T15:36:02.797 回答
14

您可以使用js-cookie库来获取和设置 JavaScript cookie。

包含到您的 HTML 中:

<script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>

要创建 Cookie:

Cookies.set('name', 'value');

要读取 Cookie:

Cookies.get('name'); // => 'value'
于 2018-08-21T11:31:12.647 回答
13

这是一个很短的版本

 function getCookie(n) {
    let a = `; ${document.cookie}`.match(`;\\s*${n}=([^;]+)`);
    return a ? a[1] : '';
}

请注意,我使用 ES6 的模板字符串来组成正则表达式。

于 2016-11-24T12:24:20.527 回答
12

我知道这是一个老问题,但我也遇到了这个问题。仅作记录,开发人员Mozilla 网页中有一个小 API 。

Yoy 可以仅使用 JS 按名称获取任何 cookie。恕我直言,代码也更干净(除了长线,我相信你可以轻松修复)。

function getCookie(sKey) {
    if (!sKey) { return null; }
    return decodeURIComponent(document.cookie.replace(new RegExp("(?:(?:^|.*;)\\s*" + encodeURIComponent(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*([^;]*).*$)|^.*$"), "$1")) || null;
}

如评论中所述,请注意,此方法假定键和值是使用 encodeURIComponent() 编码的。如果 cookie 的键和值未编码,则删除 decode & encodeURIComponent()。

于 2014-10-07T11:29:13.980 回答
11

我的一个线性函数通过它的键来获取值 cookie。

cookie = key=>((new RegExp((key || '=')+'=(.*?); ','gm')).exec(document.cookie+'; ') ||['',null])[1]

调用 cookie 函数为

cookie('some-key')
于 2020-06-11T05:27:10.420 回答
10
function getCookie(name) {
    var pair = document.cookie.split('; ').find(x => x.startsWith(name+'='));
    if (pair)
       return pair.split('=')[1]
}
于 2017-03-26T19:00:58.253 回答
8

一种将 cookie 转换为 JavaScript 对象或地图的衬垫

Object.fromEntries(document.cookie.split('; ').map(v=>v.split('=').map(decodeURIComponent)))
new Map(document.cookie.split('; ').map(v=>v.split('=').map(decodeURIComponent)))
于 2020-10-21T22:26:50.510 回答
7

利用object.defineProperty

有了这个,您可以轻松访问 cookie

Object.defineProperty(window, "Cookies", {
    get: function() {
        return document.cookie.split(';').reduce(function(cookies, cookie) {
            cookies[cookie.split("=")[0]] = unescape(cookie.split("=")[1]);
            return cookies
        }, {});
    }
});

从现在开始,您可以这样做:

alert( Cookies.obligations );

这也会自动更新,所以如果你改变了一个 cookie,它Cookies也会改变。

于 2016-01-16T06:41:25.117 回答
7

kirlich给出了一个很好的解决方案。但是,当有两个具有相似名称的 cookie 值时,它会失败,这是针对这种情况的简单修复:

function getCookie(name) {
  var value = "; " + document.cookie;
  var parts = value.split("; " + name + "=");
  if (parts.length >= 2) return parts.pop().split(";").shift();
}
于 2016-11-08T01:12:18.450 回答
6

在我看来,您可以将 cookie 键值对拆分为一个数组,并以此为基础进行搜索:

var obligations = getCookieData("obligations");

运行以下内容:

function getCookieData( name ) {
    var pairs = document.cookie.split("; "),
        count = pairs.length, parts; 
    while ( count-- ) {
        parts = pairs[count].split("=");
        if ( parts[0] === name )
            return parts[1];
    }
    return false;
}

小提琴:http: //jsfiddle.net/qFmPc/

甚至可能是以下内容:

function getCookieData( name ) {
    var patrn = new RegExp( "^" + name + "=(.*?);" ),
        patr2 = new RegExp( " " + name + "=(.*?);" );
    if ( match = (document.cookie.match(patrn) || document.cookie.match(patr2)) )
        return match[1];
    return false;
}
于 2012-05-24T02:47:39.470 回答
6

总是运作良好:

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

function setCookie(variable, value, expires_seconds) {
    var d = new Date();
    d = new Date(d.getTime() + 1000 * expires_seconds);
    document.cookie = variable + '=' + value + '; expires=' + d.toGMTString() + ';';
}

对 jQuery 或任何东西没有要求。纯旧的好 JavaScript。

于 2015-03-13T16:52:59.597 回答
6

显然,MDN 从未听说过 word-boundary 正则表达式字符类\b,它匹配\w+在任一侧有界的连续\W+

getCookie = function(name) {
    var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
    return r ? r[1] : null;
};

var obligations = getCookie('obligations');
于 2018-05-11T02:33:08.977 回答
6

使用 cookie 名称获取 cookie 的简单函数:

function getCookie(cn) {
    var name = cn+"=";
    var allCookie = decodeURIComponent(document.cookie).split(';');
    var cval = [];
    for(var i=0; i < allCookie.length; i++) {
        if (allCookie[i].trim().indexOf(name) == 0) {
            cval = allCookie[i].trim().split("=");
        }   
    }
    return (cval.length > 0) ? cval[1] : "";
}
于 2017-07-04T20:15:49.243 回答
5

在我的项目中,我使用以下功能按名称访问 cookie

function getCookie(cookie) {
    return document.cookie.split(';').reduce(function(prev, c) {
        var arr = c.split('=');
        return (arr[0].trim() === cookie) ? arr[1] : prev;
    }, undefined);
}
于 2013-11-14T07:02:42.377 回答
5

一个简单的方法:)

const cookieObj = new URLSearchParams(document.cookie.replaceAll("; ","&"))
cookieObj.get("your-cookie-name")
于 2021-11-03T14:04:50.763 回答
3
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 "";
}

将 cookie 名称传递给 getCookie() 函数以获取其值

于 2021-02-04T09:57:55.570 回答
3

由javascript设置

document.cookie = 'cookiename=tesing';

使用jquery-cookie 插件获取 jquery

var value = $.cookie("cookiename");

alert(value);
于 2017-03-28T08:24:48.617 回答
3

这里已经有很好的获取 cookie 的答案,但是这里是我自己的解决方案:

function getcookie(cookiename){
var cookiestring  = document.cookie;
var cookiearray = cookiestring.split(';');
for(var i =0 ; i < cookiearray.length ; ++i){ 
    if(cookiearray[i].trim().match('^'+cookiename+'=')){ 
        return cookiearray[i].replace(`${cookiename}=`,'').trim();
    }
} return null;
}

用法:`

     getcookie('session_id');
   // gets cookie with name session_id
于 2017-04-11T19:31:01.487 回答
3

参考:https ://developer.mozilla.org/en-US/docs/Web/API/Document/cookie

document.cookie = "test1=Hello";
document.cookie = "test2=World";

var cookieValue = document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");

  alert(cookieValue);
于 2018-09-20T07:36:57.837 回答
2

我写了一些可能易于使用的东西,如果有人要添加一些东西,请随时这样做。

function getcookie(name = '') {
    let cookies = document.cookie;
    let cookiestore = {};
    
    cookies = cookies.split(";");
    
    if (cookies[0] == "" && cookies[0][0] == undefined) {
        return undefined;
    }
    
    cookies.forEach(function(cookie) {
        cookie = cookie.split(/=(.+)/);
        if (cookie[0].substr(0, 1) == ' ') {
            cookie[0] = cookie[0].substr(1);
        }
        cookiestore[cookie[0]] = cookie[1];
    });
    
    return (name !== '' ? cookiestore[name] : cookiestore);
}

用法

getcookie()- 返回一个包含网页上所有 cookie 的对象。

getcookie('myCookie')- 从 cookie 对象返回 cookie myCookie 的值,否则如果 cookie 为空或未设置,则返回 undefined。


例子

// Have some cookies :-)
document.cookie = "myCookies=delicious";
document.cookie = "myComputer=good";
document.cookie = "myBrowser=RAM hungry";

// Read them
console.log( "My cookies are " + getcookie('myCookie') );
// Outputs: My cookies are delicious

console.log( "My computer is " + getcookie('myComputer') );
// Outputs: My computer is good

console.log( "My browser is " + getcookie('myBrowser') );
// Outputs: My browser is RAM hungry

console.log( getcookie() );
// Outputs: {myCookie: "delicious", myComputer: "good", myBrowser: "RAM hungry"}

// (does cookie exist?)
if (getcookie('hidden_cookie')) {
    console.log('Hidden cookie was found!');
} else {
    console.log('Still no cookie :-(');
}

// (do any cookies exist?)
if (getcookie()) {
    console.log("You've got cookies to eat!");
} else {
    console.log('No cookies for today :-(');
}
于 2020-07-16T19:19:52.097 回答
2

我已经这样做了。这样我就可以访问一个对象来分离这些值。有了这个你可以将cookie传递给父级,然后你可以通过像这样的键访问你的值

var cookies=getCookieVal(mycookie);
alert(cookies.mykey);
function getCookieVal(parent) {
            var cookievalue = $.cookie(parent).split('&');
            var obj = {};
            $.each(cookievalue, function (i, v) {
                var key = v.substr(0, v.indexOf("="));
                var val = v.substr(v.indexOf("=") + 1, v.length);

                obj[key] = val;

            });
            return obj;
        }  
于 2017-11-26T11:16:07.810 回答
2

我的解决方案是这样的:

function getCookieValue(cookieName) {
    var ca = document.cookie.split('; ');
    return _.find(ca, function (cookie) {
        return cookie.indexOf(cookieName) === 0;
    });
}

此函数使用 Underscorejs _.find 函数。如果 cookie 名称不存在,则返回 undefined

于 2016-01-19T19:31:44.020 回答
2

只需使用以下函数(纯 javascript 代码)

const getCookie = (name) => {
 const cookies = Object.assign({}, ...document.cookie.split('; ').map(cookie => {
    const name = cookie.split('=')[0];
    const value = cookie.split('=')[1];

    return {[name]: value};
  }));

  return cookies[name];
};
于 2020-02-09T11:07:51.183 回答
1

按名称获取 cookie 只需将 cookie 的名称传递给下面的函数

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 "";
}
于 2020-05-30T09:29:49.830 回答
1

在 JS 中设置 Cookie

document.cookie = 'fb-event-id=15648779++';

按名称获取 Cookie 函数

function getCookie(name) {
    // Split cookie string and get all individual name=value pairs in an array
    var cookieArr = document.cookie.split(";");
    // Loop through the array elements
    for(var i = 0; i < cookieArr.length; i++) {
        var cookiePair = cookieArr[i].split("=");
        /* Removing whitespace at the beginning of the cookie name
        and compare it with the given string */
        if(name == cookiePair[0].trim()) {
            // Decode the cookie value and return
            return decodeURIComponent(cookiePair[1]);
        }
    } 
    // Return null if not found
    return null;
}

这是如何使用 getCookie 函数

var eventID = getCookie('fb-event-id')
于 2021-11-08T07:23:50.257 回答
1

一种查找现有 cookie 的实用方法。它返回一个数组,因此它支持同名的多次出现。它不支持部分键匹配,但是用正则表达式替换过滤器中的 === 很简单。

function getCookie(needle) {
    return document.cookie.split(';').map(function(cookiestring) {
        cs = cookiestring.trim().split('=');

        if(cs.length === 2) {
            return {'name' : cs[0], 'value' : cs[1]};
        } else {
            return {'name' : '', 'value' : ''};
        }
    })
    .filter(function(cookieObject) { 
        return (cookieObject.name === needle);
    });
}
于 2017-04-23T06:28:37.850 回答
0

这对我来说很完美(假设 cookie 名称是唯一的):

function getCookie(name) {
    var cookies = document.cookie;
    var parts = cookies.split(name + "=");
    var cookieValue = '';
    if (parts.length == 2) {
        cookieValue = parts.pop().split(";").shift();
    }
    return cookieValue;
}
于 2021-09-22T21:26:24.380 回答
0

我喜欢使用闭包按名称获取 cookie 值。下面的闭包将允许您按名称获取 cookie 值,但仅在 cookie 字符串已更新时才对其进行解析。

您可以使用以下内容检索 cookie 的值:

var foo = cookies.get( "bar" );

代码:

var cookies = ( function() {
    var cookieString = null;
    var cookieArray = [];

    function getValOf( name ) {
        if ( newCookies() ) {
            parseCookieString()
        }
        return cookieArray[ name ];
    }

    // Check if new cookies have been added
    function newCookies() {
        return cookieString === document.cookie;
    }

    function parseCookieString() {
        cookieString = document.cookie;

        // Separate cookies
        var cookies = cookieString.split( ";" );

        // Empty previous cookies
        cookieArray = [];

        // Update cookieArray with new name-value pairs
        for ( var i in cookies ) {

            // Separate name and value
            var nameVal = cookies[ i ].split( "=" );
            var name = nameVal[ 0 ].trim();
            var value = nameVal[ 1 ].trim();

            // Add cookie name value pair to dictionary
            cookieArray[ name ] = value;
        }
    }

    return {

        /**
         * Returns value or undefined
         */
        get: function( name ) {
            return getValOf( name );
        }  
    };
})();
于 2016-04-07T17:15:47.520 回答
0

只是为了给这个响应添加一个“官方”答案,我复制/粘贴解决方案来设置和检索来自MDN的 cookie (这里是JSfiddle

    document.cookie = "test1=Hello";
    document.cookie = "test2=World";

    var cookieValue = document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");

    function alertCookieValue() {
      alert(cookieValue);
    }

在您的特定情况下,您将使用以下功能

    function getCookieValue() {
      return document.cookie.replace(/(?:(?:^|.*;\s*)obligations\s*\=\s*([^;]*).*$)|^.*$/, "$1");
    }

请注意,我仅将示例中的“test2”替换为“义务”。

于 2018-05-09T08:11:36.383 回答
0
Document.cookie Document 属性 cookie 允许您读取和写入与文档关联的 cookie。它充当 cookie 实际值的 getter 和 setter。
var c = 'Yash' + '=' + 'Yash-777';
document.cookie = c; // Set the value: "Yash=Yash-777"
document.cookie      // Get the value:"Yash=Yash-777"

来自 Google GWT 项目Cookies.java类的原生代码。我准备了以下函数来对 Cookie 执行操作。

将所有 cookie 列表作为 JSON 对象获取的函数。

var uriEncoding = false;
function loadCookiesList() {
    var json = new Object();
    if (typeof document === 'undefined') {
        return json;
    }

    var docCookie = document.cookie;
    if (docCookie && docCookie != '') {
      var crumbs = docCookie.split('; ');
      for (var i = crumbs.length - 1; i >= 0; --i) {
        var name, value;
        var eqIdx = crumbs[i].indexOf('=');
        if (eqIdx == -1) {
          name = crumbs[i];
          value = '';
        } else {
          name = crumbs[i].substring(0, eqIdx);
          value = crumbs[i].substring(eqIdx + 1);
        }
        if (uriEncoding) {
          try {
            name = decodeURIComponent(name);
          } catch (e) {
            // ignore error, keep undecoded name
          }
          try {
            value = decodeURIComponent(value);
          } catch (e) {
            // ignore error, keep undecoded value
          }
        }
        json[name] = value;
      }
    }
    return json;
 }

设置和获取具有特定名称的 Cookie。

function getCookieValue(name) {
    var json = loadCookiesList();
    return json[name];
}

function setCookie(name, value, expires, domain, path, isSecure) {
    var c = name + '=' + value;
    if ( expires != null) {
        if (typeof expires === 'number') {
            // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now
            var timeInMs = Date.now();
            if (expires > timeInMs ) {
                console.log("Seting Cookie with provided expire time.");
                c += ';expires=' + (new Date(expires)).toGMTString();
            } else if (expires < timeInMs) {
                console.log("Seting Cookie with Old expire time, which is in Expired State.");
                timeInMs = new Date(timeInMs + 1000 * expires);
                c += ';expires=' + (new Date(timeInMs)).toGMTString();
            }
        } else if (expires instanceof window.Date) {
            c += ';expires=' + expires.toGMTString();
        }
    }

    if (domain != null && typeof domain == 'string')
      c += ';domain=' + domain;
    if (path != null && typeof path == 'string')
      c += ';path=' + path;
    if (isSecure != null && typeof path == 'boolean')
      c += ';secure';

    if (uriEncoding) {
        encodeURIComponent(String(name))
            .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)
            .replace(/[\(\)]/g, escape);
        encodeURIComponent(String(value))
            .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);

    }
    document.cookie = c;
}

function removeCookie(name) {
    document.cookie = name + "=;expires=Fri, 02-Jan-1970 00:00:00 GMT"; 
}
function removeCookie(name, path) {
    document.cookie = name + "=;path=" + path + ";expires=Fri, 02-Jan-1970 00:00:00 GMT";
}

检查 cookie 名称是否有效:不能包含'=', ';', ',', or whitespace. 不能以 开头$

function isValidCookieName(name) {
    if (uriEncoding) {
      // check not necessary
      return true;
    } else if (name.includes("=") || name.includes(";") || name.includes(",") || name.startsWith("$") || spacesCheck(name) ) {
      return false;
    } else {
      return true;
    }
}
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/test
function spacesCheck(name) {
    var whitespace = new RegExp('.*\\s+.*');
    var result = whitespace.test(name);
    console.log("Name:isContainSpace = ", name, ":", result);
    return result;
}

检查上述功能的测试步骤:

setCookie("yash1", "Yash-777");
setCookie("yash2", "Yash-Date.now()", Date.now() + 1000 * 30);
setCookie("yash3", "Yash-Sec-Feature", 30);
setCookie("yash4", "Yash-Date", new Date('November 30, 2020 23:15:30'));

getCookieValue("yash4"); // Yash-Date
getCookieValue("unknownkey"); // undefined

var t1 = "Yash", t2 = "Y    ash", t3 = "Yash\n";
spacesCheck(t1); // False
spacesCheck(t2); // True
spacesCheck(t3); // True
于 2019-11-26T12:29:48.133 回答
0

这种方法开箱即用

function getCookie(cname) {
  var cookies = ` ${document.cookie}`.split(";");
  var val = "";
  for (var i = 0; i < cookies.length; i++) {
    var cookie = cookies[i].split("=");
    if (cookie[0] == ` ${cname}`) {
      return cookie[1];
    }
  }
  return "";
}
于 2022-01-24T11:55:42.213 回答
0

Cookie 示例:示例 JS:

document.cookies = {
   create : function(key, value, time){
     if (time) {
         var date = new Date();
         date.setTime(date.getTime()+(time*24*60*60*1000));
         var expires = "; expires="+date.toGMTString();
     }
     else var expires = "";
     document.cookie = key+"="+value+expires+"; path=/";
   },
   erase : function(key){
     this.create(key,"",-1);
   },
   read : function(key){
     var keyX = key + "=";
     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(keyX) == 0) return   c.substring(keyX.length,c.length);
     }
     return null;
   }
}

使用 json 或 xml 存储数组和对象

于 2016-01-12T15:54:11.770 回答
0
const cookies = 'key1=chocolate; key2=iceCream; key3=cookies;';

// convert string into array with split
const arrCookies = cookies.split('; '); // [ 'key1=chocolate', 'key2=iceCream', 'key3=cookies' ]

// split key value by equal sign
const arrArrCookiesKeyValue = arrCookies.map(cookie => [cookie.split('=')]);  // [[['key1', 'chocolate']], ...']

// make an object with key value
const objectKeyValueCookies = {}; // { key1: 'chocolate', key2: 'iceCream', key3: 'cookies;' }
for (let arr of arrArrCookiesKeyValue) {
    objectKeyValueCookies[arr[0][0]] = arr[0][1];
}

// find the key in object
const findValueByKey = (key = null, objectCookies) => objectCookies[key];
console.log(findValueByKey('key2', objectKeyValueCookies)); // chocolate
于 2021-03-23T02:16:39.900 回答
0

以下函数将返回一key-value对所需的 cookie,其中keycookie 名称和 cookievalue值在哪里。

/**
 * Returns cookie key-value pair
 */
var getCookieByName = function(name) {
    var result = ['-1','-1'];
    if(name) {
        var cookieList = document.cookie.split(';');
        result = $.grep(cookieList,function(cookie) { 
            cookie = cookie.split('=')[0];
            return cookie == name;
        });
    }
    return result;
};
于 2016-01-11T07:29:48.290 回答
0

现在,当您以数组格式存储 cookie 时,您可以让 cookie 作为数组返回。例如你的 cookie 是 array[35]=Khóa; 数组[36]=Tử; 数组[37]=Cửa; 这段代码也带有utf8。当您的 cookie 名称内容 [] 在其中并且您存储的 cookie 不在数组中时,有一件事无法正常工作。

function getCookie(cname) {

            var ca = decodeURIComponent(document.cookie).split(';');


            if (cname.indexOf('[]') > 0) {
                var returnVAlue = [];
                var nameArray = cname.replace("[]", "");

                for(var i = 0; i < ca.length; i++) {
                    var c = ca[i];
                   // console.log(c);
                    while (c.charAt(0) == ' ') {
                        c = c.substring(1);
                    }

                    if (c.indexOf(nameArray) >= 0) {
                        var valueString = c.substr(nameArray.length, c.length);

                        var valueStringSlit = valueString.split('=');
                        valueStringSlit[0] = valueStringSlit[0].substr(1,(valueStringSlit[0].length - 2));
                    //    console.log(valueStringSlit);

                        returnVAlue.push(valueStringSlit);
                    }
                }
            } else {
                var returnVAlue = '';
                var name = cname + "=";

                for(var i = 0; i < ca.length; i++) {
                    var c = ca[i];
                   // console.log(c);
                    while (c.charAt(0) == ' ') {
                        c = c.substring(1);
                    }
                    if (c.indexOf(name) == 0) {
                        returnVAlue = c.substr(name.length, c.length);
                    } 
                }
            }


            if (returnVAlue != ''){
                return returnVAlue;
            } 
            return "";
        }

       // console.log(decodeURIComponent(document.cookie));


        console.log(getCookie('array[]'));
于 2018-09-26T06:57:56.223 回答
0

我会做这样的事情:

function getCookie(cookie){
  return cookie
    .trim()
    .split(';')
    .map(function(line){return line.split(',');})
    .reduce(function(props,line) {
      var name = line[0].slice(0,line[0].search('='));
      var value = line[0].slice(line[0].search('='));
      props[name] = value;
      return props;
    },{})
}

这会将您的 cookie 作为对象返回。

然后你可以这样称呼它:

getCookie(document.cookie)['shares']
于 2016-01-15T15:39:40.637 回答
-2
function GetCookieValue(name) {
    var found = document.cookie.split(';').filter(c => c.trim().split("=")[0] === name);
    return found.length > 0 ? found[0].split("=")[1] : null;
}
于 2019-04-07T10:54:30.937 回答