¿Cómo verifico si existe una cookie?

83

¿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>
confundido
fuente

Respuestas:

125

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
    }
}
jac
fuente
3
Dado que unescapeestá en desuso, ¿hay alguna diferencia en el uso en su decodeURIComponentlugar?
the_nuts
3
@the_nuts, Buena captura. Yo no sabía esto. De acuerdo con w3cschools decodeURI (), o decodeURIComponent se puede usar para reemplazar unescape. La elección de cuál usar puede reducirse a lo que se está almacenando, elegí decodeURI porque no espero tener caracteres separadores codificados en la cookie. Referencia completa: w3schools.com/jsref/jsref_decodeuri.asp
jac
3
esto no funciona con la primera cookie porque el final de la variable no está configurado
warch
función hacerAlgo ($ nombre) {var myCookie = getCookie ($ nombre);
Sol

1
Este es un ejemplo perfecto de por qué w3schools no es una fuente confiable y por qué no debería copiar / pegar las respuestas. Habría evitado usar == y! = Que es bastante conocido en js.
Isaac Pak

94

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.


13
maravillosa solución limpia! La gente toma complementos demasiado rápido en estos días ... demasiada sobrecarga. ¡Esta es una solución muy buena!
patrick

3
Esto no funciona. A Regex le falta un espacio. Debería ser document.cookie.match (/^(.*;)? MyCookie = [^;] + (. *)? $ /), Observe el espacio después de?.
Bogdan M.

1
document.cookie devuelve cookies separadas por espacios, es decir: cookie1 =; cookie1 = 345534;
Bogdan M.

1
@BogdanM. : ¡No hay espacio en blanco para la primera cookie! / [] {0,1} / Ver mi comentario anterior
Gabriel
6
Si desea utilizar una variable: new RegExp ("^ (?:. *;)? \\ s *" + cookieName + "\\ s * = \\ s * ([^;] +) (?:. *)? $ ")
josef
34
document.cookie.indexOf('cookie_name=');

Volverá -1si 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 )

HackToHell
fuente
5
Esto también hace coincidir las cookies con la cadena en su nombre. Por ejemplo, el ejemplo devuelve algo distinto de -1si cookie_name_whateverestá establecido (incluso si cookie_name no lo está). La versión de expresiones regulares en otra respuesta resuelve eso.
hajamie
4
Si bien no es 100% exacto, esta es una solución suficientemente buena en la mayoría de los casos. Gracias por esto, me siento mucho más cómodo usando esto que una función grande o expresiones regulares complicadas de las otras soluciones.
Shane N
14

¡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, ''); 
}
Pikkio
fuente
Con solo un conjunto de cookies, su función devolvió "cookieName =". : - /
Jeppe
1
@Jeppe He modificado el código para que funcione cuando solo hay una cookie. De hecho, aproveché la oportunidad para refactorizar toda la función y ordenarla, además de agregar algunos comentarios. ;)
Pikkio
hay algo mal con replace (/ "/ g, ''); me da un error de sintaxis
iKamy
funcionó para mí, pero probablemente sea mejor escapar de las comillas en la expresión regular. He editado la respuesta. ¡Debería funcionar para ti también ahora!
Pikkio
6

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
Él, quien protege
fuente
3
Esto también asume que OP está usando el complemento jquery-cookie. Me lanzó un bucle por un momento ya que estaba usando jquery pero no puedo usar ese complemento para la tarea que estaba resolviendo.
hippeelee
8
esto no solo es específico de jquery, sino que también requiere un complemento de jquery al que no hizo referencia en su respuesta
artfulhacker
4

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

Resultados de la prueba (Chrome 55.0.2883.87)

hajamie
fuente
¿Cómo puedo pasar una variable como cookieName, en lugar de pasar cookieName como cadena?
DILEEP THOMAS
var name = 'cookie1'; new RegExp ('^ (. *;)? \\ s *' + nombre + '\\ s * ='). test (document.cookie);
hajamie
4

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 nullcuando 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;";
}
Dustin Halstead
fuente
Existe una razón perfectamente válida para tener una cookie sin valor, que es señalar la existencia de algo. Se usaría como un booleano: la cookie existe => verdadero, la cookie no existe => falso
Gus
2
Este fue el mejor método de la lista.
Andrew
1
Esto fue lo mejor. muy útil de toda la lista anterior ..
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;
} 

Probé la función @jac, tuve algunos problemas, así es como edité su función.

Matheus
fuente
1

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

KFish
fuente
1

Para cualquiera que use Node, encontré una solución simple y agradable con las importaciones de ES6 y el cookiemó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);
Jonny
fuente
1

Usando Javascript:

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

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
    }
}
guerra
fuente
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
fuente
0

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

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.


fuente