Làm cách nào để kiểm tra xem cookie có tồn tại hay không?


83

Cách tốt để kiểm tra xem cookie có tồn tại không?

Điều kiện:

Cookie tồn tại nếu

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

Cookie không tồn tại nếu

cookie=;
//or
<blank>

Câu trả lời:


125

Bạn có thể gọi hàm getCookie với tên của cookie bạn muốn, sau đó kiểm tra xem nó có phải = null hay không.

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

3
unescapekhông được dùng nữa, có sự khác biệt nào khi sử dụng decodeURIComponentthay thế không?
the_nuts

3
@the_nuts, Rất hay. Tôi không biết điều này. Theo w3cschools decodeURI (), hoặc decodeURIComponent có thể được sử dụng để thay thế unescape. Lựa chọn sử dụng có thể phụ thuộc vào những gì đang được lưu trữ, tôi đã chọn decodeURI vì tôi không mong đợi có các ký tự phân tách được mã hóa trong cookie. Tham khảo đầy đủ: w3schools.com/jsref/jsref_decodeuri.asp
jac

3
điều này không hoạt động với cookie đầu tiên bởi vì biến kết thúc không được đặt
warch

function doSomething ($ name) {var myCookie = getCookie ($ name);
Sol

1
Đây là một ví dụ hoàn hảo về lý do tại sao w3schools không phải là một nguồn đáng tin cậy và tại sao bạn không nên sao chép / dán câu trả lời từ đó. Bạn sẽ tránh sử dụng == và! = Khá nổi tiếng trong js.
Isaac Pak

94

Tôi đã tạo một phiên bản thay thế không phải jQuery:

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

Nó chỉ kiểm tra sự tồn tại của cookie. Một phiên bản phức tạp hơn cũng có thể trả về giá trị cookie:

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

Đặt tên cookie của bạn ở vị trí của MyCookie.


13
giải pháp sạch tuyệt vời! Ngày nay, mọi người lấy plugin quá nhanh ... quá nhiều chi phí. Đây là một giải pháp rất hay!
Patrick

3
Điều này không hoạt động. Regex đang thiếu một khoảng trắng. Nó phải là document.cookie.match (/^(.*;)? MyCookie = [^;] + (. *)? $ /), Để ý khoảng trắng sau ?.
Bogdan M.

1
document.cookie trả về các cookie được phân tách bằng dấu cách, tức là: cookie1 =; cookie1 = 345534;
Bogdan M.

1
@BogdanM. : Không có khoảng trắng cho cookie đầu tiên! / [] {0,1} / Xem nhận xét của tôi ở trên
Gabriel

6
Nếu bạn muốn sử dụng một biến: new RegExp ("^ (?:. *;)? \\ s *" + cookieName + "\\ s * = \\ s * ([^;] +) (?:. *)? $ ")
josef

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

Nó sẽ trở lại -1nếu cookie đó không tồn tại.

ps Chỉ có một nhược điểm của nó là (như đã đề cập trong phần bình luận) rằng nó sẽ nhầm lẫn nếu có cookie được đặt với tên như vậy: any_prefix_cookie_name

( Nguồn )


5
Điều này cũng khớp với bất kỳ cookie nào có chuỗi trong tên của chúng. Ví dụ: ví dụ trả về một cái gì đó khác với -1if cookie_name_whateverđược đặt (ngay cả khi cookie_name không). Phiên bản regex trong một câu trả lời khác giải quyết được điều đó.
hajamie

4
Mặc dù không chính xác 100% nhưng đây là một giải pháp đủ tốt trong hầu hết các trường hợp. Cảm ơn vì điều này - tôi cảm thấy thoải mái hơn nhiều khi sử dụng chức năng này so với một hàm lớn hoặc regexp phức tạp từ các giải pháp khác.
Shane N

14

CHÚ Ý! câu trả lời đã chọn chứa một lỗi (câu trả lời của Jac).

nếu bạn có nhiều hơn một cookie (rất có thể là ..) và cookie bạn đang truy xuất là cookie đầu tiên trong danh sách, nó không đặt biến "end" và do đó nó sẽ trả về toàn bộ chuỗi ký tự theo sau "cookieName = "trong chuỗi document.cookie!

đây là phiên bản sửa đổi của chức năng đó:

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

Chỉ với một bộ cookie, hàm của bạn trả về "cookieName =". : - /
Jeppe

1
@Jeppe Tôi đã sửa đổi mã để hoạt động khi chỉ có một cookie. Tôi thực sự đã có cơ hội để cấu trúc lại toàn bộ chức năng và làm gọn nó, cũng như thêm một số nhận xét. ;)
Pikkio

có điều gì đó sai với thay thế (/ "/ g, ''); nó gây cho tôi lỗi cú pháp
iKamy

nó làm việc cho tôi nhưng có lẽ tốt hơn là thoát khỏi các dấu ngoặc kép trong regex. Tôi đã chỉnh sửa câu trả lời. Cũng nên làm việc cho bạn ngay bây giờ!
Pikkio

6

Nếu đang sử dụng jQuery, bạn có thể sử dụng plugin jquery.cookie .

Nhận giá trị cho một cookie cụ thể được thực hiện như sau:

$.cookie('MyCookie'); // Returns the cookie value

3
Điều này cũng giả sử OP đang sử dụng plugin jquery-cookie. Nó đã khiến tôi phải lo lắng một chút vì tôi đang sử dụng jquery nhưng không thể sử dụng plugin đó cho nhiệm vụ mà tôi đang giải quyết.
hippeelee

8
điều này không chỉ dành riêng cho jquery mà còn yêu cầu một plugin jquery mà bạn không tham chiếu trong câu trả lời của mình
artfulhacker

4

regexObject. kiểm tra (Chuỗi) nhanh hơn chuỗi. khớp (RegExp).

Các trang web MDN mô tả định dạng cho document.cookie, và có một ví dụ regex để lấy một cookie ( document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");). Dựa trên điều đó, tôi sẽ làm điều này:

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

Câu hỏi dường như yêu cầu một giải pháp trả về false khi cookie được đặt, nhưng trống. Trong trường hợp đó:

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

Kiểm tra

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

Kết quả kiểm tra (Chrome 55.0.2883.87)


làm cách nào để chuyển một biến dưới dạng cookieName, thay vì chuyển cookieName dưới dạng chuỗi?
DILEEP THOMAS

var name = 'cookie1'; new RegExp ('^ (. *;)? \\ s *' + name + '\\ s * ='). test (document.cookie);
hajamie

4

Đây là một câu hỏi cũ, nhưng đây là cách tôi sử dụng ...

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

Điều này trả về nullkhi cookie không tồn tại hoặc khi nó không chứa tên được yêu cầu.
Nếu không, giá trị (của tên được yêu cầu) được trả về.

Một cookie không bao giờ được tồn tại nếu không có giá trị - bởi vì, công bằng mà nói, điểm của nó là gì? 😄
Nếu không còn cần thiết nữa, tốt nhất hãy cùng nhau gạt bỏ tất cả.

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

Có một lý do hoàn toàn hợp lệ để có một cookie không có giá trị, đó là để báo hiệu sự tồn tại của một thứ gì đó. Nó sẽ được sử dụng giống như một Boolean: cookie tồn tại => true, cookie không tồn tại => false
Gus

2
Đây là phương pháp tốt nhất trong danh sách.
Andrew

1
Điều này là tốt nhất. rất hữu ích trong danh sách trên ..
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;
} 

Đã thử hàm @jac, gặp một số rắc rối, đây là cách tôi chỉnh sửa hàm của anh ấy.


1

thay vì biến cookie, bạn sẽ chỉ sử dụng 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);
});


1

Đối với bất kỳ ai sử dụng Node, tôi đã tìm thấy một giải pháp đơn giản và hay với các nhập ES6 và cookiemô-đun!

Trước tiên hãy cài đặt mô-đun cookie (và lưu dưới dạng phụ thuộc):

npm install --save cookie

Sau đó nhập và sử dụng:

import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed) 
    console.log(parsed.cookie1);

1

Sử dụng Javascript:

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

0

sử dụng phương pháp này thay thế:

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
/// ************************************************ 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

0

Có một số câu trả lời tốt ở đây. Tuy nhiên tôi thích [1] không sử dụng một biểu thức chính quy, và [2] sử dụng logic đó là đơn giản để đọc, và [3] để có một hàm ngắn [4] không không trở thành sự thật nếu tên là một chuỗi cookie khác Tên . Cuối cùng [5] chúng ta không thể sử dụng một cho mỗi vòng lặp vì trả về không phá vỡ nó.

function cookieExists(name) {
  var cks = document.cookie.split(';');
  for(i = 0; i < cks.length; i++)
    if (cks[i].split('=')[0].trim() == name) return true;
}

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

Để có được một đối tượng của cookie, chỉ cần gọi getCookie()

Để kiểm tra xem cookie có tồn tại hay không, hãy làm như sau:

if (!getcookie('myCookie')) {
    console.log('myCookie does not exist.');
} else {
    console.log('myCookie value is ' + getcookie('myCookie'));
}

Hoặc chỉ sử dụng một toán tử bậc ba.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.