Как добавить параметр в URL?
Мой текущий 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
Ответы
Ответ 1
попробуйте что-то вроде этого, он также должен учитывать случаи, когда у вас уже есть этот параметр в 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);
Ответ 2
На самом деле это совершенно тривиально, потому что объект местоположения 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
уже предоставляет строку поиска, остается только проанализировать эту часть запроса-info в парах имя и значение, изменить или добавить отсутствующее имя и значение, а затем добавить его обратно в 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 свойства.
Ответ 3
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
таким образом, но это не имеет значения).
Ответ 4
Я переписываю правильный ответ в 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;
}
Я надеюсь, что кто-то поможет...
Ответ 5
var applyMinPrice = function(minPrice) {
var existingParams = (location.href.indexOf('?') !== -1),
separator = existingParams ? '&' : '?',
newParams = separator + 'priceMin=' + minPrice;
location.href += newParams;
}
Ответ 6
Если у вас есть пользователь, заполняющий текстовое поле с минимальной ценой, почему бы не отправить форму в виде запроса GET с пустым действием? IIRC, который должен делать именно то, что вы хотите, без javascript.
Ответ 7
используйте var urlString = window.location
, чтобы получить URL
проверьте, содержит ли url '?' с urlString.indexOf('?')
, -1 означает, что он не существует.
установить window.location
для перенаправления
это похоже на 101 javascript. попробуйте несколько поисковых систем!
Ответ 8
<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>
Ответ 9
<html>
<body>
..
..
..
<?php
$priceMinValue= addslashes ( $_GET['priceMin']);
if (!empty($priceMin)) {
$link = "currentpage.php?priceMin=". $priceMinValue;
die("<script>location.href = '".$link. "'</script>");
}
?>
</body>
</html>