Javascript: Cookies Subkeys
Hi,
Has anyone written or know of any scripts extending the javascript cookie collection to handle asp and asp.net cookie subkeys
e.g. in classic ASP -
vb Code:
<%
' Set Vals -
' syntax: Response.Cookies(NameofCookie)(NameofSubKey)=value
Response.Cookies("PersonalDetails")("FirstName")="Michael"
Response.Cookies("PersonalDetails")("SurName")="Wall"
Response.Cookies("PersonalDetails")("CountryofBirth")="Ireland"
' Retrieve Vals -
' syntax: Request.Cookies(NameofCookie)(NameofSubKey)
Response.write Request.Cookies("PersonalDetails")("FirstName") & "<br>"
Response.write Request.Cookies("PersonalDetails")("SurName") & "<br>"
Response.write Request.Cookies("PersonalDetails")("CountryofBirth") & "<br>"
%>
I'm pretty sure this can be done but don't want to spend hours reinventing the wheel
Cheers Al
Re: Javascript: Cookies Subkeys
Hi,
This is what I have so far, anyone got any thoughts or ideas on how to improve it?
Code:
<html>
<head>
<script type="text/javascript">
function hSetCookie(name,value,expires){var cookie_string=name+"="+escape(value);if(expires){expires=new Date(expires);cookie_string+=";expires="+expires.toGMTString();}document.cookie=cookie_string+";path=/";}
function hGetCookie(cookie_name){var regexp=new RegExp(cookie_name +"=(.*?)(;|$)","i");var results=regexp.exec(document.cookie);if(results){return(unescape(results[1]));}else{return null;}}
function hasSubKeys(cookieName){var ret=false;var cookie=unescape(hGetCookie(cookieName));var subKeys=cookie.split("&");if(subKeys.length>=2){ret=true;}else{var subKeys=cookie.split("=");if(subKeys.length>=1){ret=true;}}return ret;}
function DelCookie(cookie_name){var cookie_date=new Date();cookie_date.setTime(cookie_date.getTime()-1);document.cookie=cookie_name+="=;expires="+cookie_date.toGMTString()+";path=/";}
function GetCookie(cookieName,keyName){
var ret;
var cookie=unescape(hGetCookie(cookieName));
//alert(cookie);
if(keyName && hasSubKeys(cookieName)==true){
var cookieData=getCookieData(cookie);
ret=cookieData[keyName];
}else{
ret=cookie;
}
return ret
}
function SetCookie(cookieName,keyName,value,expires){
var thisCookie=unescape(hGetCookie(cookieName));
if(thisCookie){
if(keyName){
//alert(keyName);
var cookieData=getCookieData(thisCookie);
cookieData[keyName]=value;
value="";
for (var cookie in cookieData){
value +=cookie+"="+cookieData[cookie]+"&";
}
if(value.charAt(value.length-1)=="&"){value=value.substring(0,value.length-1)}
}
}
//alert(cookieName+"\n"+value);
hSetCookie(cookieName,value,expires);
}
function getCookieData(cookie){
var ret=[];
var subKeys=cookie.split("&");
for (var i=0;i<subKeys.length;i++){
//alert(subKeys[i]);
var pos=subKeys[i].indexOf("=");
if(pos!=0){
//alert("cookieData["+subKeys[i].substring(0,pos)+']='+subKeys[i].substring(pos+1));
ret[subKeys[i].substring(0,pos)]=subKeys[i].substring(pos+1);
}
}
return ret;
}
</script>
</head>
<body>
<p>Usage: case is important with the cookie and subkey names</p>
<script type="text/javascript">
var udets=GetCookie("UserDetails");
if(!udets||udets==null||udets=='null'){
var cdata="ID=1&UserName=brucebanner&CountryCode=USA&Title=&LastName=Banner&SecLevel=1&FirstName=Bruce&FullName=Mr Bruce Banner&[email protected]";
//alert("cdata: "+cdata);
SetCookie("UserDetails","",cdata);
document.write("<p>I've set up the subkey cookie<\/p>");
}
if(!GetCookie("UserName")){
SetCookie("UserName","","jack.spratt");
document.write("<p>I've set up a basic username cookie<\/p>");
}
document.write("<p>Entire Cookie Collection:"+document.cookie.replace(/; /g,"<br>")+"<?\/p>");
document.write("<p>Entire subkey cookie: "+GetCookie("UserDetails")+"<\/p>");
document.write("<h2>Get a regular cookie<\/h2>");
document.write("<p>username: "+GetCookie("username")+"<\/p>");
document.write("<h2><u>Get<\/u> Cookies and subkeys<\/h2>");
document.write("<p>Title: "+GetCookie("UserDetails","Title")+"<br>");
document.write("LastName: "+GetCookie("UserDetails","LastName")+"<br>");
document.write("FullName: "+GetCookie("UserDetails","FullName")+"<\/p>");
document.write("<h2><u>Set<\/u> Cookies and subkeys<\/h2>");
SetCookie("UserDetails","FullName","Mr B Banner");
document.write("<p>I've changed the subkey fullname<\/p>");
document.write("<br><a href=\"javascript:DelCookie('UserDetails');document.location.reload();\">reset cookie (\"UserDetails\")!</a>");
</script>
</body>
</html>
Re: Javascript: Cookies Subkeys
Hi - I just came across your post while struggling with the same issue, so thanks.
I did have one problem, however. If a cookie has a subkey with one element in it, then the subkey isn't parsed to get it's value. Instead, the entire subkey is returned.
I have a condition where subkeys are added as a user makes selections throughout a website, so I modified your hasSubKeys function to pickup an occurance of the initial condition where my subkey has one element:
function hasSubKeys(cookieName){
var ret=false;
var cookie=unescape(hGetCookie(cookieName));
var subKeys=cookie.split("&");
if(subKeys.length>=2){
ret=true;
}
var subKeys=cookie.split("=");
if(subKeys.length>=1){
ret=true;
}
return ret;
}
Thanks for your post - it saved me lots of time.
Re: Javascript: Cookies Subkeys
Sretlaw,
Thanks, I've tweaked your second check a bit so that it doesn't run unnecessarily
Code:
function hasSubKeys(cookieName){
var ret=false;
var cookie=unescape(hGetCookie(cookieName));
var subKeys=cookie.split("&");
if(subKeys.length>=2){
ret=true;
}else{
var subKeys=cookie.split("=");
if(subKeys.length>=1){
ret=true;
}
}
return ret;
}