Wie überprüfe ich, ob ein Cookie vorhanden ist?

83

Wie kann ich überprüfen, ob ein Cookie vorhanden ist?

Bedingungen:

Cookie existiert wenn

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

Cookie existiert nicht wenn

cookie=;
//or
<blank>
verwirrt
quelle

Antworten:

127

Sie können die Funktion getCookie mit dem Namen des gewünschten Cookies aufrufen und dann überprüfen, ob es = null ist.

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
    }
}
jac
quelle
3
Da ist unescapeveraltet, gibt es einen Unterschied unter Verwendung decodeURIComponentstatt?
the_nuts
3
@the_nuts, schöner Fang. Das wusste ich nicht. Laut w3cschools kann decodeURI () oder decodeURIComponent verwendet werden, um unescape zu ersetzen. Die Wahl der zu verwendenden Option hängt möglicherweise davon ab, was gespeichert wird. Ich habe decodeURI gewählt, da ich nicht davon ausgehe, dass das Cookie Trennzeichen codiert. Vollständige Referenz: w3schools.com/jsref/jsref_decodeuri.asp
jac
3
Dies funktioniert nicht mit dem ersten Cookie, da das variable Ende nicht gesetzt ist
Warch
Funktion doSomething ($ name) {var myCookie = getCookie ($ name);
Sol

1
Dies ist ein perfektes Beispiel dafür, warum w3schools keine zuverlässige Quelle ist und warum Sie keine Antworten daraus kopieren / einfügen sollten. Sie hätten es vermieden, == und! = Zu verwenden, was in js ziemlich bekannt ist.
Isaac Pak

96

Ich habe eine alternative Nicht-jQuery-Version erstellt:

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

Es werden nur die Existenz von Cookies getestet. Eine kompliziertere Version kann auch den Cookie-Wert zurückgeben:

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

Geben Sie Ihren Cookie-Namen anstelle von ein MyCookie.


14
wunderbare saubere Lösung! Die Leute greifen heutzutage viel zu schnell nach Plugins ... zu viel Overhead. Dies ist eine sehr schöne Lösung!
Patrick

3
Das funktioniert nicht. Regex fehlt ein Leerzeichen. Es sollte document.cookie.match (/^(.*;)? MyCookie = [^;] + (. *)? $ /) Sein. Beachten Sie das Leerzeichen nach ?.
Bogdan M.

1
document.cookie gibt Cookies zurück, die durch Leerzeichen getrennt sind, dh: cookie1 =; cookie1 = 345534;
Bogdan M.

1
@ BogdanM. : Es gibt keinen Leerraum für den ersten Cookie! / [] {0,1} / Siehe meinen Kommentar oben
Gabriel
6
Wenn Sie eine Variable verwenden möchten: new RegExp ("^ (?:. *;)? \\ s *" + cookieName + "\\ s * = \\ s * ([^;] +) (?:. *)? $ ")
Josef
34
document.cookie.indexOf('cookie_name=');

Es wird zurückgegeben, -1wenn dieses Cookie nicht vorhanden ist.

ps Der einzige Nachteil ist (wie in den Kommentaren erwähnt), dass es fehlerhaft ist, wenn ein Cookie mit einem solchen Namen gesetzt wird: any_prefix_cookie_name

( Quelle )

HackToHell
quelle
5
Dies stimmt auch mit Cookies überein, deren Name der Zeichenfolge entspricht. Das Beispiel gibt beispielsweise etwas anderes zurück als -1if cookie_name_whatevergesetzt ist (auch wenn cookie_name nicht gesetzt ist). Die Regex-Version in einer anderen Antwort löst das.
Hajamie
4
Obwohl dies nicht 100% genau ist, ist dies in den meisten Fällen eine ausreichend gute Lösung. Vielen Dank dafür - ich fühle mich mit dieser Funktion viel wohler als mit einer großen Funktion oder einem komplizierten regulären Ausdruck der anderen Lösungen.
Shane N
14

BEACHTUNG! Die gewählte Antwort enthält einen Fehler (Jacs Antwort).

Wenn Sie mehr als ein Cookie haben (sehr wahrscheinlich ..) und das Cookie, das Sie abrufen, das erste in der Liste ist, wird die Variable "end" nicht festgelegt und daher wird die gesamte Zeichenfolge nach dem "cookieName" zurückgegeben = "innerhalb der document.cookie-Zeichenfolge!

Hier ist eine überarbeitete Version dieser Funktion:

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, ''); 
}
Pikkio
quelle
Mit nur einem Cookie-Set gab Ihre Funktion "cookieName =" zurück. : - /
Jeppe
1
@Jeppe Ich habe den Code so geändert, dass er funktioniert, wenn auch nur ein Cookie vorhanden ist. Ich habe tatsächlich die Gelegenheit genutzt, die gesamte Funktion umzugestalten, aufzuräumen und einige Kommentare hinzuzufügen. ;)
Pikkio
Es ist etwas falsch mit ersetzen (/ "/ g, ''); es gibt mir Syntaxfehler
iKamy
es hat bei mir funktioniert, aber wahrscheinlich ist es besser, den Anführungszeichen in der Regex zu entkommen. Ich habe die Antwort bearbeitet. Sollte jetzt auch für Sie arbeiten!
Pikkio
6

Wenn Sie jQuery verwenden, können Sie das Plugin jquery.cookie verwenden .

Das Abrufen des Werts für ein bestimmtes Cookie erfolgt wie folgt:

$.cookie('MyCookie'); // Returns the cookie value
HeWhoProtects
quelle
3
Dies setzt auch voraus, dass OP das jquery-cookie-Plugin verwendet. Es hat mich eine Weile für eine Schleife geworfen, da ich jquery verwendet habe, aber dieses Plugin nicht für die Aufgabe verwenden kann, für die ich gelöst habe.
Hippeelee
8
Dies ist nicht nur spezifisch für JQuery, sondern erfordert auch ein JQuery-Plugin, auf das Sie in Ihrer Antwort nicht verwiesen haben
artfulhacker
4

regexObject. test (String) ist schneller als string. Spiel (RegExp).

Die MDN-Site beschreibt das Format für document.cookie und verfügt über einen Beispiel-Regex zum Abrufen eines Cookies ( document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");). Basierend darauf würde ich mich für Folgendes entscheiden:

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

Die Frage scheint nach einer Lösung zu fragen, die beim Setzen des Cookies false zurückgibt, aber leer ist. In diesem Fall:

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

Tests

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

Testergebnisse (Chrome 55.0.2883.87)

Hajamie
quelle
Wie kann ich eine Variable als cookieName übergeben, anstatt den cookieName als Zeichenfolge zu übergeben?
DILEEP THOMAS
var name = 'cookie1'; neues RegExp ('^ (. *;)? \\ s *' + Name + '\\ s * ='). test (document.cookie);
Hajamie
4

Dies ist eine alte Frage, aber hier ist der Ansatz, den ich verwende ...

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

Dies wird nullentweder zurückgegeben, wenn das Cookie nicht vorhanden ist oder wenn es den angeforderten Namen nicht enthält.
Andernfalls wird der Wert (des angeforderten Namens) zurückgegeben.

Ein Cookie sollte niemals ohne Wert existieren - denn worum geht es fairerweise? 😄
Wenn es nicht mehr benötigt wird, ist es am besten, alles zusammen loszuwerden.

function deleteCookie(name) {
    document.cookie = name +"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
}
Dustin Halstead
quelle
Es gibt einen durchaus gültigen Grund für ein Cookie ohne Wert, nämlich die Existenz von etwas zu signalisieren. Es würde wie ein Boolescher Wert verwendet: Cookie existiert => wahr, Cookie existiert nicht => falsch
Gus
2
Dies war die beste Methode in der Liste.
Andrew
1
Das war am besten. sehr nützlich von allen oben genannten Liste ..
Yogesh - 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;
} 

Versuchte @jac Funktion, habe einige Probleme, hier ist, wie ich seine Funktion bearbeitet habe.

Matheus
quelle
1

Anstelle der Cookie-Variablen würden Sie einfach document.cookie.split verwenden ...

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

KFish
quelle
1

Für alle, die Node verwenden, habe ich eine schöne und einfache Lösung mit ES6-Importen und dem gefunden cookie Modul gefunden!

Installieren Sie zuerst das Cookie-Modul (und speichern Sie es als Abhängigkeit):

npm install --save cookie

Dann importieren und verwenden:

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

Verwenden von Javascript:

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

Verwenden Sie stattdessen diese Methode:

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
    }
}
warch
quelle
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
Gus
quelle
0

Hier gibt es mehrere gute Antworten. Ich ziehe es jedoch [1] nicht einen regulären Ausdruck, und [2] unter Verwendung von Logik , die einfach zu lesen, und [3] eine kurze Funktion zu haben , dass [4] ist nicht wahr zurück , wenn der Name eine Teil eines anderes Cookie ist Name . Schließlich [5] können wir nicht für jede Schleife ein verwenden, da eine Rückgabe es nicht unterbricht.

function cookieExists(name) {
  var cks = document.cookie.split(';');
  for(i = 0; i < cks.length; i++)
    if (cks[i].split('=')[0].trim() == name) return true;
}
Fom
quelle
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);
}

Um ein Objekt von Cookies zu erhalten, rufen Sie einfach an getCookie()

Gehen Sie folgendermaßen vor, um zu überprüfen, ob ein Cookie vorhanden ist:

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

Oder verwenden Sie einfach einen ternären Operator.


quelle
0
function hasCookie(cookieName){
return document.cookie.split(';')
.map(entry => entry.split('='))
.some(([name, value]) => (name.trim() === cookieName) && !!value);
}

Hinweis: Der Autor wollte, dass die Funktion false zurückgibt, wenn das Cookie leer ist, dh cookie=;dies wird mit der && !!valueBedingung erreicht. Entfernen Sie es, wenn Sie der Meinung sind, dass ein leeres Cookie noch vorhanden ist.

Flavien Volken
quelle