Який хороший спосіб перевірити, чи існує файл cookie?
Умови:
Файл cookie існує, якщо
cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;
Файл cookie не існує, якщо
cookie=;
//or
<blank>
Який хороший спосіб перевірити, чи існує файл cookie?
Умови:
Файл cookie існує, якщо
cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;
Файл cookie не існує, якщо
cookie=;
//or
<blank>
Відповіді:
Ви можете викликати функцію getCookie з іменем файлу cookie, який ви хочете, а потім перевірити, чи є воно = 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
}
}
Я створив альтернативну версію, яка не стосується jQuery:
document.cookie.match(/^(.*;)?\s*MyCookie\s*=\s*[^;]+(.*)?$/)
Він лише перевіряє наявність файлів cookie. Більш складна версія може також повернути значення файлу cookie:
value_or_null = (document.cookie.match(/^(?:.*;)?\s*MyCookie\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]
Вставте назву файлу cookie на місце MyCookie
.
document.cookie.indexOf('cookie_name=');
Повернеться -1
якщо цього файлу cookie не існує.
ps Єдиним недоліком цього є (як згадувалося в коментарях) те, що він помилиться, якщо встановлений файл cookie з такою назвою: any_prefix_cookie_name
( Джерело )
-1
якщо cookie_name_whatever
встановлено (навіть якщо cookie_name не вказано). Версія регулярного виразу в іншій відповіді це вирішує.
УВАГА! обрана відповідь містить помилку (відповідь Жака).
якщо у вас є більше одного файлу cookie (дуже ймовірно ..), і файл cookie, який ви отримуєте, є першим у списку, він не встановлює змінну "кінець", і тому він поверне цілий рядок символів після "cookieName" = "всередині рядка document.cookie!
ось переглянута версія цієї функції:
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, '');
}
Якщо ви використовуєте jQuery, ви можете використовувати плагін jquery.cookie .
Отримання значення для певного файлу cookie виконується наступним чином:
$.cookie('MyCookie'); // Returns the cookie value
regexObject. test (String) швидший за рядок. збіг (RegExp).
Сайт MDN описує формат документа.cookie та має приклад регулярного виразу для захоплення файлу cookie ( document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");
). Виходячи з цього, я піду на таке:
/^(.*;)?\s*cookie1\s*=/.test(document.cookie);
Здається, запитання вимагає рішення, яке повертає значення false, коли файл cookie встановлений, але порожній. В такому разі:
/^(.*;)?\s*cookie1\s*=\s*[^;]/.test(document.cookie);
Тести
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)}}));
Це старе питання, але ось підхід, який я використовую ...
function getCookie(name) {
var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null;
}
Це повертається null
або тоді, коли файл cookie не існує, або коли він не містить запитуваного імені.
В іншому випадку повертається значення (запитуваного імені).
Печиво ніколи не повинно існувати без цінності - адже, чесно кажучи, який сенс у цьому? 😄
Якщо це більше не потрібно, найкраще просто позбутися від усього разом.
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;
}
Спробував функцію @jac, виникла проблема, ось як я відредагував його функцію.
замість змінної cookie ви просто використаєте 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);
});
Для тих, хто використовує Node, я знайшов приємне та просте рішення з імпортом ES6 та cookie
модулем!
Спочатку встановіть модуль cookie (і збережіть як залежність):
npm install --save cookie
Потім імпортуйте та використовуйте:
import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed)
console.log(parsed.cookie1);
використовуйте замість цього метод:
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
Тут є кілька хороших відповідей. Я ж вважаю за краще [1] НЕ з допомогою регулярних виразів, і [2] , використовуючи логіку, легко читати, і [3] , щоб мати коротку функцію, [4] нічого НЕ повертає істину , якщо ім'я є підрядок іншого печива ім'я. Нарешті [5], ми не можемо використовувати a для кожного циклу, оскільки повернення не порушує його.
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);
}
Щоб отримати об'єкт cookie, просто зателефонуйте getCookie()
Щоб перевірити, чи існує файл cookie, зробіть це так:
if (!getcookie('myCookie')) {
console.log('myCookie does not exist.');
} else {
console.log('myCookie value is ' + getcookie('myCookie'));
}
Або просто використовуйте тернарний оператор.
function hasCookie(cookieName){
return document.cookie.split(';')
.map(entry => entry.split('='))
.some(([name, value]) => (name.trim() === cookieName) && !!value);
}
Примітка: Автор хотів, щоб функція повертала false, якщо файл cookie порожній, тобто cookie=;
це досягається за && !!value
умови. Видаліть його, якщо вважаєте, що порожній файл cookie все ще є існуючим файлом cookie ...
var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
if(c.match(/cookie1=.+/))
console.log(true);
});
Зверніть увагу, що якщо файл cookie захищений, ви не можете перевірити його на стороні клієнта, використовуючи його document.cookie
(що використовують усі відповіді). Таке файли cookie можна перевірити лише на окремій стороні.
unescape
застаріле, чи існує якась різницяdecodeURIComponent
замість цього?