クッキーが存在するかどうかを確認する良い方法は何ですか?
条件:
クッキーが存在する場合
cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;
次の場合、Cookieは存在しません
cookie=;
//or
<blank>
回答:
必要なCookieの名前を使用して関数getCookieを呼び出し、それが= 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それの唯一の欠点は(コメントで述べられているように)そのような名前で設定されたクッキーがあると間違いを犯すことです: any_prefix_cookie_name
(出典)
-1
、cookie_name_whatever
が設定されている場合以外のものが返されます(cookie_nameが設定されていない場合でも)。別の回答の正規表現バージョンはそれを解決します。
注意!選択した回答にはバグが含まれています(Jacの回答)。
複数の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のフォーマットを説明し、(クッキーを取得するための例示的な正規表現を有していますdocument.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");
)。それに基づいて、私はこれに行きます:
/^(.*;)?\s*cookie1\s*=/.test(document.cookie);
質問は、Cookieが設定されているが空の場合にfalseを返す解決策を求めているようです。その場合:
/^(.*;)?\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関数を試しましたが、問題が発生しました。これが彼の関数の編集方法です。
代わりにこの方法を使用してください。
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]名前が別のCookieの部分文字列である場合に[4]がtrueを返さない短い関数を使用することをお勧めします。名前 。最後に[5] returnはループを壊さないので、foreachループを使用することはできません。
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'));
}
または、三項演算子を使用します。
unescape
廃止されました、使用して任意の違いがあるdecodeURIComponent
代わりには?