Results 1 to 4 of 4

Thread: Javascript: Cookies Subkeys

  1. #1

    Thread Starter
    Fanatic Member aconybeare's Avatar
    Join Date
    Oct 2001
    Location
    UK
    Posts
    772

    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:
    1. <%
    2. ' Set Vals -
    3. ' syntax: Response.Cookies(NameofCookie)(NameofSubKey)=value
    4. Response.Cookies("PersonalDetails")("FirstName")="Michael"
    5. Response.Cookies("PersonalDetails")("SurName")="Wall"
    6. Response.Cookies("PersonalDetails")("CountryofBirth")="Ireland"
    7.  
    8. ' Retrieve Vals -
    9. ' syntax: Request.Cookies(NameofCookie)(NameofSubKey)
    10. Response.write Request.Cookies("PersonalDetails")("FirstName") & "<br>"
    11. Response.write Request.Cookies("PersonalDetails")("SurName") & "<br>"
    12. Response.write Request.Cookies("PersonalDetails")("CountryofBirth") & "<br>"
    13. %>

    I'm pretty sure this can be done but don't want to spend hours reinventing the wheel

    Cheers Al

  2. #2

    Thread Starter
    Fanatic Member aconybeare's Avatar
    Join Date
    Oct 2001
    Location
    UK
    Posts
    772

    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>
    Last edited by aconybeare; Feb 22nd, 2008 at 04:10 AM. Reason: Added in Sretlaw's extra check to the hasSubkeys function

  3. #3
    New Member
    Join Date
    Feb 2008
    Posts
    1

    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.

  4. #4

    Thread Starter
    Fanatic Member aconybeare's Avatar
    Join Date
    Oct 2001
    Location
    UK
    Posts
    772

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

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width