javascript - Hur kontrollerar jag om en cookie finns?


Vad är ett bra sätt att kontrollera om en kaka finns?

Villkor:

Cookie finns om

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

Cookie existerar inte om

cookie=;
//or
<blank>

Svar #1

Du kan kalla på funktionen getCookie med namnet på cookien du vill ha, och sedan kontrollera om den är=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
    }
}

Svar #2

Jag har skapat en alternativ version utan jQuery:

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

Det kontrollerar bara om kakan finns. En mer komplicerad version kan också returnera kakans värde:

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

Sätt ditt cookienamn istället för MyCookie.

Svar #3

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

Det kommer att returnera -1 om den kakan inte existerar.

p.s. Det enda nackdelen med det är (som nämnts i kommentarerna) att det misstar om det finns en cookie med ett sådant namn: any_prefix_cookie_name

(Källa)

Svar #4

Detta är en gammal fråga, men här är det tillvägagångssätt jag använder ...

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

Detta returnerar null antingen när kakan inte finns, eller när den inte innehåller det begärda namnet.
Annars returneras värdet (av det begärda namnet).

En cookie bör aldrig existera utan ett värde -- för ärligt talat, vad är poängen med det? 😄
Om den inte längre behövs är det bäst att helt enkelt göra sig av med den.

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

Svar #5

UPPMÄRKSAMHET! det valda svaret innehåller en bugg (Jacs svar).

om du har mer än en kaka (mycket troligt..) och kakan du hämtar är den första på listan, sätts inte variabeln "end" och därför kommer den att returnera hela strängen av tecken som följer efter "cookieName=" inom document.cookie-strängen!

här är en reviderad version av den funktionen:

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

Relaterade artiklar