通过location的属性可以访问到location
对象的大多数信息,但其中访问 URL 包含的查询字符串的属性并不方便。尽管location.search
返回从问号到 URL 末尾的所有内容,但却没有办法逐个访问其中的每个查询字符串参数。为此,可以像下面这样创建一个函数,用以解析查询字符串,然后返回包含所有参数的一个对象:
function getQueryStringArgs(){
//取得查询字符串并去掉开头的问号
var qs = (location.search.length > 0 ? location.search.substring(1) : ""),
//保存数据的对象
args = {},
//取得每一项
items = qs.length ? qs.split("&") : [],
item = null,
name = null,
value = null,
//在 for 循环中使用
i = 0,
len = items.length;
//逐个将每一项添加到 args 对象中
for (i=0; i < len; i++){
item = items[i].split("=");
name = decodeURIComponent(item[0]);
value = decodeURIComponent(item[1]);
if (name.length) {
args[name] = value;
}
}
return args;
}
这个函数的第一步是先去掉查询字符串开头的问号。当然,前提是location.search
中必须要包含一或多个字符。然后,所有参数将被保存在args
对象中,该对象以字面量形式创建。接下来,根据和号(&)来分割查询字符串,并返回name=value
格式的字符串数组。下面的for
循环会迭代这个数组,然后再根据等于号分割每一项,从而返回第一项为参数名,第二项为参数值的数组。再使用decodeURIComponent()
分别解码name
和value
(因为查询字符串应该是被编码过的)。最后,将name
作为args
对象的属性,将value
作为相应属性的值。下面给出了使用这个函数的示例。
//假设查询字符串是 ?q=javascript&num=10
var args = getQueryStringArgs();
alert(args["q"]); //"javascript"
alert(args["num"]); //"10"
可见,每个查询字符串参数都成了返回对象的属性。这样就极大地方便了对每个参数的访问。