如何检查Cookie是否存在?


83

检查cookie是否存在的好方法是什么?

条件:

Cookie存在,如果

cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;

如果不存在Cookie,

cookie=;
//or
<blank>

Answers:


125

您可以使用所需Cookie的名称调用函数getCookie,然后检查其是否为null。

function getCookie(name) {
    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
    }
    else
    {
        begin += 2;
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) {
        end = dc.length;
        }
    }
    // because unescape has been deprecated, replaced with decodeURI
    //return unescape(dc.substring(begin + prefix.length, end));
    return decodeURI(dc.substring(begin + prefix.length, end));
} 

function doSomething() {
    var myCookie = getCookie("MyCookie");

    if (myCookie == null) {
        // do cookie doesn't exist stuff;
    }
    else {
        // do cookie exists stuff
    }
}

3
由于unescape已弃用,因此使用之间有什么区别decodeURIComponent吗?
the_nuts

3
@the_nuts,不错。我不知道 根据w3cschools,decodeURI()或decodeURIComponent可用于替换unescape。使用哪种选择可能取决于存储的内容,我选择了解码URI,因为我不希望在cookie中使用编码的分隔符。完整参考资料:w3schools.com/jsref/jsref_decodeuri.asp
jac

3
这不适用于第一个cookie,因为未设置变量end
warch '18

函数doSomething($ name){var myCookie = getCookie($ name);
溶胶

1
这是为什么w3schools不是可靠来源以及为什么您不应该从中复制/粘贴答案的一个很好的例子。您将避免使用js中众所周知的==和!=。
艾萨克·朴

94

我制作了一个替代的非jQuery版本:

document.cookie.match(/^(.*;)?\s*MyCookie\s*=\s*[^;]+(.*)?$/)

它仅测试cookie的存在。更复杂的版本也可以返回cookie值:

value_or_null = (document.cookie.match(/^(?:.*;)?\s*MyCookie\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]

将您的Cookie名称替换为MyCookie


13
很棒的干净解决方案!这些天,人们抢插件的速度太快了……开销太大了。这是一个非常好的解决方案!
patrick

3
这行不通。正则表达式缺少空格。应该是document.cookie.match(/^(.*;)?MyCookie = [^;] +(。*)?$ /),注意?后面的空格。
Bogdan M.

1
document.cookie返回以空格分隔的cookie,即:cookie1 =; cookie1 = 345534;
Bogdan M.

1
@BogdanM。:第一个cookie没有空格!/ [] {0,1} /参阅上方我的评论
加百利

6
如果要使用变量:new RegExp(“ ^(?:。*;)?\\ s *” + cookieName +“ \\ s * = \\ s *([^;] +)(?:。 *)?$“)
josef

34
document.cookie.indexOf('cookie_name=');

-1如果该cookie不存在,它将返回。

ps它的唯一缺点是(如注释中所述),如果设置了具有以下名称的cookie,它将出错: any_prefix_cookie_name

来源


5
这也将匹配名称中带有字符串的所有cookie。例如,该示例返回的内容不是-1ifcookie_name_whatever设置(即使未设置cookie_name)。另一个答案中的正则表达式版本可以解决该问题。
hajamie

4
尽管不是100%准确,但在大多数情况下这是一个足够好的解决方案。谢谢您-与使用大型功能或其他解决方案中的复杂正则表达式相比,使用此功能要舒适得多。
Shane N

14

注意!选择的答案包含一个错误(Jac的答案)。

如果您有多个cookie(很有可能..),并且要检索的cookie是列表中的第一个cookie,则不会设置变量“ end”,因此它将返回“ cookieName”之后的整个字符串在document.cookie字符串中=“ =”!

这是该功能的修订版:

function getCookie( name ) {
    var dc,
        prefix,
        begin,
        end;

    dc = document.cookie;
    prefix = name + "=";
    begin = dc.indexOf("; " + prefix);
    end = dc.length; // default to end of the string

    // found, and not in first position
    if (begin !== -1) {
        // exclude the "; "
        begin += 2;
    } else {
        //see if cookie is in first position
        begin = dc.indexOf(prefix);
        // not found at all or found as a portion of another cookie name
        if (begin === -1 || begin !== 0 ) return null;
    } 

    // if we find a ";" somewhere after the prefix position then "end" is that position,
    // otherwise it defaults to the end of the string
    if (dc.indexOf(";", begin) !== -1) {
        end = dc.indexOf(";", begin);
    }

    return decodeURI(dc.substring(begin + prefix.length, end) ).replace(/\"/g, ''); 
}

仅设置一个cookie,您的函数将返回“ cookieName =“。:-/
Jeppe '18

1
@Jeppe我修改了代码,以便在只有一个cookie的情况下也能正常工作。实际上,我已经借此机会重构了整个功能并进行了整理,并添加了一些注释。;)
Pikkio

replace(/“ / g,'')
出了点问题

它对我有用,但是可能最好不要使用正则表达式中的引号。我已经编辑了答案。现在也应该为您工作!
Pikkio

6

如果您使用的是jQuery,则可以使用jquery.cookie插件

获取特定Cookie的值的操作如下:

$.cookie('MyCookie'); // Returns the cookie value

3
这也假设OP正在使用jquery-cookie插件。自从我使用jquery以来,它就让我陷入了一个循环,但是无法将那个插件用于我要解决的任务。
hippeelee13年

8
这不仅是针对jquery的,而且还需要一个jquery插件,您在答案中没有引用它
artfulhacker 2013年

4

regexObject。test(String)比string匹配(RegExp)。

所述MDN站点描述的document.cookie的格式,并且具有正则表达式示例抓住一个cookie( document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");)。基于此,我会这样做:

/^(.*;)?\s*cookie1\s*=/.test(document.cookie);

问题似乎是要寻求一种解决方案,该解决方案在设置cookie时返回false,但为空。在这种情况下:

/^(.*;)?\s*cookie1\s*=\s*[^;]/.test(document.cookie);

测验

function cookieExists(input) {return /^(.*;)?\s*cookie1\s*=/.test(input);}
function cookieExistsAndNotBlank(input) {return /^(.*;)?\s*cookie1\s*=\s*[^;]/.test(input);}
var testCases = ['cookie1=;cookie1=345534;', 'cookie1=345534;cookie1=;', 'cookie1=345534;', ' cookie1 = 345534; ', 'cookie1=;', 'cookie123=345534;', 'cookie=345534;', ''];
console.table(testCases.map(function(s){return {'Test String': s, 'cookieExists': cookieExists(s), 'cookieExistsAndNotBlank': cookieExistsAndNotBlank(s)}}));

测试结果(Chrome 55.0.2883.87)


如何将变量作为cookieName传递,而不是将cookieName作为字符串传递?
迪利普·托马斯

var name ='cookie1'; 新RegExp('^(。*;)?\\ s *'+名称+'\\ s * =')。test(document.cookie);
hajamie

4

这是一个老问题,但这是我使用的方法...

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

null当cookie不存在或不包含请求的名称时,将返回此值。
否则,返回(所请求名称的)值。

没有价值的cookie永远不应该存在-因为公平地说,这有什么意义?😄
如果不再需要它,则最好将其全部消除。

function deleteCookie(name) {
    document.cookie = name +"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
}

有一个没有值的cookie的一个完全合理的理由就是表明某物的存在。它将像布尔值一样使用:cookie存在=> true,cookie不存在=> false
Gus

2
这是列表中最好的方法。
安德鲁(Andrew

1
这是最好的。非常有用的所有上述名单的..
约杰什- EtherAuthority.io

1
function getCookie(name) {

    var dc = document.cookie;
    var prefix = name + "=";
    var begin = dc.indexOf("; " + prefix);
    if (begin == -1) {
        begin = dc.indexOf(prefix);
        if (begin != 0) return null;
        else{
            var oneCookie = dc.indexOf(';', begin);
            if(oneCookie == -1){
                var end = dc.length;
            }else{
                var end = oneCookie;
            }
            return dc.substring(begin, end).replace(prefix,'');
        } 

    }
    else
    {
        begin += 2;
        var end = document.cookie.indexOf(";", begin);
        if (end == -1) {
            end = dc.length;
        }
        var fixed = dc.substring(begin, end).replace(prefix,'');
    }
    // return decodeURI(dc.substring(begin + prefix.length, end));
    return fixed;
} 

尝试了@jac函数,遇到了一些麻烦,这是我编辑他的函数的方式。


1

而不是cookie变量,您只需要使用document.cookie.split ...

var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
  if(c.match(/cookie1=.+/))
   console.log(true);
});


1

对于使用Node的任何人,我发现了一个不错的,简单的ES6导入和cookie模块解决方案!

首先安装cookie模块(并保存为依赖项):

npm install --save cookie

然后导入并使用:

import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed) 
    console.log(parsed.cookie1);

1

使用Javascript:

 function getCookie(name) {
      let matches = document.cookie.match(new RegExp(
        "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
      ));
      return matches ? decodeURIComponent(matches[1]) : undefined;
    }

0

请改用此方法:

function getCookie(name) {
    var value = "; " + document.cookie;
    var parts = value.split("; " + name + "=");
    if (parts.length == 2) return parts.pop().split(";").shift();
    else return null;
}

function doSomething() {
    var myCookie = getCookie("MyCookie");

    if (myCookie == null) {
        // do cookie doesn't exist stuff;
    }
    else {
        // do cookie exists stuff
    }
}

0
/// ************************************************ cookie_exists

/// global entry point, export to global namespace

/// <synopsis>
///   cookie_exists ( name );
///
/// <summary>
///   determines if a cookie with name exists
///
/// <param name="name">
///   string containing the name of the cookie to test for 
//    existence
///
/// <returns>
///   true, if the cookie exists; otherwise, false
///
/// <example>
///   if ( cookie_exists ( name ) );
///     {
///     // do something with the existing cookie
///     }
///   else
///     {
///     // cookies does not exist, do something else 
///     }

function cookie_exists ( name )
  {
  var exists = false;

  if ( document.cookie )
    {
    if ( document.cookie.length > 0 )
      {
                                    // trim name
      if ( ( name = name.replace ( /^\s*/, "" ).length > 0 ) )
        {
        var cookies = document.cookie.split ( ";" );
        var name_with_equal = name + "=";

        for ( var i = 0; ( i < cookies.length ); i++ )
          {
                                    // trim cookie
          var cookie = cookies [ i ].replace ( /^\s*/, "" );

          if ( cookie.indexOf ( name_with_equal ) === 0 )
            {
            exists = true;
            break;
            }
          }
        }
      }
    }

  return ( exists );

  } // cookie_exists

0

这里有几个很好的答案。但是我更喜欢[1]不使用正则表达式,以及[2]使用的逻辑是简单阅读,和[3]具有短函数[4]没有返回真,如果名字是另一个的cookie的子串名称 。最后,[5]我们不能为每个循环使用a,因为返回不会破坏它。

function cookieExists(name) {
  var cks = document.cookie.split(';');
  for(i = 0; i < cks.length; i++)
    if (cks[i].split('=')[0].trim() == name) return true;
}

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

要获取Cookie的对象,只需调用 getCookie()

要检查cookie是否存在,请按照以下步骤进行操作:

if (!getcookie('myCookie')) {
    console.log('myCookie does not exist.');
} else {
    console.log('myCookie value is ' + getcookie('myCookie'));
}

或仅使用三元运算符。

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.