Как добавить параметр в URL? - PullRequest
15 голосов
/ 01 августа 2011

Мой текущий URL: http://something.com/mobiles.php?brand=samsung

Теперь, когда пользователь нажимает фильтр минимальной цены (скажем, 300), я хочу, чтобы мой URL стал

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

Другими словами, я ищу функцию javascript, которая добавит указанный параметр в текущий URL, а затем перенаправит веб-страницу на новый URL.

Примечание. Если параметры не установлены, функция должна добавить ? вместо &

т.е. если текущий URL-адрес http://something.com/mobiles.php, то страница должна быть перенаправлена ​​на http://something.com/mobiles.php?priceMin=300 вместо http://something.com/mobiles.php&priceMin=300

Ответы [ 9 ]

17 голосов
/ 01 августа 2011

попробуйте что-то вроде этого, следует учитывать также случаи, когда у вас уже есть этот параметр в 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);
15 голосов
/ 01 августа 2011

На самом деле это совершенно тривиально, потому что объект местоположения javascript уже имеет дело с этим. Просто заключите эту однострочную строку в функцию, чтобы снова использовать ее со ссылками и т. Д .:

<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 в своей собственной функции.

Edit:

При обсуждении принятого ответа выше выяснилось, что для получения работающей функции должны быть выполнены следующие условия:

  • если параметр уже существует, его следует изменить.
  • , если параметр уже существует несколько раз, должна выжить только измененная копия.
  • если параметр уже существует, но не имеет значения, значение должно быть установлено.

Поскольку search уже предоставляет строку поиска, единственное, что остается сделать, - это проанализировать эту часть запроса информации в парах имя и значение, изменить или добавить отсутствующее имя и значение, а затем добавить его обратно к * 1029. *:

<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 свойства.

5 голосов
/ 01 августа 2011
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.


Благодаря хакре, вы также можете просто установить его следующим образом:

location.search += "&newpart";

Он автоматически добавит ? в случае необходимости (если он не очевиден, он сделает его ?&newpart таким образом, но это не должно иметь значения).

2 голосов
/ 20 мая 2016

Я переписываю правильный ответ на 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 голос
/ 01 августа 2011
var applyMinPrice = function(minPrice) {
    var existingParams = (location.href.indexOf('?') !== -1),
        separator = existingParams ? '&' : '?',
        newParams = separator + 'priceMin=' + minPrice;

    location.href += newParams;
}
0 голосов
/ 17 октября 2014
<html>
<body>
..
..
..

<?php
$priceMinValue= addslashes ( $_GET['priceMin']);
if (!empty($priceMin)) {
        $link = "currentpage.php?priceMin=". $priceMinValue;
        die("<script>location.href = '".$link. "'</script>");    
}
?>
</body>
</html>
0 голосов
/ 01 августа 2011
<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 голосов
/ 01 августа 2011

используйте var urlString = window.location, чтобы получить URL

проверить, содержит ли URL-адрес "?" с urlString.indexOf('?'), -1 означает, что он не существует.

установить window.location для перенаправления

это как 101 из JavaScript. попробуйте несколько поисковых систем!

0 голосов
/ 01 августа 2011

Если у вас есть пользователь, заполняющий текстовое поле с минимальной ценой, почему бы не позволить форме отправить в виде GET-запроса с пустым действием?IIRC, это должно делать то, что вы хотите, без какого-либо JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...