अगर कुकी मौजूद है तो मैं कैसे जांच करूं?


84

अगर कुकी मौजूद है तो जांचने का एक अच्छा तरीका क्या है?

शर्तेँ:

कुकी मौजूद है अगर

cookie1=;cookie1=345534;
//or
cookie1=345534;cookie1=;
//or
cookie1=345534;

कुकी मौजूद नहीं है अगर

cookie=;
//or
<blank>

जवाबों:


127

आप फ़ंक्शन को कुकी जिसे आप चाहते हैं, के नाम के साथ कॉल कर सकते हैं, फिर यह देखने के लिए जांचें कि क्या यह = 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
    }
}

3
जब unescapeसे पदावनत किया गया है, क्या decodeURIComponentइसके बजाय उपयोग करने में कोई अंतर है ?
the_nuts

3
@the_nuts, अच्छा कैच। मुझे इसकी जानकारी नहीं थी। W3cschools के अनुसार decodeURI (), या डिकोड्यूरिकोम्पोनेंट का उपयोग अनस्केप करने के लिए किया जा सकता है। किस विकल्प का उपयोग करना है जो संग्रहित किया जा रहा है, इसके लिए नीचे आ सकता हूं, मैंने डिकोड्यूरी को चुना क्योंकि मुझे कुकी में विभाजक वर्ण होने की उम्मीद नहीं है। पूरा संदर्भ: w3schools.com/jsref/jsref_decodeuri.asp
jac

3
यह पहली कुकी के साथ काम नहीं करता है क्योंकि परिवर्तनीय अंत सेट नहीं किया जाता है
बजे

फ़ंक्शन doSomething ($ नाम) {var myCookie = getCookie ($ नाम);
सोल

1
यह एक आदर्श उदाहरण है कि w3schools एक विश्वसनीय स्रोत क्यों नहीं है और आपको इसके उत्तरों की नकल / पेस्ट क्यों नहीं करना चाहिए। आपने == और! = का उपयोग करने से परहेज किया होगा जो कि js में काफी प्रसिद्ध है।
आइजैक पाक

96

मैंने एक वैकल्पिक गैर- jQuery संस्करण तैयार किया है:

document.cookie.match(/^(.*;)?\s*MyCookie\s*=\s*[^;]+(.*)?$/)

यह केवल कुकी अस्तित्व के लिए परीक्षण करता है। एक अधिक जटिल संस्करण कुकी मान भी लौटा सकता है:

value_or_null = (document.cookie.match(/^(?:.*;)?\s*MyCookie\s*=\s*([^;]+)(?:.*)?$/)||[,null])[1]

के स्थान पर अपना कुकी नाम रखें MyCookie


14
अद्भुत स्वच्छ समाधान! लोग प्लगइन्स को इन दिनों बहुत जल्दी पकड़ लेते हैं ... बहुत अधिक ओवरहेड। यह एक बहुत अच्छा समाधान है!
पैट्रिक

3
यह काम नहीं करता है। Regex को एक स्थान याद आ रहा है। यह document.cookie.match (/^(.*?) होना चाहिए? MyCookie = [^?] + *। *)? $ /), बाद में अंतरिक्ष को नोटिस करें।
बोगदान एम।

1
document.cookie ने रिक्त स्थान के आधार पर कुकीज़ को अलग किया, अर्थात: कुकी 1 =; cookie1 = 345,534;
बोगदान एम।

1
@BogdanM। : पहले कुकी के लिए सफेद स्थान नहीं है! / [] {0,1} / ऊपर मेरी टिप्पणी देखें
गेब्रियल

6
यदि आप एक वैरिएबल का उपयोग करना चाहते हैं: नया RegExp ("^ (?? *?)? \\ s *" + कुकीनाम + "\\ s * = \\ s * ([^?] +) (?) ?:। *)? $ ")
josef

34
document.cookie.indexOf('cookie_name=');

-1यदि कुकी मौजूद नहीं है तो यह वापस आ जाएगी ।

ps इसका केवल दोष यह है (जैसा कि टिप्पणियों में उल्लेख किया गया है) कि इस तरह के नाम के साथ कुकी सेट होने पर गलती होगी: any_prefix_cookie_name

( स्रोत )


5
यह उनके नाम पर स्ट्रिंग के साथ किसी भी कुकीज़ से मेल खाता है। उदाहरण के लिए -1यदि cookie_name_whateverसेट किया जाता है (भले ही कुकी_नाम नहीं है) के अलावा कुछ और उदाहरण देता है । अन्य उत्तर में रेगेक्स संस्करण हल करता है।
हजामी

4
जबकि 100% सटीक नहीं है, यह ज्यादातर मामलों में एक अच्छा पर्याप्त समाधान है। इसके लिए धन्यवाद - मैं एक बड़े फ़ंक्शन की तुलना में इसे उपयोग करने में बहुत अधिक आरामदायक महसूस करता हूं, या अन्य समाधानों से जटिल रीएक्सएक्सपी।
एन पर शेन एन

14

ध्यान! चुने हुए उत्तर में एक बग (जैक का उत्तर) होता है।

यदि आपके पास एक से अधिक कुकी हैं (बहुत संभावना है ..) और जिस कुकी को आप प्राप्त कर रहे हैं, वह सूची में पहली है, यह चर "अंत" को सेट नहीं करता है और इसलिए यह "कुकीनाम" का अनुसरण करते हुए वर्णों की पूरी स्ट्रिंग लौटाएगा। = "document.cookie string के भीतर!

यहाँ उस फ़ंक्शन का एक संशोधित संस्करण है:

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, ''); 
}

केवल एक कुकी सेट के साथ, आपका फ़ंक्शन "कुकी नाम =" वापस आ गया। : - /
जेपी

1
@Jeppe मैंने काम करने के लिए कोड को संशोधित किया है जब केवल एक कुकी भी है। मैंने वास्तव में पूरे समारोह को फिर से शुरू करने और इसे साफ करने का मौका लिया है, साथ ही साथ कुछ टिप्पणियां भी जोड़ दी हैं। ;)
पिकको जूल 20'18

प्रतिस्थापन (/ "/ g, '') के साथ कुछ गड़बड़ है; यह मुझे वाक्यविन्यास त्रुटि देता है
iKamy

इसने मेरे लिए काम किया लेकिन शायद रेगे में उद्धरणों से बचना बेहतर है। मैंने उत्तर संपादित किया है। अब आपके लिए भी काम करना चाहिए!
पिकको

6

यदि आप jQuery का उपयोग कर रहे हैं, तो आप jquery.cookie प्लगइन का उपयोग कर सकते हैं ।

एक विशेष कुकी के लिए मूल्य प्राप्त करना निम्नानुसार किया जाता है:

$.cookie('MyCookie'); // Returns the cookie value

3
यह भी मानता है कि ओपी jquery- कुकी प्लगइन का उपयोग कर रहा है। यह मुझे थोड़ी देर के लिए एक पाश के लिए फेंक दिया था क्योंकि मैं jquery का उपयोग कर रहा था लेकिन उस कार्य के लिए उस प्लगइन का उपयोग नहीं कर सकता जो मैं हल कर रहा था।
हिप्पीले १६'१३

8
यह न केवल jquery के लिए विशिष्ट है, बल्कि एक jquery प्लगइन की भी आवश्यकता है, जिसे आपने अपने उत्तर में संदर्भित नहीं किया है
artfulhacker

4

regexObject। परीक्षण (स्ट्रिंग) स्ट्रिंग की तुलना में तेज है। मैच (RegExp)।

MDN साइट document.cookie के लिए प्रारूप का वर्णन करता है, और एक कुकी हड़पने के लिए (एक उदाहरण regex है document.cookie.replace(/(?:(?:^|.*;\s*)test2\s*\=\s*([^;]*).*$)|^.*$/, "$1");)। उसके आधार पर, मैं इसके लिए जाऊंगा:

/^(.*;)?\s*cookie1\s*=/.test(document.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)}}));

परीक्षण के परिणाम (क्रोम 55.0.2883.87)


मैं कुकी के रूप में स्ट्रिंग के रूप में पास करने के बजाय कुकी के रूप में एक चर कैसे पारित कर सकता हूं?
दिलीप थॉमस

var नाम = 'कुकी 1'; नया RegExp ('^ (। *?); \\ s *' + नाम + '\\ s * =')। परीक्षण (document.cookie);
hajamie

4

यह एक पुराना सवाल है, लेकिन यहाँ मैं उपयोग कर रहा हूँ ...

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;";
}

मूल्य के बिना कुकी होने का एक पूरी तरह से वैध कारण है, जो किसी चीज़ के अस्तित्व को इंगित करना है। यह बूलियन की तरह इस्तेमाल किया जाएगा: कुकी मौजूद है => सच है, कुकी मौजूद नहीं है => झूठी
गस

2
यह सूची में सबसे अच्छा तरीका था।
एंड्रयू

1
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;
} 

@ फंक्शन की कोशिश की, कुछ परेशानी हुई, यहाँ मैंने उनके फंक्शन को कैसे संपादित किया।


1

कुकी चर के बजाय आप सिर्फ 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);
});


1

नोड का उपयोग करने वाले किसी के लिए, मुझे ईएस 6 आयात और cookieमॉड्यूल के साथ एक अच्छा और सरल समाधान मिला !

सबसे पहले कुकी मॉड्यूल स्थापित करें (और निर्भरता के रूप में सहेजें):

npm install --save cookie

फिर आयात और उपयोग करें:

import cookie from 'cookie';
let parsed = cookie.parse(document.cookie);
if('cookie1' in parsed) 
    console.log(parsed.cookie1);

1

जावास्क्रिप्ट का उपयोग करना:

 function getCookie(name) {
      let matches = document.cookie.match(new RegExp(
        "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
      ));
      return matches ? decodeURIComponent(matches[1]) : undefined;
    }

0

इस विधि का उपयोग करें:

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
    }
}

0
/// ************************************************ 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

0

यहाँ कई अच्छे उत्तर हैं। मैं फिर भी पसंद करते हैं [1] के लिए रेगुलर एक्सप्रेशन का उपयोग नहीं है, और [2] तर्क यह है कि पढ़ने के लिए आसान है का उपयोग कर, और [3] एक छोटी समारोह है कि करने के लिए [4] करता है नहीं करता है, तो नाम एक और कुकी की सबस्ट्रिंग है लौटने सच नाम। अंत में [५] हम प्रत्येक लूप के लिए उपयोग नहीं कर सकते हैं क्योंकि एक वापसी इसे नहीं तोड़ती है।

function cookieExists(name) {
  var cks = document.cookie.split(';');
  for(i = 0; i < cks.length; i++)
    if (cks[i].split('=')[0].trim() == name) return true;
}

0
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'));
}

या बस एक टर्नरी ऑपरेटर का उपयोग करें।


0
function hasCookie(cookieName){
return document.cookie.split(';')
.map(entry => entry.split('='))
.some(([name, value]) => (name.trim() === cookieName) && !!value);
}

नोट: लेखक यह चाहता था कि कुकी के खाली होने पर फंक्शन वापस आ जाए अर्थात cookie=;यह && !!valueशर्त के साथ प्राप्त किया जाता है । इसे हटा दें अगर आपको लगता है कि एक खाली कुकी अभी भी एक मौजूदा कुकी है ...


0

var cookie = 'cookie1=s; cookie1=; cookie2=test';
var cookies = cookie.split('; ');
cookies.forEach(function(c){
  if(c.match(/cookie1=.+/))
   console.log(true);
});


नमस्कार और एसओ में आपका स्वागत है! हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन समस्या को हल करने के तरीके के बारे में अतिरिक्त संदर्भ प्रदान करता है और यह समस्या को हल करता है ताकि उत्तर के दीर्घकालिक मूल्य में सुधार हो सके। कृपया दौरा पढ़ें , और मैं एक अच्छा उत्तर कैसे लिखूं?
तोमर शतह

0

ध्यान दें कि अगर कोई कुकी सुरक्षित है, तो आप ग्राहक के पक्ष में उसके अस्तित्व के लिए जाँच नहीं कर सकते हैं document.cookie(जो सभी उत्तरों का उपयोग कर रहे हैं)। इस तरह के कुकी को केवल गंभीर तरफ ही जांचा जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.