Как добавить параметр в 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

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

На самом деле это совершенно тривиально, потому что объект местоположения 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-функций в свою собственную.

Редактировать:

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

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

Поскольку 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 свойства.

 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 таким образом, но это не имеет значения).

Я переписываю правильный ответ в 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; } 

Я надеюсь, что кто-то помог …

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

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

 <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> 

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

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

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

это похоже на 101 javascript. попробуйте некоторые поисковые системы!

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