Cookieが存在するかどうかを確認する良い方法は何ですか?
条件:
Cookieが存在する場合
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]
MyCookie
の代わりにCookie名を入れます。
document.cookie.indexOf('cookie_name=');
そのCookieが存在しない場合、-1
を返します。
追伸唯一の欠点は、(コメントに記載されているように)any_prefix_cookie_name
という名前のCookieが設定されていると間違えることです。
( ソース )
注意!選択した回答にはバグが含まれています(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 plugin を使用できます。
特定のCookieの値を取得するには、次のようにします。
$.cookie('MyCookie'); // Returns the cookie value
regexObject . test (String)は faster stringよりも大きいです。 match (RegExp)。
MDNサイト はdocument.cookieの形式を説明し、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 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 match = document.cookie.match(RegExp('(?:^|;\\s*)' + name + '=([^;]*)')); return match ? match[1] : null;
}
これは、Cookieが存在しない場合、または要求された名前が含まれていない場合にnull
を返します。
それ以外の場合、(要求された名前の)値が返されます。
Cookieは値なしでは決して存在するべきではありません-公正に言えば、その意味は何ですか? ????
不要になった場合は、まとめて削除するのが最善です。
function deleteCookie(name) {
document.cookie = name +"=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;";
}
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);
});
代わりにこのメソッドを使用してください。
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
}
}
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);