쿠키가 있는지 확인하는 좋은 방법은 무엇입니까?
정황:
쿠키가있는 경우
cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;
다음과 같은 경우 쿠키가 존재하지 않습니다.
cookie=;
//or
<blank>
답변:
원하는 쿠키 이름으로 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*[^;]+(.*)?$/)
쿠키 존재 여부 만 테스트합니다. 더 복잡한 버전은 쿠키 값을 반환 할 수도 있습니다.
value_or_null = (document.cookie.match(/^(?:.*;)?\s*MyCookie\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]
대신 쿠키 이름을 넣으십시오 MyCookie
.
document.cookie.indexOf('cookie_name=');
-1
해당 쿠키가 없으면 반환 됩니다.
추신 그것의 유일한 단점은 (주석에서 언급했듯이) 그러한 이름으로 설정된 쿠키가 있으면 실수 할 것이라는 것입니다. any_prefix_cookie_name
( 출처 )
-1
if cookie_name_whatever
가 설정된 것 이외의 것을 반환합니다 (cookie_name이 아닌 경우에도). 다른 답변의 정규식 버전이이를 해결합니다.
주의! 선택한 답변에 버그가 있습니다 (Jac의 답변).
쿠키가 두 개 이상이고 (아마도 ..) 검색중인 쿠키가 목록의 첫 번째 쿠키 인 경우 변수 "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('MyCookie'); // Returns the cookie value
regexObject. test (String)는 string보다 빠릅니다 . 일치 (RegExp).
MDN 사이트 document.cookie를위한 포맷을 설명하고, (a 쿠키 잡아 예 정규식을 갖는다 document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");
). 이를 바탕으로 나는 이것을 할 것입니다.
/^(.*;)?\s*cookie1\s*=/.test(document.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
쿠키가 존재하지 않거나 요청 된 이름이 포함되지 않은 경우 반환 됩니다.
그렇지 않으면 요청 된 이름의 값이 반환됩니다.
쿠키는 가치없이 절대 존재해서는 안됩니다. 왜냐하면 공정하게 말해서 그 이유는 무엇일까요? 😄
더 이상 필요하지 않으면 모두 함께 제거하는 것이 가장 좋습니다.
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] 이름이 다른 쿠키의 하위 문자열 인 경우 [4] 가 true를 반환 하지 않는 짧은 함수를 갖는 것을 선호합니다 . 이름. 마지막으로 [5] 우리는 리턴이 그것을 깨지 않기 때문에 for each 루프를 사용할 수 없습니다.
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);
}
쿠키 개체를 얻으려면 간단히 getCookie()
쿠키가 있는지 확인하려면 다음과 같이하십시오.
if (!getcookie('myCookie')) {
console.log('myCookie does not exist.');
} else {
console.log('myCookie value is ' + getcookie('myCookie'));
}
또는 삼항 연산자를 사용하십시오.
var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
if(c.match(/cookie1=.+/))
console.log(true);
});
unescape
사용되지 않으며, 사용하는 차이가decodeURIComponent
대신은?