Cookieが存在するかどうかを確認するにはどうすればよいですか?


83

クッキーが存在するかどうかを確認する良い方法は何ですか?

条件:

クッキーが存在する場合

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

次の場合、Cookieは存在しません

cookie=;
//or
<blank>

回答:


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 2016

3
@the_nuts、いいキャッチ。私はこれを知りませんでした。w3cschoolsによると、decodeURI()、またはdecodeURIComponentを使用してunscapeを置き換えることができます。どちらを使用するかは、保存されているものによって決まる可能性があります。Cookieにエンコードされた区切り文字が含まれるとは思わないため、decodeURIを選択しました。完全なリファレンス:w3schools.com/jsref/jsref_decodeuri.asp
jac

3
変数終了が設定されていないため、これは最初のクッキーでは動作しません
warch

function 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
素晴らしいクリーンソリューション!最近、人々はプラグインをあまりにも早く取得します...オーバーヘッドが多すぎます。これは非常に優れたソリューションです。
パトリック2015

3
これは機能しません。正規表現にスペースがありません。document.cookie.match(/ ^(。*;)?MyCookie = [^;] +(。*)?$ /)である必要があります。?の後のスペースに注意してください。
ボグダンM.

1
document.cookieは、スペースで区切られたCookieを返します。例:cookie1 =; cookie1 = 345534;
ボグダンM.

1
@BogdanM。:最初のクッキーに空白はありません!/ [] {0,1} /上記の私のコメントを参照してください
Gabriel

6
変数を使用する場合:new RegExp( "^(?:。*;)?\\ s *" + cookieName + "\\ s * = \\ s *([^;] +)(?:。 *)?$ ")
josef 2017年

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

-1そのCookieが存在しない場合に返されます。

psそれの唯一の欠点は(コメントで述べられているように)そのような名前で設定されたクッキーがあると間違いを犯すことです: any_prefix_cookie_name

出典


5
これは、名前に文字列が含まれるすべてのCookieとも一致します。たとえば、この例では-1cookie_name_whateverが設定されている場合以外のものが返されます(cookie_nameが設定されていない場合でも)。別の回答の正規表現バージョンはそれを解決します。
hajamie 2017年

4
100%正確ではありませんが、ほとんどの場合、これで十分なソリューションです。これに感謝します-大きな関数や他のソリューションからの複雑な正規表現よりも、これを使用する方がはるかに快適です。
シェーン

14

注意!選択した回答にはバグが含まれています(Jacの回答)。

複数の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セットが1つだけの場合、関数は「cookieName =」を返しました。:-/
Jeppe 2018

1
@JeppeCookieが1つしかない場合にも機能するようにコードを変更しました。私は実際に、関数全体をリファクタリングして整理し、コメントを追加する機会を得ました。;)
Pikkio 2018

replace(/ "/ g、 '');に問題があり、構文エラーが発生します
iKamy

それは私にとってはうまくいきましたが、おそらく正規表現の引用符をエスケープする方が良いでしょう。答えを編集しました。今もあなたのために働くはずです!
Pikkio

6

jQueryを使用している場合は、jquery.cookieプラグインを使用できます

特定のCookieの値を取得するには、次のようにします。

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

3
これは、OPがjquery-cookieプラグインを使用していることも前提としています。jqueryを使用していたので、少しループが発生しましたが、解決しようとしていたタスクにそのプラグインを使用できません。
hippeelee 2013

8
これはjqueryに固有であるだけでなく、回答で参照しなかったjqueryプラグインも必要です
artfulhacker 2013年

4

regexObject。test(String)はstringより高速です。一致(RegExp)。

MDN部位はdocument.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として渡すにはどうすればよいですか?
DILEEP THOMAS 2018

var name = 'cookie1'; new RegExp( '^(。*;)?\\ s *' + name + '\\ s * =')。test(document.cookie);
hajamie 2018年

4

これは古い質問ですが、これが私が使用するアプローチです...

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

これはnull、Cookieが存在しない場合、または要求された名前が含まれていない場合に返されます。
それ以外の場合は、(要求された名前の)値が返されます。

クッキーは価値がなければ存在してはなりません-公平を期すために、そのポイントは何ですか?😄不要になった
場合は、すべて一緒に取り除くのが最善です。

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

値のないCookieを持つことには、完全に正当な理由があります。つまり、何かの存在を示すためです。ブール値のように使用されます:cookieが存在する=> true、cookieが存在しない=> false
Gus

2
これはリストの中で最良の方法でした。
アンドリュー

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]名前が別のCookieの部分文字列である場合に[4]がtrueを返さない短い関数を使用することをお勧めします。名前 。最後に[5] returnはループを壊さないので、foreachループを使用することはできません。

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

または、三項演算子を使用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.