मान्यताओं
प्रश्न के आधार पर, मेरा मानना है कि इस समारोह के लिए कुछ धारणाएं / आवश्यकताएं शामिल हैं:
- यह एक पुस्तकालय समारोह के रूप में इस्तेमाल किया जाएगा , और इसलिए किसी भी कोडबेस में गिरा दिया जाना चाहिए;
- जैसे, इसे कई अलग-अलग वातावरणों में काम करने की आवश्यकता होगी , अर्थात विरासत जेएस कोड, गुणवत्ता के विभिन्न स्तरों आदि के सीएमएस;
- अन्य लोगों द्वारा लिखे गए कोड और / या जिस कोड को आप नियंत्रित नहीं करते हैं, उसके साथ अंतर-संचालित करने के लिए, फ़ंक्शन को कुकी के नाम या मूल्यों को एन्कोडेड करने पर कोई अनुमान नहीं लगाना चाहिए । एक स्ट्रिंग के साथ फ़ंक्शन को कॉल करके
"foo:bar[0]"
एक कुकी (शाब्दिक रूप से) का नाम "फू: बार [0]" वापस करना चाहिए;
- नए कुकी पृष्ठ के जीवनकाल के दौरान किसी भी बिंदु पर संशोधित और / या मौजूदा कुकीज़ को लिखा जा सकता है ।
इन मान्यताओं के तहत, यह स्पष्ट है कि encodeURIComponent
/ का decodeURIComponent
उपयोग नहीं किया जाना चाहिए ; ऐसा करने पर यह माना जाता है कि कुकी को सेट करने वाले कोड ने इन कार्यों का उपयोग करके इसे इनकोड भी किया।
यदि कुकी नाम में विशेष वर्ण हो सकते हैं, तो नियमित अभिव्यक्ति दृष्टिकोण समस्याग्रस्त हो जाता है। कुकी को संग्रहीत करते समय कुकी नाम (वास्तव में नाम और मूल्य दोनों) एन्कोडिंग द्वारा jQuery.cookie इस मुद्दे के आसपास काम करता है, और कुकी को पुनर्प्राप्त करते समय नाम को डिकोड करता है। एक नियमित अभिव्यक्ति समाधान नीचे है।
जब तक आप केवल उन कुकीज़document.cookie
को नहीं पढ़ रहे हैं जिन्हें आप पूरी तरह से नियंत्रित करते हैं, तो सीधे कुकीज़ को पढ़ना उचित होगा और परिणामों को कैश नहीं करना चाहिए, क्योंकि यह जानने का कोई तरीका नहीं है कि कैश बिना पढ़े अमान्य है या नहींdocument.cookie
फिर से ।
(जबकि एक्सेस और पार्सिंग document.cookies
कैश का उपयोग करने की तुलना में थोड़ा धीमा होगा, यह डोम के अन्य हिस्सों को पढ़ने के रूप में धीमा नहीं होगा, क्योंकि कुकीज़ डोम / रेंडर पेड़ों में भूमिका नहीं निभाते हैं।)
लूप-आधारित फ़ंक्शन
पीपीके के (लूप-आधारित) फ़ंक्शन के आधार पर यहां कोड गोल्फ उत्तर दिया गया है:
function readCookie(name) {
name += '=';
for (var ca = document.cookie.split(/;\s*/), i = ca.length - 1; i >= 0; i--)
if (!ca[i].indexOf(name))
return ca[i].replace(name, '');
}
जो कि जब छोटा किया जाता है, तो 128 अक्षर आते हैं (फ़ंक्शन नाम की गिनती नहीं):
function readCookie(n){n+='=';for(var a=document.cookie.split(/;\s*/),i=a.length-1;i>=0;i--)if(!a[i].indexOf(n))return a[i].replace(n,'');}
नियमित अभिव्यक्ति-आधारित कार्य
अद्यतन: यदि आप वास्तव में एक नियमित अभिव्यक्ति समाधान चाहते हैं:
function readCookie(name) {
return (name = new RegExp('(?:^|;\\s*)' + ('' + name).replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&') + '=([^;]*)').exec(document.cookie)) && name[1];
}
यह RegExp ऑब्जेक्ट के निर्माण से पहले कुकी नाम के किसी भी विशेष वर्ण से बच जाता है । न्यूनतम, यह 134 वर्णों तक आता है (फ़ंक्शन नाम की गिनती नहीं):
function readCookie(n){return(n=new RegExp('(?:^|;\\s*)'+(''+n).replace(/[-[\]{}()*+?.,\\^$|#\s]/g,'\\$&')+'=([^;]*)').exec(document.cookie))&&n[1];}
जैसा कि रूडू और कॉव्स ने टिप्पणियों में बताया है, नियमित-अभिव्यक्ति-बचने वाले रेगेक्स को कुछ पात्रों द्वारा छोटा किया जा सकता है। मुझे लगता है कि बचने वाले रेगेक्स को सुसंगत रखना अच्छा होगा (आप इसे कहीं और इस्तेमाल कर रहे होंगे), लेकिन उनके सुझाव विचार करने लायक हैं।
टिप्पणियाँ
ये दोनों फ़ंक्शन संभाल नहीं पाएंगे , null
या undefined
यदि कोई "null" नाम का कुकी है, readCookie(null)
तो उसका मूल्य वापस कर देगा। यदि आपको इस मामले को संभालने की आवश्यकता है, तो तदनुसार कोड को अनुकूलित करें।