J'utilise history.pushState pour ajouter quelques paramètres à l'URL de la page actuelle après avoir passé un appel AJAX sur ma page. Maintenant, sur la même page en fonction de l'action de l'utilisateur, je souhaite à nouveau mettre à jour l'URL de la page avec le même ensemble ou un ensemble supplémentaire de paramètres. Donc, mon code ressemble à ceci:
var pageUrl = window.location.href + "?" + queryString;
window.history.pushState('','',pageUrl);
queryString est ma liste de paramètres de requête.
Mais avec le code ci-dessus, mes paramètres sont ajoutés à l'URL avec les paramètres et ils se présentent comme ci-dessous après le deuxième appel AJAX:
http://sample.com?param1=foo¶m2=bar¶m1=foo,foo1¶m2=bar¶m3=another_foo
Les paramètres apparaissent donc deux fois dans l'URL. Existe-t-il un moyen de remplacer les paramètres dans l'URL avant de passer à l'historique ou à un autre meilleur moyen d'y parvenir en javascript (jQuery)?
Je pense que ce dont vous avez besoin est de supprimer window.location.href
et de laisser '?' +
.
var pageUrl = '?' + queryString;
window.history.pushState('', '', pageUrl);
Cette fonction pourrait être utile
function updateUrlParameter(param, value) {
const regExp = new RegExp(param + "(.+?)(&|$)", "g");
const newUrl = window.location.href.replace(regExp, param + "=" + value + "$2");
window.history.pushState("", "", newUrl);
}
Edit : La solution suivante est plus simple et fonctionne aussi si le paramètre ne fait pas encore partie de l'URL. Cependant, il n’est pas supporté par Internet Explorer (vous ne dites pas?).
function setQueryStringParameter(name, value) {
const params = new URLSearchParams(location.search);
params.set(name, value);
window.history.replaceState({}, "", decodeURIComponent(`${location.pathname}?${params}`));
}