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