我正在使用history.pushState在我的页面上进行AJAX调用后将几个参数附加到当前页面URL。现在,在基于用户操作的同一页面上,我想使用相同或更多的参数集再次更新页面URL。所以我的代码看起来像这样:
var pageUrl = window.location.href + "?" + queryString;
window.history.pushState('','',pageUrl);
queryString是我的查询参数列表。
但是使用上面的代码,我的params被附加到带有params的URL,并且在第二次AJAX调用后它们看起来如下所示:
http://sample.com?param1=foo¶m2=bar¶m1=foo,foo1¶m2=bar¶m3=another_foo
所以params在URL中出现两次,是否有任何方法可以在推送到History之前替换URL中的params或者在javascript(jquery)中实现此目的的任何其他更好的方法?
答案 0 :(得分:16)
我认为您需要的是移除window.location.href
并离开'?' +
。
var pageUrl = '?' + queryString;
window.history.pushState('', '', pageUrl);
答案 1 :(得分:7)
此功能可能会有所帮助
function updateUrlParameter(param, value) {
const regExp = new RegExp(param + "(.+?)(&|$)", "g");
const newUrl = window.location.href.replace(regExp, param + "=" + value + "$2");
window.history.pushState("", "", newUrl);
}
编辑:以下解决方案更简单,如果参数还不是网址的一部分,它也可以使用。但是,Internet Explorer不支持它(你不能说?)。
function setQueryStringParameter(name, value) {
const params = new URLSearchParams(location.search);
params.set(name, value);
window.history.replaceState({}, "", decodeURIComponent(`${location.pathname}?${params}`));
}
答案 2 :(得分:2)
嗨为了保留网址的最后一部分并仅使用参数,您可以像这样创建一个新的网址对象:
// e.g url: sample.com/testpage/test
var url = new URL(window.location);
url.searchParams.set('foo', 'bar');
window.history.pushState({}, '', url);
// outcome: sample.com/testpage/test?foo=bar
// you can remove, just the param part, like so:
url.searchParams.delete('foo');
答案 3 :(得分:0)
此函数与其他答案类似,但不使用 RegExp 和字符串连接。
参数:
localhost:8080/some_page?foo=100500&foo=ABC
。否则,该参数将被更改(如果不存在则添加)。function setQueryStringParameter(name, value, append=false) {
const url = new URL(window.document.URL);
if (append) url.searchParams.append(name, value);
else url.searchParams.set(name, value);
window.history.replaceState(null, "", url.toString());
}