1+ /*
2+ * Extending URL.js for fragment abuse
3+ */
4+
5+ // --------------------------------------------------------------------------------
6+ // EXAMPLE: storing application/x-www-form-urlencoded data in the fragment
7+ // possibly helpful for Google's hashbangs
8+ // see http://code.google.com/web/ajaxcrawling/
9+ // --------------------------------------------------------------------------------
10+
11+ // USAGE:
12+ // var uri = URI("http://example.org/#?foo=bar");
13+ // uri.fragment(true) === {foo: "bar"};
14+ // uri.fragment({bar: "foo"});
15+ // uri.toString() === "http://example.org/#?bar=foo";
16+ // uri.addFragment("name", "value");
17+ // uri.toString() === "http://example.org/#?bar=foo&name=value";
18+ // uri.removeFragment("name");
19+ // uri.toString() === "http://example.org/#?bar=foo";
20+
21+ ( function ( URI , undefined ) {
22+
23+ var p = URI . prototype ,
24+ // old fragment handler we need to wrap
25+ f = p . fragment ,
26+ // NOTE: google want's #! (hashbang), others might want #? others might want plain #
27+ // choose the prefix you want to use here
28+ prefix = '?' ;
29+
30+ // add fragment(true) and fragment({key: value}) signatures
31+ p . fragment = function ( v , build ) {
32+ if ( v === true ) {
33+ return URI . parseQuery ( this . _parts . fragment . substring ( prefix . length ) ) ;
34+ } else if ( v !== undefined && typeof v !== "string" ) {
35+ this . _parts . fragment = prefix + URI . buildQuery ( v ) ;
36+ this . build ( ! build ) ;
37+ return this ;
38+ } else {
39+ return f . call ( this , v , build ) ;
40+ }
41+ } ;
42+ p . addFragment = function ( name , value , build ) {
43+ var data = URI . parseQuery ( this . _parts . fragment . substring ( prefix . length ) ) ;
44+ URI . addQuery ( data , name , value ) ;
45+ this . _parts . fragment = prefix + URI . buildQuery ( data ) ;
46+ if ( typeof name !== "string" ) {
47+ build = value ;
48+ }
49+
50+ this . build ( ! build ) ;
51+ return this ;
52+ } ;
53+ p . removeFragment = function ( name , value , build ) {
54+ var data = URI . parseQuery ( this . _parts . fragment . substring ( prefix . length ) ) ;
55+ URI . removeQuery ( data , name , value ) ;
56+ this . _parts . fragment = prefix + URI . buildQuery ( data ) ;
57+ if ( typeof name !== "string" ) {
58+ build = value ;
59+ }
60+
61+ this . build ( ! build ) ;
62+ return this ;
63+ } ;
64+ p . addHash = p . addFragment ;
65+ p . removeHash = p . removeFragment ;
66+
67+ } ) ( window . URI ) ;
0 commit comments