History.pushStateを使用して、AJAXを呼び出した後、現在のページURLにいくつかのパラメーターを追加します。ユーザーアクションに基づいて同じページで、ページURLを再度更新します。同じまたは追加のパラメータのセットですので、私のコードは次のようになります。
var pageUrl = window.location.href + "?" + queryString;
window.history.pushState('','',pageUrl);
queryStringは、クエリパラメータのリストです。
しかし、上記のコードを使用すると、paramsがURLに追加され、2番目のAJAX呼び出しの後、次のようになります。
http://sample.com?param1=foo¶m2=bar¶m1=foo,foo1¶m2=bar¶m3=another_foo
したがって、パラメータはURLに2回表示されますが、ヒストリにプッシュする前にURLのパラメータを置き換える方法や、javascript(jquery)でこれを達成する他のより良い方法はありますか?
必要なのは削除window.location.href
そして去る '?' +
。
var pageUrl = '?' + queryString;
window.history.pushState('', '', pageUrl);
この機能は役に立つかもしれません
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(location.search);
params.set(name, value);
window.history.replaceState({}, "", decodeURIComponent(`${location.pathname}?${params}`));
}