jquery 使用history.pushState()更新URL中的参数

uqzxnwby  于 2023-10-17  发布在  jQuery
关注(0)|答案(5)|浏览(106)

我使用history.pushState附加一些参数到当前页面的URL后,使我的网页上的AJAX调用。现在,在同一页面上的用户操作的基础上,我想更新页面的URL再次与相同或额外的一组参数。我的代码看起来像这样:

var pageUrl = window.location.href + "?" + queryString;
window.history.pushState('','',pageUrl);

queryString是我的查询参数列表。

但是使用上面的代码,我的参数被附加到URL中,在第二次AJAX调用后,它们看起来像下面这样:
http://sample.com?param1=foo&param2=bar&param1=foo,foo1&param2=bar&param3=another_foo
所以参数在URL中出现了两次,有没有办法在推送到历史记录之前替换URL中的参数,或者有没有其他更好的方法在JavaScript(jquery)中实现这一点?

w6mmgewl

w6mmgewl1#

我认为你需要的是删除window.location.href,留下'?' +

var pageUrl = '?' + queryString;
window.history.pushState('', '', pageUrl);
cwdobuhd

cwdobuhd2#

此功能可能会有所帮助

function updateUrlParameter(param, value) {
    const regExp = new RegExp(param + "(.+?)(&|$)", "g");
    const newUrl = window.location.href.replace(regExp, param + "=" + value + "$2");
    window.history.pushState("", "", newUrl);
}

编辑:下面的解决方案更简单,如果参数还不是URL的一部分,也可以使用。然而,它不支持Internet Explorer(你不说?).

function setQueryStringParameter(name, value) {
    const params = new URLSearchParams(window.location.search);
    params.set(name, value);
    window.history.replaceState({}, "", decodeURIComponent(`${window.location.pathname}?${params}`));
}
mqxuamgl

mqxuamgl3#

为了保留url的最后一部分,只是玩参数,你可以创建一个新的URL对象,如下所示:

// 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');
kpbpu008

kpbpu0084#

管理当前URL中的查询参数

这个函数类似于其他答案,但是没有使用RegExp和字符串连接。
参数:

  • name -查询参数的字符串名称。
  • value -参数的字符串值。
  • append - if true:这个函数总是添加一个新的参数。当你需要添加两个同名的参数时,这是非常有用的,例如: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());
}
3npbholx

3npbholx5#

let baseurl =
      window.location.protocol +
      "//" +
      window.location.host +
      window.location.pathname;
    console.log("baseurl : " + baseurl);
    window.history.pushState(undefined, undefined, baseurl + "?" + params);

相关问题