实际上这很简单,因为JavaScript位置对象已经处理了这个问题。只需将这个一行代码封装成函数,以便在链接等情况下重用:
function getUrlParameter(name) {
name = name.replace(/[\[]/, '\\[').replace(/[\]]/, '\\]');
var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
var results = regex.exec(location.search);
return results === null ? '' : decodeURIComponent(results[1].replace(/\+/g, ' '));
}
<script>
function addParam(v) {
window.location.search += '&' + v;
}
</script>
<a href="javascript:addParam('priceMin=300');">add priceMin=300</a>
不需要检查 ?
,因为这已经是 search
部分了,你只需要添加参数。
如果您甚至不想使用函数,可以这样编写:
<a href="javascript:location.search+='&priceMin=300';">add priceMin=300</a>
请记住,这正是您所要求的:添加特定参数。它已经可以成为search
部分的一部分,因为可以在URI中多次使用相同的参数。您可能希望在应用程序内对其进行规范化,但那是另一个领域。我会将URL规范化集中到它自己的函数中。
编辑:
在上面接受的答案的讨论中,明确了以下条件以获得可工作的函数:
- 如果参数已经存在,则应更改它。
- 如果参数已经存在多次,则仅更改后的副本应该留下。
- 如果参数已经存在,但没有值,则应设置值。
由于search
已经提供了搜索字符串,因此要实现的唯一任务是将查询信息部分解析为名称和值对,更改或添加缺少的名称和值,然后将其添加回search
中:
<script>
function setParam(name, value) {
var l = window.location;
var params = {};
var x = /(?:\??)([^=&?]+)=?([^&?]*)/g;
var s = l.search;
for(var r = x.exec(s); r; r = x.exec(s))
{
r[1] = decodeURIComponent(r[1]);
if (!r[2]) r[2] = '%%';
params[r[1]] = r[2];
}
params[name] = encodeURIComponent(value);
var search = [];
for(var i in params)
{
var p = encodeURIComponent(i);
var v = params[i];
if (v != '%%') p += '=' + v;
search.push(p);
}
search = search.join('&');
l.search = search;
}
</script>
<a href="javascript:setParam('priceMin', 300);">add priceMin=300</a>
这至少更加健壮,因为它可以处理像这样的URL:
test.html?a?b&c&test=foo&priceMin=300
或者甚至:
test.html?a?b&c&test=foo&pri%63eMin=300
此外,添加的名称和值始终得到适当的编码。可能会失败的情况是,参数名称导致非法属性 JS 标签。
$ _GET
数组将Web表单填充所需的值作为隐藏字段,或者您可以使用http_build_query
构建一个新的查询字符串,其中包含您设置任何必要的新参数的$ _GET
的副本。这个新的查询可以被转储到一个链接中。 - zzzzBov