Javascript 按名称获取cookie

Javascript 按名称获取cookie,javascript,cookies,Javascript,Cookies,我有一个从cookie中获取值的getter 现在我有两个cookie,分别是名为共享=和名为义务= 我只想让这个getter从义务cookie中获取值 我该怎么做?因此的将数据拆分为单独的值,并将其放入数组中 function getCookie1() { // What do I have to add here to look only in the "obligations=" cookie? // Because now it searches all the co

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

现在我有两个cookie,分别是名为
共享=
和名为
义务=

我只想让这个getter从义务cookie中获取值

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

 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]);
    }
 }
函数getCookie1(){ //我必须在这里添加什么才能只查看“cookie”? //因为现在它搜索所有的cookies。 var元素=document.cookie.split('='); var义务=元素[1]。拆分(“%”); 对于(变量i=0;i<0.length-1;i++){ var tmp=债务[i]。拆分(“$”); addProduct1(tmp[0],tmp[1],tmp[2],tmp[3]); } }
使用cookie获取脚本:

function readCookie(name) {
    var nameEQ = name + "=";
    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(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

我从quirksmode cookies页面偷了上面的代码

在我看来,您可以将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;
}
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;
}
小提琴:

甚至可能是以下情况:

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;
}
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;
}

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

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}=”之后和“下一步”之前的字符串。在进行任何处理之前,我们会在cookies字符串的前面加上“;”,这样每个cookie名称,包括第一个cookie名称,都会加上“;”和“=”:


现在,我们可以首先按“{name}=”拆分,如果在cookie字符串中找到标记(即,我们有两个元素),那么第二个元素将是以cookie值开头的字符串。然后我们从一个数组中取出它(即pop),重复相同的过程,但现在使用“;”作为标记,但这次取出左字符串(即shift)以获得实际的标记值。

在我的项目中,我使用以下函数按名称访问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);
}

我更喜欢在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在评论中的改进。

我修改了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
}
var value = $.cookie("obligations");

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

如果您使用jQuery,我建议您使用此插件:


您还可以编写cookie:

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

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

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

  • 当cookie是最后一个cookie时。在这种情况下,cookie值后面不会有分号
  • 当另一个cookie名称以正在查找的名称结尾时。例如,您正在查找名为“one”的cookie,并且有一个名为“done”的cookie
  • 当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;
    }
    
    如果找不到cookie,则返回
    null
    。如果cookie的值为空,它将返回一个空字符串

    注:

  • 此函数假定为
  • -当它出现在分配的右侧时,它表示一个包含分号分隔的cookie列表的字符串,这些cookie依次是
    name=value
    对。每个分号后面似乎都有一个空格
  • -未找到匹配项时返回
    null
    。找到匹配项时返回数组,索引
    [1]
    处的元素是第一个匹配组的值
  • 正则表达式注释:

  • (?:xxxx)
    -形成一个不匹配的组
  • ^
    -匹配字符串的开头
  • |
    -为组分离备选模式
  • \\s*
    -匹配一个分号,后跟零个或多个空格字符
  • =
    -匹配一个等号
  • (xxxx)
    -形成一个匹配组
  • [^;]*
    -匹配除分号以外的零个或多个字符。这意味着它将匹配最多(但不包括)分号或字符串结尾的字符

  • 我知道这是个老问题,但我也遇到了这个问题。为了记录在案,开发人员中有一些API

    Yoy可以只使用JS按名称获取任何cookie。代码也更干净(除了长线,我相信你可以很容易地修复)

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

    始终运行良好:

    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() + ';';
    }
    
    函数getCookie(cname){
    变量名称=cname+“=”,
    ca=document.cookie.split(“;”),
    我
    C
    ca_长度=ca.长度;
    对于(i=0;iObject.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 );
    
    function getCookieValue(cookieName) {
        var ca = document.cookie.split('; ');
        return _.find(ca, function (cookie) {
            return cookie.indexOf(cookieName) === 0;
        });
    }
    
    function getCookie(name) {
      var value = "; " + document.cookie;
      var parts = value.split("; " + name + "=");
      if (parts.length >= 2) return parts.pop().split(";").shift();
    }
    
     function getCookie(n) {
        let a = `; ${document.cookie}`.match(`;\\s*${n}=([^;]+)`);
        return a ? a[1] : '';
    }
    
    function getCookie(name) {
        var pair = document.cookie.split('; ').find(x => x.startsWith(name+'='));
        if (pair)
           return pair.split('=')[1]
    }
    
    document.cookie = 'cookiename=tesing';
    
    var value = $.cookie("cookiename");
    
    alert(value);
    
    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
    
    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);
        });
    }
    
    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] : "";
    }
    
    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;
            }  
    
    function getCookie(name) {
      let cookie = {};
      document.cookie.split(';').forEach(function(el) {
        let [k,v] = el.split('=');
        cookie[k.trim()] = v;
      })
      return cookie[name];
    }
    
    getCookie = function(name) {
        var r = document.cookie.match("\\b" + name + "=([^;]*)\\b");
        return r ? r[1] : null;
    };
    
    var obligations = getCookie('obligations');
    
    <script src="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>
    
    Cookies.set('name', 'value');
    
    Cookies.get('name'); // => 'value'
    
    document.cookie = "test1=Hello";
    document.cookie = "test2=World";
    
    var cookieValue = document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");
    
      alert(cookieValue);
    
    document.cookie.split('logged=true').length == 2
    
    var cookie = ("; "+document.cookie).split("; YOUR_COOKIE_NAME=").pop().split(";").shift();
    
    cookie = key=>((new RegExp((key || '=')+'=(.*?); ','gm')).exec(document.cookie+'; ') ||['',null])[1]
    
    cookie('some-key')
    
    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);
    }
    
    // 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 :-(');
    }