vérifier cookie si le cookie existe

Quel est le 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>
49
demandé sur apsillers 2011-05-11 21:28:26

12 réponses

Vous pouvez appeler la fonction getCookie avec le nom du cookie que vous voulez, puis vérifier si c'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
    }
}
86
répondu jac 2016-08-10 14:40:54

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

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

Il ne teste que l'existence de cookies. Une version plus compliquée peut également renvoyer la valeur du cookie:

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

Mettez votre nom de cookie à la place de MyCookie.

56
répondu hegemon 2017-03-13 08:44:26
document.cookie.indexOf('cookie_name=');

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

P. S. seul inconvénient est (comme mentionné dans les commentaires) qu'il se trompera s'il y a un cookie avec un tel nom: any_prefix_cookie_name

(Source)

12
répondu HackToHell 2017-05-23 12:17:35

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

Si vous avez plus d'un cookie (très probable..) et le cookie que vous récupérez est le premier sur la liste, il ne définit pas la variable "end "et donc il retournera toute la chaîne de caractères suivant le" cookieName= " dans le document.témoin de la chaîne!

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, ''); 
}
5
répondu Pikkio 2018-07-20 20:06:24

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

Obtenir la valeur d'un cookie particulier se fait comme suit:

$.cookie('MyCookie'); // Returns the cookie value
4
répondu HeWhoProtects 2014-04-20 10:21:47

RegexObject.test( String ) est rapidement que string. correspond à (expression rationnelle).

Le site MDN décrit le format du document.cookie, et a un exemple regex pour saisir un cookie (document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");). Sur cette base, j'irais pour ceci:

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

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

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

Essais

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

Résultats des tests (Chrome 55.0.2883.87)

3
répondu hajamie 2017-05-23 11:54:05
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;
} 

Essayé la fonction @jac, a eu quelques problèmes, voici comment j'ai édité sa fonction.

0
répondu Matheus 2017-09-11 20:51:15

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
répondu KFish 2018-03-02 20:05:53

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

Installez D'abord le module cookie (et enregistrez-le en tant que dépendance):

npm install --save cookie

Puis importer et utiliser:

import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed) 
    console.log(parsed.cookie1);
0
répondu jonny 2018-03-09 14:00:35

Utilisez cette méthode à la place:

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
répondu warch 2018-07-04 13:49:21

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

Retourne null, soit lorsque le cookie n'existe pas, ou 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-parce que, en toute justice, à quoi ça sert?
Si il n'est plus nécessaire, il est préférable de se débarrasser de tout cela ensemble.

function deleteCookie(name) {
    document.cookie = name +"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
}
0
répondu Dustin Halstead 2018-09-19 13:11:16

Si vous vérifiez simplement l'existence d'un cookie, pourquoi pas...

If (isset ($_COOKIE ['mycookie'])) {faire des choses ici}

-1
répondu Dave 2017-11-03 13:28:42