Skip to content

Instantly share code, notes, and snippets.

@think49
Created October 1, 2010 07:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save think49/605899 to your computer and use it in GitHub Desktop.
Save think49/605899 to your computer and use it in GitHub Desktop.
URIParameter.js : URI のGETパラメータをオブジェクトに展開します。
/**
* URIParameter.js
*
* @version 1.0.2
* @author think49
*/
var URIParameter = (function () {
/**
* decodeURIComponent ("+" -> " ")
* @function
* @param {String} encodedURIComponent encoded URI String.
* @returns decoded URI string.
* @type String
*/
var _decodeURIComponent = function (encodedURIComponent) {
return decodeURIComponent(encodedURIComponent.replace(/\+/g, '\u0020'))
};
/**
* get URI Parameters.
* @constructor
* @param {String} uriString URI Strings
* @returns "[object URIParameter]"
* @type Object
*/
function URIParameter (uriString) {
var queryStrings, i, l, temp;
if (!(this instanceof URIParameter)) {
throw new Error(this + ' is not a object created by constructor');
}
uriString += '';
if (/[\r\n]/.test(uriString)) {
throw new Error('not well-formed URI');
}
queryStrings = uriString.replace(/#.*$|^[^?]*/g, '');
if (queryStrings.charAt(0) !== '?') {
throw new Error(uriString + ' doesn\'t include a query string');
}
this.queryStrings = queryStrings;
this.parameters = {length: 0};
queryStrings = queryStrings.slice(1).split(/[&;]/);
for (i = 0, l = queryStrings.length; i < l; i++) {
temp = queryStrings[i].match(/^([^=]+)=(.*)$/);
if (temp) {
this.addParameter(_decodeURIComponent(temp[1]), _decodeURIComponent(temp[2]));
}
}
return this;
}
(function () {
/**
* add Parameter.
* @function
* @param {String} name parameter-name.
* @param {String} value parameter-value.
* @returns parameter's length.
* @type Number
*/
this.addParameter = function (name, value) {
var parameters, target;
parameters = this.parameters;
parameters[parameters.length] = {name: name, value: value};
if (name !== 'length') {
if (name in parameters) {
target = parameters[name];
if (typeof target === 'object' && 'length' in target) {
target[target.length] = value;
} else {
target = [target, value];
}
parameters[name] = target;
} else {
parameters[name] = value;
}
}
return ++parameters.length;
};
/**
* remove Parameter.
* @function
* @param {String} name parameter-name.
* @param {String} value parameter-value.
* @returns parameter's length.
* @type Number
*/
this.removeParameter = function (name) {
var i, l, parametersLength, parameters, target;
parameters = this.parameters;
if (name in parameters) {
target = parameters[name];
l = typeof target === 'object' && 'length' in target ? target.length : 1;
delete parameters[name];
for (i = 0, parametersLength = parameters.length; i < parametersLength || l > 0; i++) {
if (parameters[i].name === name) {
delete parameters[i];
parameters.length--;
l--;
}
}
}
return parameters.length;
};
}).call(URIParameter.prototype);
return URIParameter;
})();