web-dev-qa-db-ja.com

Cookieが存在する場合はCookieを確認します

Cookieが存在するかどうかを確認する良い方法は何ですか?

条件:

Cookieが存在する場合

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

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

cookie=;
//or
<blank>
64
confuzzled

目的の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
    }
}
104
jac

私は別の非jQueryバージョンを作成しました:

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

Cookieの存在のみをテストします。より複雑なバージョンでもCookie値を返すことができます。

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

MyCookieの代わりにCookie名を入れます。

67
hegemon
document.cookie.indexOf('cookie_name=');

そのCookieが存在しない場合、-1を返します。

追伸唯一の欠点は、(コメントに記載されているように)any_prefix_cookie_nameという名前のCookieが設定されていると間違えることです。

ソース

23
HackToHell

注意!選択した回答にはバグが含まれています(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, ''); 
}
9
Pikkio

JQueryを使用している場合は、 jquery.cookie plugin を使用できます。

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

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

regexObject . test (String)は faster stringよりも大きいです。 match (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)}}));

Test results (Chrome 55.0.2883.87)

4
hajamie
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
Matheus

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

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

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

Cookieは値なしでは決して存在するべきではありません-公正に言えば、その意味は何ですか? ????
不要になった場合は、まとめて削除するのが最善です。

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

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

代わりにこのメソッドを使用してください。

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
warch

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