Какой хороший способ проверить, существует ли 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, который вы извлекаете, является первым в списке, он не устанавливает переменную "end" и, следовательно, возвращает всю строку символов после "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) быстрее, чем string.совпадение (RegExp).
На сайте MDN описан формат для document.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 не существует, либо если он не содержит запрошенного имени.
В противном случае возвращается значение (запрошенного имени).
Файл 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 все еще существует…
var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
if(c.match(/cookie1=.+/))
console.log(true);
});
unescape
не рекомендуется использоватьdecodeURIComponent
вместо этого?