web-dev-qa-db-fra.com

vérifier le cookie si le cookie existe

Quel est un bon moyen de vérifier si un cookie existe?

Conditions:

Le cookie existe si

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

Le cookie n'existe pas si

cookie=;
//or
<blank>
55
confuzzled

Vous pouvez appeler la fonction getCookie avec le nom du cookie souhaité, puis vérifier si elle est = 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
    }
}
96
jac

J'ai conçu une version alternative non-jQuery:

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

Il teste uniquement l'existence de cookies. Une version plus compliquée peut également renvoyer une valeur de cookie:

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

Mettez votre nom de cookie à la place de MyCookie.

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

Il renverra -1 si ce cookie n'existe pas.

p.s. Son seul inconvénient est (comme mentionné dans les commentaires) qu’il se trompe s’il existe un cookie portant ce nom: any_prefix_cookie_name

( La source )

16
HackToHell

ATTENTION! La réponse choisie contient un bug (réponse de Jac).

si vous avez plus d'un cookie (très probablement ..) et que le cookie que vous récupérez est le premier de la liste, il ne définit pas la variable "end" et renvoie par conséquent la chaîne de caractères complète suivant le "cookieName = "dans la chaîne document.cookie!

voici une version révisée de cette fonction:

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

Si vous utilisez jQuery, vous pouvez utiliser le plugin jquery.cookie .

L'obtention de la valeur pour un cookie particulier s'effectue comme suit:

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

regexObject. test (String) est plus rapide que string. match (RegExp). 

Le site MDN décrit le format de document.cookie et contient un exemple de regex pour récupérer un cookie (document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");). Sur cette base, je choisirais ceci:

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

La question semble demander une solution qui retourne false lorsque le cookie est défini, mais vide. Dans ce cas:

/^(.*;)?\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)}}));

 Test results (Chrome 55.0.2883.87)

3
hajamie

au lieu de la variable cookie, vous utiliseriez simplement 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

utilisez plutôt cette méthode:

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

Pour ceux qui utilisent Node, j'ai trouvé une solution simple et agréable avec les importations ES6 et le module cookie!

Commencez par installer le module cookie (et enregistrez-le en tant que dépendance):

npm install --save cookie

Puis importez et utilisez:

import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed) 
    console.log(parsed.cookie1);
0
jonny
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;
} 

J'ai essayé la fonction @jac, j'ai eu quelques problèmes, voici comment j'ai modifié sa fonction.

0
Matheus

C'est une vieille question, mais voici l'approche que j'utilise ...

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

Cela retourne null soit lorsque le cookie n'existe pas, soit lorsqu'il ne contient pas le nom demandé.
Sinon, la valeur (du nom demandé) est renvoyée.

Un cookie ne devrait jamais exister sans valeur - car, en toute justice, quel est le but de cela? ????
Si vous n'en avez plus besoin, mieux vaut simplement vous en débarrasser.

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