Ändra URL-parametrar och ange standardvärden med JavaScript
Jag har denna URL:
site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc
vad jag behöver är att kunna ändra värdet för url-parametern 'rows' till något jag specificerar, låt oss säga 10. Och om 'rows' inte finns, behöver jag lägga till det i slutet av url:en och lägga till det värde jag redan har specificerat (10).
Svar #1
Jag har utökat Sujoys kod för att skapa en funktion.
/**
* http://stackoverflow.com/a/10997390/11236
*/
function updateURLParameter(url, param, paramVal){
var newAdditionalURL = "";
var tempArray = url.split("?");
var baseURL = tempArray[0];
var additionalURL = tempArray[1];
var temp = "";
if (additionalURL) {
tempArray = additionalURL.split("&");
for (var i=0; i<tempArray.length; i++){
if(tempArray[i].split('=')[0] != param){
newAdditionalURL += temp + tempArray[i];
temp = "&";
}
}
}
var rows_txt = temp + "" + param + "=" + paramVal;
return baseURL + "?" + newAdditionalURL + rows_txt;
}
Funktionsanrop:
var newURL = updateURLParameter(window.location.href, 'locId', 'newLoc');
newURL = updateURLParameter(newURL, 'resId', 'newResId');
window.history.replaceState('', '', updateURLParameter(window.location.href, "param", "value"));
Uppdaterad version som också tar hand om ankare på URL:en.
function updateURLParameter(url, param, paramVal)
{
var TheAnchor = null;
var newAdditionalURL = "";
var tempArray = url.split("?");
var baseURL = tempArray[0];
var additionalURL = tempArray[1];
var temp = "";
if (additionalURL)
{
var tmpAnchor = additionalURL.split("#");
var TheParams = tmpAnchor[0];
TheAnchor = tmpAnchor[1];
if(TheAnchor)
additionalURL = TheParams;
tempArray = additionalURL.split("&");
for (var i=0; i<tempArray.length; i++)
{
if(tempArray[i].split('=')[0] != param)
{
newAdditionalURL += temp + tempArray[i];
temp = "&";
}
}
}
else
{
var tmpAnchor = baseURL.split("#");
var TheParams = tmpAnchor[0];
TheAnchor = tmpAnchor[1];
if(TheParams)
baseURL = TheParams;
}
if(TheAnchor)
paramVal += "#" + TheAnchor;
var rows_txt = temp + "" + param + "=" + paramVal;
return baseURL + "?" + newAdditionalURL + rows_txt;
}
Svar #2
Jag tror att du vill ha frågepluginet.
T.ex.:
window.location.search = jQuery.query.set("rows", 10);
Detta kommer att fungera oavsett det aktuella tillståndet hos raderna.
Svar #3
Ett modernt tillvägagångssätt för detta är att använda inbyggda standardbaserade URLSearchParams. Det stöds av alla större webbläsare, förutom IE där polyfills finns tillgängliga.
const paramsString = "site.fwx?position=1&archiveid=5000&columns=5&rows=20&sorting=ModifiedTimeAsc"
const searchParams = new URLSearchParams(paramsString);
searchParams.set('rows', 10);
console.log(searchParams.toString()); // return modified string.
Svar #4
För att besvara min egen fråga 4 år senare, efter att ha lärt mig mycket. Särskilt att du inte borde använda jQuery till allt. Jag har skapat en enkel modul som kan parsa/omvandla en frågesträng till en sträng. Detta gör det enkelt att ändra frågesträngen.
Du kan använda query-string på följande sätt:
// parse the query string into an object
var q = queryString.parse(location.search);
// set the `row` property
q.rows = 10;
// convert the object to a query string
// and overwrite the existing query string
location.search = queryString.stringify(q);
Svar #5
Snabb liten lösning i ren JS, inga tillägg behövs:
function replaceQueryParam(param, newval, search) {
var regex = new RegExp("([?;&])" + param + "[^&;]*[;&]?");
var query = search.replace(regex, "$1").replace(/&$/, '');
return (query.length > 2 ? query + "&" : "?") + (newval ? param + "=" + newval : '');
}
Kalla det så här:
window.location = '/mypage' + replaceQueryParam('rows', 55, window.location.search)
Eller, om du vill hålla dig på samma sida och ersätta flera parametrar:
var str = window.location.search
str = replaceQueryParam('rows', 55, str)
str = replaceQueryParam('cols', 'no', str)
window.location = window.location.pathname + str
redigera, tack Luke: För att ta bort parametern helt, ange false eller null för värdet: replaceQueryParam('rows', false, params). Eftersom 0 också är falskt, ange '0'.
Svar #6
Ben Alman har ett bra jquery querystring/url-plugin här som låter dig manipulera querystringen enkelt.
Som begärt -
Gå till hans testsida här
I Firebug, skriv följande i konsolen
jQuery.param.querystring(window.location.href, 'a=3&newValue=100');Det kommer att returnera följande ändrade URL-sträng till dig
http://benalman.com/code/test/js-jquery-url-querystring.html?a=3&b=Y&c=Z&newValue=100#n=1&o=2&p=3
Observera att ett querystring-värde för a har ändrats från X till 3 och det har lagts till ett nytt värde.
Du kan sedan använda den nya URL-strängen hur du vill, t.ex. genom att använda document.location=newUrl eller ändra en ankarlänk osv.
Svar #7
Detta är det moderna sättet att ändra URL-parametrar:
function setGetParam(key,value) {
if (history.pushState) {
var params = new URLSearchParams(window.location.search);
params.set(key, value);
var newUrl = window.location.origin
+ window.location.pathname
+ '?' + params.toString();
window.history.pushState({path:newUrl},'',newUrl);
}
}
Svar #8
du kan göra det via vanlig JS också
var url = document.URL
var newAdditionalURL = "";
var tempArray = url.split("?");
var baseURL = tempArray[0];
var aditionalURL = tempArray[1];
var temp = "";
if(aditionalURL)
{
var tempArray = aditionalURL.split("&");
for ( var i in tempArray ){
if(tempArray[i].indexOf("rows") == -1){
newAdditionalURL += temp+tempArray[i];
temp = "&";
}
}
}
var rows_txt = temp+"rows=10";
var finalURL = baseURL+"?"+newAdditionalURL+rows_txt;
Svar #9
Använd URLSearchParams för att kontrollera, hämta och ange parametervärden i URL
Här är exemplet för att hämta den aktuella URL:en, ställa in nya parametrar och uppdatera URL:en eller ladda om sidan enligt dina behov
var rows = 5; // value that you want to set
var url = new URL(window.location);
(url.searchParams.has('rows') ? url.searchParams.set('rows', rows) : url.searchParams.append('rows', rows));
url.search = url.searchParams;
url = url.toString();
// if you want to append into URL without reloading the page
history.pushState({}, null, url);
// want to reload the window with a new param
window.location = url;
Svar #10
2020-lösning: sätter variabeln eller tar bort den om du skickar null eller undefined som värde.
var setSearchParam = function(key, value) {
if (!window.history.pushState) {
return;
}
if (!key) {
return;
}
var url = new URL(window.location.href);
var params = new window.URLSearchParams(window.location.search);
if (value === undefined || value === null) {
params.delete(key);
} else {
params.set(key, value);
}
url.search = params;
url = url.toString();
window.history.replaceState({url: url}, null, url);
}
Svar #11
URL-frågeparametrar kan lätt ändras med hjälp av URLSearchParams och History-gränssnitt:
// Construct URLSearchParams object instance from current URL querystring.
var queryParams = new URLSearchParams(window.location.search);
// Set new or modify existing parameter value.
//queryParams.set("myParam", "myValue");
queryParams.set("rows", "10");
// Replace current querystring with the new one.
history.replaceState(null, null, "?"+queryParams.toString());
Alternativt, istället för att modifiera nuvarande historikpost med replaceState(), kan vi använda pushState()-metoden för att skapa en ny:
history.pushState(null, null, "?"+queryParams.toString());
https://zgadzaj.com/development/javascript/how-to-change-url-query-parameter-with-javascript-only
Svar #12
Skulle ett gångbart alternativ till strängmanipulation vara att ställa upp ett html-formulär och bara ändra värdet på rows-elementet?
Så, med html som är något som
<form id='myForm' target='site.fwx'>
<input type='hidden' name='position' value='1'/>
<input type='hidden' name='archiveid' value='5000'/>
<input type='hidden' name='columns' value='5'/>
<input type='hidden' name='rows' value='20'/>
<input type='hidden' name='sorting' value='ModifiedTimeAsc'/>
</form>
Med följande JavaScript för att skicka formuläret
var myForm = document.getElementById('myForm');
myForm.rows.value = yourNewValue;
myForm.submit();
Förmodligen inte lämpligt för alla situationer, men kan vara trevligare än att analysera URL-strängen.
