PDA

View Full Version : راهنمایی برای درک بهتر کد زیر ( کوکی ها )



soonami
دوشنبه 22 آبان 1391, 00:09 صبح
سلام دوستان کد زیر از سایت W3schools است بخش کوکی من از سایت های دیگر کوکی یاد گرفتم ولی نمیدونم چرا ....

اگر ممکن است کلا توضیح بدهید ممنون میشم توی این بخش مشکل دارم






function getCookie(c_name)
{
var i,x,y,ARRcookies=document.cookie.split(";");
for (i=0;i<ARRcookies.length;i++)
{
x=ARRcookies[i].substr(0,ARRcookies[i].indexOf("="));
y=ARRcookies[i].substr(ARRcookies[i].indexOf("=")+1);
x=x.replace(/^\s+|\s+$/g,"");
if (x==c_name)
{
return unescape(y);
}
}
}


وکد زیر برای set کردن است


function setCookie(c_name,value,exdays)
{
var exdate=new Date();
exdate.setDate(exdate.getDate() + exdays);
var c_value=escape(value) + ((exdays==null) ? "" : "; expires="+exdate.toUTCString());
document.cookie=c_name + "=" + c_value;
}

hakan648
سه شنبه 23 آبان 1391, 20:10 عصر
سلام

در کد اول
خط 3 : متغییرهای i,x,y,ARRcookies تعریف شده اند که در متغییر ARRcookies کوکی های آدرس فعلی (بصورت آرایه) قرار داده می شود.
خط 4 : یک حلقه که به تعداد عناصر آرایه ی ARRcookies چرخ می زند
خط 6 : در اولین عنصر آرایه ( اولین کوکی ) ، مقدار قبل از "=" در متغییر x قرار داده می شود ( نام کوکی )
خط 7 : در اولین عنصر آرایه ، مقدار بعد از "=" در متغییر y قرار داده می شود ( مقدار کوکی )
خط 8 : فضای خالی اول و آخر نام کوکی ( متغییر x ) حذف می شود
خط 9 : اگر نام کوکی ( ورودی تابع ) برابر با متغییر x بود ، مقدار کوکی ( متغییر y ) بصورت decode شده بازگشت داده می شود و اجرای دستورات به پایان می رسد
* اگر هیچ مقداری در شرط قبل یافت نشود ، مقدار undefined مقدار بازگشی از این تابع خواهد بود

در کد دوم
خط 3 : تاریخ فعلی سیستم در متغییر exdate ذخیره می شود
خط 4 : تاریخ موجود در متغییر exdate به اندازه ی exdays به جلو تنظیم می شود
خط 5 : مقدار encode شده ی متغییر value با ( اگر exdays نال بود ، "" و اگر نال نبود ، جمع رشته ی "; expires=" با مقدار exdate در فرمت UTC ) جمع می شود و در متغییر c_value قرار داده می شود
خط 6 : مقدار متغییر c_name با "=" با c_name جمع می شود و به عنوان یک کوکی به عنوان کوکیِ آدرس فعلی اضافه می شود



کد فوق زیاد صحیح و کامل نیست.

بهتر هست از این کلاس (https://developer.mozilla.org/en-US/docs/DOM/document.cookie) استفاده کنید :


var allCookies = {
getItem: function (sKey) {
if (!sKey || !this.hasItem(sKey)) { return null; }
return unescape(document.cookie.replace(new RegExp("(?:^|.*;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*"), "$1"));
},
setItem: function (sKey, sValue, vEnd, sPath, sDomain, bSecure) {
if (!sKey || /^(?:expires|max\-age|path|domain|secure)$/i.test(sKey)) { return; }
var sExpires = "";
if (vEnd) {
switch (vEnd.constructor) {
case Number:
sExpires = vEnd === Infinity ? "; expires=Tue, 19 Jan 2038 03:14:07 GMT" : "; max-age=" + vEnd;
break;
case String:
sExpires = "; expires=" + vEnd;
break;
case Date:
sExpires = "; expires=" + vEnd.toGMTString();
break;
}
}
document.cookie = escape(sKey) + "=" + escape(sValue) + sExpires + (sDomain ? "; domain=" + sDomain : "") + (sPath ? "; path=" + sPath : "") + (bSecure ? "; secure" : "");
},
removeItem: function (sKey, sPath) {
if (!sKey || !this.hasItem(sKey)) { return; }
document.cookie = escape(sKey) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT" + (sPath ? "; path=" + sPath : "");
},
hasItem: function (sKey) {
return (new RegExp("(?:^|;\\s*)" + escape(sKey).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(document.cookie);
},
keys: /* optional method: you can safely remove it! */ function () {
var aKeys = document.cookie.replace(/((?:^|\s*;)[^\=]+)(?=;|$)|^\s*|\s*(?:\=[^;]*)?(?:\1|$)/g, "").split(/\s*(?:\=[^;]*)?;\s*/);
for (var nIdx = 0; nIdx < aKeys.length; nIdx++) { aKeys[nIdx] = unescape(aKeys[nIdx]); }
return aKeys;
}
};