¿Cuál es una buena forma de comprobar si existe una cookie?
Condiciones:
La cookie existe si
cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;
La cookie no existe si
cookie=;
//or
<blank>
¿Cuál es una buena forma de comprobar si existe una cookie?
Condiciones:
La cookie existe si
cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;
La cookie no existe si
cookie=;
//or
<blank>
Respuestas:
Puede llamar a la función getCookie con el nombre de la cookie que desea, luego verifique si es = nulo.
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
}
}
He creado una versión alternativa que no es de jQuery:
document.cookie.match(/^(.*;)?\s*MyCookie\s*=\s*[^;]+(.*)?$/)
Solo prueba la existencia de cookies. Una versión más complicada también puede devolver el valor de la cookie:
value_or_null = (document.cookie.match(/^(?:.*;)?\s*MyCookie\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]
Ponga su nombre de cookie en lugar de MyCookie
.
document.cookie.indexOf('cookie_name=');
Volverá -1
si esa cookie no existe.
ps El único inconveniente es (como se menciona en los comentarios) que se equivocará si hay un conjunto de cookies con ese nombre: any_prefix_cookie_name
( Fuente )
-1
si cookie_name_whatever
está establecido (incluso si cookie_name no lo está). La versión de expresiones regulares en otra respuesta resuelve eso.
¡ATENCIÓN! la respuesta elegida contiene un error (respuesta de Jac).
si tiene más de una cookie (muy probablemente ..) y la cookie que está recuperando es la primera en la lista, no establece la variable "end" y, por lo tanto, devolverá la cadena completa de caracteres después de "cookieName = "dentro de la cadena document.cookie!
aquí hay una versión revisada de esa función:
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 está usando jQuery, puede usar el complemento jquery.cookie .
Obtener el valor de una cookie en particular se realiza de la siguiente manera:
$.cookie('MyCookie'); // Returns the cookie value
regexObject. test (String) es más rápido que string. coincidencia (RegExp).
El sitio MDN describe el formato de document.cookie y tiene una expresión regular de ejemplo para tomar una cookie ( document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");
). Basado en eso, iría por esto:
/^(.*;)?\s*cookie1\s*=/.test(document.cookie);
La pregunta parece pedir una solución que devuelve falso cuando la cookie está configurada, pero vacía. En ese caso:
/^(.*;)?\s*cookie1\s*=\s*[^;]/.test(document.cookie);
Pruebas
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)}}));
Esta es una vieja pregunta, pero este es el enfoque que utilizo ...
function getCookie(name) {
var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null;
}
Esto regresa null
cuando la cookie no existe o cuando no contiene el nombre solicitado.
De lo contrario, se devuelve el valor (del nombre solicitado).
Una cookie nunca debería existir sin un valor, porque, para ser justos, ¿cuál es el sentido de eso? 😄
Si ya no es necesario, es mejor deshacerse de todo junto.
function deleteCookie(name) {
document.cookie = name +"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
}
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;
}
Probé la función @jac, tuve algunos problemas, así es como edité su función.
en lugar de la variable de cookie, solo usaría 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);
});
Para cualquiera que use Node, encontré una solución simple y agradable con las importaciones de ES6 y el cookie
módulo.
Primero instale el módulo de cookies (y guárdelo como una dependencia):
npm install --save cookie
Luego importe y use:
import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed)
console.log(parsed.cookie1);
use este método en su lugar:
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
}
}
/// ************************************************ 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
Aquí hay varias buenas respuestas. Sin embargo yo prefiero [1] no usar una expresión regular, y [2] usando la lógica de que es fácil de leer, y [3] para tener una breve función que [4] qué no devuelven true si el nombre es una subcadena de otra galleta nombre . Por último [5] no podemos usar un para cada bucle ya que un retorno no lo rompe.
function cookieExists(name) {
var cks = document.cookie.split(';');
for(i = 0; i < cks.length; i++)
if (cks[i].split('=')[0].trim() == name) return true;
}
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);
}
Para obtener un objeto de cookies simplemente llame getCookie()
Para comprobar si existe una cookie, hágalo así:
if (!getcookie('myCookie')) {
console.log('myCookie does not exist.');
} else {
console.log('myCookie value is ' + getcookie('myCookie'));
}
O simplemente use un operador ternario.
unescape
está en desuso, ¿hay alguna diferencia en el uso en sudecodeURIComponent
lugar?