Какой хороший способ проверить, существует ли 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);
Используя Javascript:
function getCookie(name) {
let matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
));
return matches ? decodeURIComponent(matches[1]) : undefined;
}
вместо этого используйте этот метод:
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);
});
Обратите внимание, что если файл cookie безопасен, вы не можете проверить его существование на стороне клиента document.cookie
(что используется во всех ответах). Такой cookie можно проверить только на стороне сервера.
unescape
не рекомендуется использоватьdecodeURIComponent
вместо этого?