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