一个处理location.search的小方法

最近在写公司的一个类似 AJAX 搜索页面的时候,在点击搜索的时候,会跳转到对应的页面,当返回,也就是点击浏览器的返回按钮时,还显示之前的页面,也就是要保存搜索的关键词,在不使用 cookielocalstorage 的情况下,可以用 location.search 来存储

由于 locationwindow 下的,所以获取 location.search 可以直接获取,这个值的第一个字符是 '?' ,里面的 key-value 是用 key=value 来表示, key-valuekey-value 之间用’&’隔开,所以我们去掉第一个字符 '?' 并用 '&' 分割这个值,得到元素是字符串形式的 key=value 的数组

1
var query = location.search.substring(1).split('&');

循环处理分割后得到的数组,每个元素理论上应该是形如 key=value 的字符串,我们再把每个元素用 '=' 分隔开,第一个元素是 key ,第二个元素是 value ,我们可以得到一个包含所有 key=value 的对象,暂且称之为 parms 对象

1
2
3
4
5
6
for (var i = 0; i < query.length; i++) {
var pos = query[i].split('=');
if (pos[0]) {
parms[pos[0]] = pos[1] ? pos[1] : '';
}
}

接下来处理传进来的参数,如果没有则直接返回上一步得到的 parms 对象

1
2
3
if (!args) {
return parms;
}

如果参数存在,则枚举这个对象,如果这个对象的属性在上一步得到的 parms 对象中存在,则更新该属性,否则添加该属性并赋值

1
2
3
4
5
6
7
8
9
for (var argKey in args) {
for (var parmskey in parms) {
if (argKey === parmskey) {
parms[parmskey] = args[parmskey];
break;
}
}
parms[argKey] = args[argKey];
}

到这一步,我们已经得到了新的 parms 对象,我们要把它还原成 location.search 的形式

1
2
3
for (var key in parms) {
newParms += key + '=' + parms[key] + '&';
}

然后把最后一个 '&' 去掉

1
newParms.substring(0, newParms.length - 1)

到这一步才算完成整个过程,下面贴上完整代码,也可以在 Github 上查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function setParms(args) {
var parms = {}, newParms = '?';
//把location.search解析成对象parms
var query = location.search.substring(1).split('&');
for (var i = 0; i < query.length; i++) {
var pos = query[i].split('=');
if (pos[0]) {
parms[pos[0]] = pos[1] ? pos[1] : '';
}
}
//如果没有传设置的args,则直接返回parms
if (!args) {
return parms;
}
//设置parms,属性存在则更新,不存在则添加
for (var argKey in args) {
for (var parmskey in parms) {
if (argKey === parmskey) {
parms[parmskey] = args[parmskey];
break;
}
}
parms[argKey] = args[argKey];
}
//字符串化parms并返回
for (var key in parms) {
newParms += key + '=' + parms[key] + '&';
}
return newParms.substring(0, newParms.length - 1);
}

Fork me on GitHub