diff options
Diffstat (limited to 'src/URI.fragmentQuery.js')
-rw-r--r-- | src/URI.fragmentQuery.js | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/src/URI.fragmentQuery.js b/src/URI.fragmentQuery.js new file mode 100644 index 000000000..75e2583f3 --- /dev/null +++ b/src/URI.fragmentQuery.js @@ -0,0 +1,104 @@ +/* + * Extending URI.js for fragment abuse + */ + +// -------------------------------------------------------------------------------- +// EXAMPLE: storing application/x-www-form-urlencoded data in the fragment +// possibly helpful for Google's hashbangs +// see http://code.google.com/web/ajaxcrawling/ +// -------------------------------------------------------------------------------- + +// Note: make sure this is the last file loaded! + +// USAGE: +// var uri = URI("http://example.org/#?foo=bar"); +// uri.fragment(true) === {foo: "bar"}; +// uri.fragment({bar: "foo"}); +// uri.toString() === "http://example.org/#?bar=foo"; +// uri.addFragment("name", "value"); +// uri.toString() === "http://example.org/#?bar=foo&name=value"; +// uri.removeFragment("name"); +// uri.toString() === "http://example.org/#?bar=foo"; + +(function (root, factory) { + 'use strict'; + // https://github.com/umdjs/umd/blob/master/returnExports.js + if (typeof exports === 'object') { + // Node + module.exports = factory(require('./URI')); + } else if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['./URI'], factory); + } else { + // Browser globals (root is window) + factory(root.URI); + } +}(this, function (URI) { + 'use strict'; + + var p = URI.prototype; + // old fragment handler we need to wrap + var f = p.fragment; + + // make fragmentPrefix configurable + URI.fragmentPrefix = '?'; + var _parts = URI._parts; + URI._parts = function() { + var parts = _parts(); + parts.fragmentPrefix = URI.fragmentPrefix; + return parts; + }; + p.fragmentPrefix = function(v) { + this._parts.fragmentPrefix = v; + return this; + }; + + // add fragment(true) and fragment({key: value}) signatures + p.fragment = function(v, build) { + var prefix = this._parts.fragmentPrefix; + var fragment = this._parts.fragment || ''; + + if (v === true) { + if (fragment.substring(0, prefix.length) !== prefix) { + return {}; + } + + return URI.parseQuery(fragment.substring(prefix.length)); + } else if (v !== undefined && typeof v !== 'string') { + this._parts.fragment = prefix + URI.buildQuery(v); + this.build(!build); + return this; + } else { + return f.call(this, v, build); + } + }; + p.addFragment = function(name, value, build) { + var prefix = this._parts.fragmentPrefix; + var data = URI.parseQuery((this._parts.fragment || '').substring(prefix.length)); + URI.addQuery(data, name, value); + this._parts.fragment = prefix + URI.buildQuery(data); + if (typeof name !== 'string') { + build = value; + } + + this.build(!build); + return this; + }; + p.removeFragment = function(name, value, build) { + var prefix = this._parts.fragmentPrefix; + var data = URI.parseQuery((this._parts.fragment || '').substring(prefix.length)); + URI.removeQuery(data, name, value); + this._parts.fragment = prefix + URI.buildQuery(data); + if (typeof name !== 'string') { + build = value; + } + + this.build(!build); + return this; + }; + p.addHash = p.addFragment; + p.removeHash = p.removeFragment; + + // extending existing object rather than defining something new + return URI; +}));
\ No newline at end of file |