如何向URL添加参数?

22

我的当前URL是:http://something.com/mobiles.php?brand=samsung

现在当用户点击最低价格筛选器(比如300),我希望我的URL变成

http://something.com/mobiles.php?brand=samsung&priceMin=300

换句话说,我正在寻找一个JavaScript函数,它将在当前URL中添加指定的参数,然后将Web页面重定向到新的URL。

注意:如果没有设置任何参数,则该函数应添加?而不是&

也就是说,如果当前URL是http://something.com/mobiles.php,那么页面应该被重定向到http://something.com/mobiles.php?priceMin=300而不是http://something.com/mobiles.php&priceMin=300


1
你为什么不能在服务器端生成链接或使用Web表单呢? - zzzzBov
1
我的网站上有太多的筛选器,例如品牌名称、价格范围、按热度排序、按价格排序等等。在服务器端生成URL需要大量的if-else语句,这会给服务器带来不必要的负载。我特别希望在客户端进行URL更改。谢谢! - sumit
@iSumitG,如果你正在使用PHP并且正在使用“很多if-else语句”,那么你的做法是非常错误的。 - zzzzBov
2
你不应该需要if-else... PHP有专门设计的函数来处理这个问题。请查看http://www.php.net/manual/en/function.http-build-query.php。 - iLLin
2
@iSumitG,因为您可以使用$ _GET数组将Web表单填充所需的值作为隐藏字段,或者您可以使用http_build_query构建一个新的查询字符串,其中包含您设置任何必要的新参数的$ _GET的副本。这个新的查询可以被转储到一个链接中。 - zzzzBov
显示剩余3条评论
10个回答

21

尝试像这样做,它还应该考虑到当您在URL中已经有该参数的情况:

function addOrUpdateUrlParam(name, value)
{
  var href = window.location.href;
  var regex = new RegExp("[&\\?]" + name + "=");
  if(regex.test(href))
  {
    regex = new RegExp("([&\\?])" + name + "=\\d+");
    window.location.href = href.replace(regex, "$1" + name + "=" + value);
  }
  else
  {
    if(href.indexOf("?") > -1)
      window.location.href = href + "&" + name + "=" + value;
    else
      window.location.href = href + "?" + name + "=" + value;
  }
}

在你的情况下,你可以这样调用它:

addOrUpdateUrlParam('priceMin', 300);

如果名为mypriceMin的参数已经是location.href的一部分,它可能会被更改,因此请确保代码实际上是为其目的而工作。此外,正则表达式应仅在搜索部分上运行,而不是完整的href。 - hakre
1
我发现使用 search 而不是 href 的另一个原因:尝试使用 test.html?a=b#filter - 添加到 location.href 会将参数添加到位置的错误部分。 - hakre
对我来说,这个解决方案添加了多余的1而不是?和&,还有其他的问题。最终我使用了@hakre的解决方案,它很好地工作了。 - davecom
很遗憾,当先前的值是字符串并且需要被数字替换时,这种方法不起作用。我最终使用了@hakre的解决方案。 - F_V
这里也遇到了一些问题,不确定原因,但它无法替换旧值。不得不使用@hakre,它立即起作用。 - Brettins
显示剩余4条评论

19

实际上这很简单,因为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;

        /* build params */
        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];
        }

        /* set param */
        params[name] = encodeURIComponent(value);

        /* build search */
        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('&');

        /* execute search */
        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 标签。


谢谢,这个setParam函数非常有用。我能否多次调用它来设置多个参数? - Alex

9
if(location.search === "") {
    location.href = location.href + "?priceMin=300";
} else {
    location.href = location.href + "&priceMin=300";
}

如果location.search === "",那么就没有?部分。
因此,添加?newpart以使其变为.php?newpart
否则,已经存在?部分。
所以添加&newpart以使其变为.php?existingpart&newpart
感谢hakre的帮助,您也可以直接设置它:
location.search += "&newpart";

如果必要的话,它会自动添加?(如果不明显,则会使其成为?&newpart,但这并不重要)。

在你的示例中不需要使用if,只需使用location.search += "&priceMin=300";即可完成完全相同的操作。 - hakre
@hakre:非常抱歉,if 的作用实际上是区分 & - pimvdb
1
这是多余的,因为你可以使用 search 方法来查询,如果它没有被设置为 ? 的话。你的代码中,即使在哈希部分结束后还会添加它,现在你可以用 test.html?a=b#filter 来尝试。 - hakre
@hakre:我不知道location.search可以被设置。谢谢。 - pimvdb

3

有一种更优雅的解决方案可用,无需编写自己的函数。

这将添加/更新并处理您可能需要的任何 ? 或 &。

var params = new URLSearchParams(window.location.search);
params.set("name", "value");
window.location.search = params.toString();

2

我用PHP重写了正确的答案:

function addOrUpdateUrlParam($name, $value){
$href = $_SERVER['REQUEST_URI'];
$regex = '/[&\\?]' . $name . "=/";
if(preg_match($regex, $href)){
    $regex = '([&\\?])'.$name.'=\\d+';
    $link = preg_replace($regex, "$1" . $name . "=" . $value, $href);
}else{
    if(strpos($href, '?')!=false){
        $link = $href . "&" . $name . "=" . $value;
    }else{
        $link = $href . "?" . $name . "=" . $value;
    }
}
return $link;
}

我希望这对某些人有所帮助...


1
var applyMinPrice = function(minPrice) {
    var existingParams = (location.href.indexOf('?') !== -1),
        separator = existingParams ? '&' : '?',
        newParams = separator + 'priceMin=' + minPrice;

    location.href += newParams;
}

0
如果您要求用户填写一个最低价格的文本字段,为什么不让表单以空白操作提交为GET请求?如果我没记错,这样做应该正是您想要的,而不需要任何JavaScript。

0

使用 var urlString = window.location 获取 URL。

使用 urlString.indexOf('?') 检查 URL 是否已经包含了 '?',-1 表示不存在。

使用 window.location 设置重定向。

这就是 JavaScript 的基础。试试一些搜索引擎吧!


0
<FORM action="" method="get">
<P>
<LABEL for="brand">Brand: </LABEL>
          <INPUT type="text" id="brand"><BR>
<LABEL for="priceMin">Minimum Price: </LABEL>
          <INPUT type="text" id="priceMin"><BR>
</P>


0
<html>
<body>
..
..
..

<?php
$priceMinValue= addslashes ( $_GET['priceMin']);
if (!empty($priceMin)) {
        $link = "currentpage.php?priceMin=". $priceMinValue;
        die("<script>location.href = '".$link. "'</script>");    
}
?>
</body>
</html>

他想要客户端的JavaScript,而不是服务器端的。 - JaMaBing

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接