Bir çerez olup olmadığını kontrol etmenin iyi bir yolu nedir?
Koşullar:
Çerez varsa
cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;
Çerez mevcut değilse
cookie=;
//or
<blank>
Bir çerez olup olmadığını kontrol etmenin iyi bir yolu nedir?
Koşullar:
Çerez varsa
cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;
Çerez mevcut değilse
cookie=;
//or
<blank>
Yanıtlar:
İstediğiniz tanımlama bilgisinin adıyla getCookie işlevini çağırabilir, ardından = null olup olmadığını kontrol edebilirsiniz.
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
}
}
Alternatif bir jQuery olmayan sürüm oluşturdum:
document.cookie.match(/^(.*;)?\s*MyCookie\s*=\s*[^;]+(.*)?$/)
Yalnızca çerez varlığını test eder. Daha karmaşık bir sürüm de çerez değeri döndürebilir:
value_or_null = (document.cookie.match(/^(?:.*;)?\s*MyCookie\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]
Yerine çerez adınızı girin MyCookie
.
document.cookie.indexOf('cookie_name=');
Bu -1
çerez yoksa geri dönecektir .
ps Sadece dezavantajı (yorumlarda belirtildiği gibi), böyle bir isimde bir çerez seti varsa hata yapabilmesidir: any_prefix_cookie_name
( Kaynak )
-1
varsa cookie_name_whatever
ayarlanır (COOKIE_name olmasa bile). Başka bir cevaptaki normal ifade versiyonu bunu çözer.
DİKKAT! seçilen cevap bir hata içeriyor (Jac'ın cevabı).
Birden fazla çereziniz varsa (büyük olasılıkla ..) ve aldığınız çerez listede birinci ise, "son" değişkenini ayarlamaz ve bu nedenle "çerezAdı" nı izleyen tüm karakter dizisini döndürür. = "document.cookie dizesi içinde!
işte bu işlevin gözden geçirilmiş bir sürümü:
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 kullanıyorsanız, jquery.cookie eklentisini kullanabilirsiniz .
Belirli bir çerezin değerini almak şu şekilde yapılır:
$.cookie('MyCookie'); // Returns the cookie value
regexObject. test (String) dizeden daha hızlıdır . eşleşme (RegExp).
MDN sitesi document.cookie formatını açıklar ve (çerez kapmak için örnek bir normal ifade vardır document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");
). Buna dayanarak, bunun için giderdim:
/^(.*;)?\s*cookie1\s*=/.test(document.cookie);
Soru, çerez ayarlandığında ancak boş olduğunda yanlış döndüren bir çözüm istiyor gibi görünüyor. Bu durumda:
/^(.*;)?\s*cookie1\s*=\s*[^;]/.test(document.cookie);
Testler
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)}}));
Bu eski bir soru, ama işte benim kullandığım yaklaşım ...
function getCookie(name) {
var match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null;
}
Bu null
, çerez mevcut olmadığında veya istenen adı içermediğinde geri döner .
Aksi takdirde, (istenen adın) değeri döndürülür.
Bir çerez asla bir değeri olmadan var olmamalıdır - çünkü, doğrusu, bunun anlamı nedir? 😄
Artık gerekli değilse, en iyisi hepsinden kurtulmaktır.
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 işlevini denedim, biraz sorun yaşadım, işte işlevini nasıl düzenledim.
çerez değişkeni yerine sadece document.cookie.split kullanırsınız ...
var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
if(c.match(/cookie1=.+/))
console.log(true);
});
Node'u kullanan herkes için, ES6 ithalatı ve cookie
modülü ile güzel ve basit bir çözüm buldum !
Önce çerez modülünü kurun (ve bağımlılık olarak kaydedin):
npm install --save cookie
Ardından içe aktarın ve kullanın:
import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed)
console.log(parsed.cookie1);
bunun yerine bu yöntemi kullanın:
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
Burada birkaç iyi cevap var. Ben ancak tercih [1] normal bir ifade kullanarak değil, [2] okumak için basit mantık kullanarak ve [3] Bu kısa işlevi olması [4] gelmez değil adının başka çerez bir alt dize ise doğru döndürür isim. Son olarak [5] her döngü için a kullanamayız çünkü bir dönüş onu bozmaz.
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);
}
Bir çerez nesnesi almak için şu numarayı aramanız yeterlidir: getCookie()
Bir çerez olup olmadığını kontrol etmek için şunu yapın:
if (!getcookie('myCookie')) {
console.log('myCookie does not exist.');
} else {
console.log('myCookie value is ' + getcookie('myCookie'));
}
Veya sadece üçlü bir operatör kullanın.
function hasCookie(cookieName){
return document.cookie.split(';')
.map(entry => entry.split('='))
.some(([name, value]) => (name.trim() === cookieName) && !!value);
}
Not: Yazar, tanımlama bilgisi boşsa işlevin yanlış döndürmesini istemiştir, yani cookie=;
bu && !!value
koşulla sağlanır . Boş bir çerezin hala mevcut bir çerez olduğunu düşünüyorsanız onu kaldırın ...
var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
if(c.match(/cookie1=.+/))
console.log(true);
});
Bir çerez güvenliyse, kullanarak document.cookie
(tüm cevapların kullandığı) müşteri tarafında varlığını kontrol edemeyeceğinizi unutmayın . Bu tür çerezler yalnızca sunucu tarafında kontrol edilebilir.
unescape
kaldırıldığından,decodeURIComponent
bunun yerine kullanımında herhangi bir fark var mı?