I am working on a project and need URL param-parsing, as I usually do.
But this time I decided to try something new - based on ColdFusion
syntax that I have used for ages.

ColdFusion creates a system-level hash structure named "URL" that
contains all the URL params. This is very convenient, so I created a
jQuery extension to do the same thing. It creates and populates a
"$.url" hash on-load. This is a static var similar to $.browser.

The $.url object does the *opposite* of the $.serialize method:
$.serialize converts complex data TO an URL format, while $.url
creates a data object FROM the URL params.

My initial version was very small - only a few bytes of code is needed
to parse simple parameters. This would address the basic needs of most
users. So I think this *at a minimum* would be a valuable addition to
the jQuery core. The code is very small, creates no conflicts, and
takes barely 1ms.

After I created the basic method, I added more elaborate parsing to
store numbers and booleans in their proper format, and to allow
'complex data' to be passed - ie, arrays and hashes:

page.html?actors=[Eastwood,Bronson,Heston]
page.html?actor={first: Clint, last: Eastwood}

This includes automatic array creation when a param key is repeated:

page.html?actor=Eastwood&actor=Bronson&actor=Heston

...becomes: actor=[ Eastwood, Bronson, Heston ]

This also allows arrays-of-arrays and arrays-of-hashes:

page.html?actor={first: Clint, last: Eastwood}&actor={first: Charles,
last: Bronson}

...becomes:

actor = [
      0: {
              first: 'Clint'
           ,  last: 'Eastwood'
           }
      1:  {
               first: 'Charles'
            ,  last: 'Bronson'
            }
]

You can see and test a demo page here...

    http://layout.jquery-dev.net/url_parsing.html

There are a number of test URLs (hyperlinks) provided to demonstrate
the different types of parsing, but you can append any params you want
to the URL to see how they are parsed.

To illustrate the size of the 'long version', here is the partially
minified code:

// MINIFIED CODE (860 bytes)
function setURL(){
$.url={};$.urlParams=[];
var s=self.location.search.substr(1),p,d,k,v,i;
if(!s)return;
p=s.split("&");
for(i=0;i<p.length;i++){
d=p[i].split("=");k=$.trim(d[0]);
if(k){
v=d[1]==undefined?true:parse(d[1]);
if(!$.url[k]){$.url[k]=v;$.urlParams.push(k);}
else{if(!$.isArray($.url[k])||($.isArray(v)&&typeof $.url[k][0]!
='object'))$.url[k]=[$.url[k]];$.url[k].push(v);}
}
}
function parse(x){
x=$.trim(x);
if(!x)return "";
var c=x.length-1,f=x.charAt(0),l=x.charAt
(c),A=f=="["&&l=="]",H=f=="{"&&l=="}",d,h,k,o,i;
if(A||H){
o=A?[]:{};d=x.substr(1,c-1).split(",")
for(i=0;i<d.length;i++){
if(A)o[i]=parse(d[i]);
else if(d[i]){h=d[i].split(":");k=$.trim(h[0]);if(k)o[k]=parse(h[1]);}
}
return o;
}
else if(!isNaN(x))return Number(x);
else if(x==="true")return true;
else if(x==="false")return false;
else return x;
}
}

The demo page contains a more readable, commented version of the code
above. If there is any interst in this code, feel free to help
yourself. I did not keep a copy of the short-version, but it would not
take long to recreate - this is not complex code.

SO, do John and the gang feel this addition would be worthwhile for
jQuery? I'm suggesting this partly out of self-interest - I copy the
same URL-parsing functions to every project I work on. I'd prefer that
this basic functionality was part of jQuery, and I feel a $.url object
is the most intuitive and flexible way to do it.

At a minimum, this will become part of my standard jQuery extensions
library. I prefer working with an 'URL object' rather than using a
'parsing method':

// using an URL Object
if ($.url.section) doSomething( $.url.section );

// using a Parsing Method
var section = parseURL('section');
if (section) doSomething( section );

The ability to use complex objects offers more options for passing JS
data between pages:

$.each($.url.actor, function (idx, Actor) {
   $('#List').append('<li>'+ Actor.first +' '+ Actor.last +'</li>');
});

The example above is a little silly, but you see how it could be
useful for passing 'state' or other data.

Feedback?

/Kevin
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"jQuery Development" group.
To post to this group, send email to jquery-dev@googlegroups.com
To unsubscribe from this group, send email to 
jquery-dev+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/jquery-dev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to