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:
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
}
}
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
.
document.cookie.indexOf('cookie_name=');
Nó sẽ trở lại -1
nế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 )
-1
if 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 đó.
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, '');
}
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
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)}}));
Đâ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ề null
khi 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;";
}
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.
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);
});
Đố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à cookie
mô-đ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);
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
}
}
/// ************************************************ 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
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;
}
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.
unescape
không được dùng nữa, có sự khác biệt nào khi sử dụngdecodeURIComponent
thay thế không?