Ändern einer Abfragezeichenfolge ohne Neuladen der Seite
Lesezeit: 6 Minuten
Schallseele
Ich erstelle eine Fotogalerie und möchte die Abfragezeichenfolge und den Titel ändern können, wenn die Fotos durchsucht werden.
Das Verhalten, nach dem ich suche, wird häufig bei einigen Implementierungen von kontinuierlichen/unendlichen Seiten beobachtet, bei denen die Abfragezeichenfolge beim Herunterscrollen die Seitenzahl erhöht (http://x.com?page=4) usw.. Das sollte theoretisch einfach sein, aber ich hätte gerne etwas, das in allen gängigen Browsern sicher ist.
Ich habe diesen großartigen Beitrag gefunden und versucht, dem Beispiel zu folgen window.history.pushstate, aber das scheint bei mir nicht zu funktionieren. Und ich bin mir nicht sicher, ob es ideal ist, weil es mir nicht wirklich wichtig ist, den Browserverlauf zu ändern.
Ich möchte nur die Möglichkeit bieten, das aktuell angezeigte Foto mit einem Lesezeichen zu versehen, ohne die Seite jedes Mal neu laden zu müssen, wenn das Foto geändert wird.
Hier ist ein Beispiel für eine unendliche Seite, die die Abfragezeichenfolge ändert: http://tumbledry.org/
Können Sie einen Link zu einer Beispielsite posten, die ihre Abfragezeichenfolge dynamisch aktualisiert? Ich glaube nicht, dass es getan werden kann, aber Sie kann Ändern Sie den Hash-Wert und das könnte ausreichen, um das zu bekommen, was Sie wollen.
– Spitze
10. Juni 12 um 15:50 Uhr
mögliches Duplikat, wie man die URL mit Javascript/jquery manipuliert?
– QUentin
10. Juni 12 um 15:52 Uhr
mögliches Duplikat von Wie ändert GitHub die URL, aber nicht das Neuladen?
– QUentin
10. Juni 12 um 15:53 Uhr
mögliches Duplikat von Warum kann die neue Web-Dropbox die URL ohne Seitenaktualisierung ändern? und die drei Fragen, von denen es als Duplikat gekennzeichnet ist
– QUentin
10. Juni 12 um 15:54 Uhr
@QUentin. Sie können nur eine engere Abstimmung haben … :)
– gdoron unterstützt Monica
10. Juni 12 um 15:56 Uhr
Wenn Sie nach einer Hash-Modifikation suchen, funktioniert Ihre Lösung einwandfrei. Wenn Sie jedoch die Abfrage ändern möchten, können Sie den PushState verwenden, wie Sie sagten. Hier ist ein Beispiel, das Ihnen helfen könnte, es richtig zu implementieren. Ich habe es getestet und es hat gut funktioniert:
if (history.pushState) {
var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?myNewUrlQuery=1';
window.history.pushState({path:newurl},'',newurl);
}
Es lädt die Seite nicht neu, sondern ermöglicht Ihnen nur, die URL-Abfrage zu ändern. Sie könnten das Protokoll oder die Hostwerte nicht ändern. Und natürlich, dass es moderne Browser braucht, die HTML5 History API verarbeiten können.
Ich glaube, du kannst kürzen window.location.protocol + '//' + window.location.host nur zu: window.location.origin.
– Garrett
20. März 16 um 22:32 Uhr
Als zusätzliche Information funktionieren auch relative Pfade history.pushState(). Nein eigentlich state Argument ist auch erforderlich. Beides bedeutet, dass Sie etwas Einfaches tun können history.pushState(null, '', '/foo?bar=true') wenn sich Ihre neue URL auf demselben Host/Port befindet.
– Blaskovicz
2. November 16 um 19:38 Uhr
Beachten Sie, dass Sie verwenden können, wenn Sie nicht möchten, dass der neue Status im Browserverlauf angezeigt wird history.replaceState() mit denselben Argumenten.
– Blackus
25. November 16 um 14:06 Uhr
VERWENDEN Sie history.replaceState(), andernfalls müssen Sie in Ihrem Browser zweimal auf die ZURÜCK-Schaltfläche klicken
– Zhenja
24. Mai 17 um 10:49 Uhr
In modernen Browsern können Sie einfach Folgendes tun: if (window.history.pushState) { const newURL = new URL(window.location.href); newURL.search = '?myNewUrlQuery=1'; window.history.pushState({ path: newURL.href }, '', newURL.href); }
– Allan Baptista
21. Januar 18 um 2:24 Uhr
Aram Hovhannisyan
Ich möchte Fabios Antwort verbessern und eine Funktion erstellen, die der URL-Zeichenfolge einen benutzerdefinierten Schlüssel hinzufügt, ohne die Seite neu zu laden.
function insertUrlParam(key, value) {
if (history.pushState) {
let searchParams = new URLSearchParams(window.location.search);
searchParams.set(key, value);
let newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?' + searchParams.toString();
window.history.pushState({path: newurl}, '', newurl);
}
}
// to remove the specific key
export function removeUrlParameter(paramKey) {
const url = window.location.href
console.log("url", url)
var r = new URL(url)
r.searchParams.delete(paramKey)
const newUrl = r.href
console.log("r.href", newUrl)
window.history.pushState({ path: newUrl }, '', newUrl)
}
Dies ist die genaue Antwort auf die Frage. Danke
– Raffe
26. Dezember 2020 um 16:22 Uhr
genial, danke dafür!
– Dylan McCurry
21. Oktober 21 um 16:33 Uhr
jmona789
Aufbauend auf Fabios Antwort habe ich zwei Funktionen erstellt, die wahrscheinlich für jeden nützlich sein werden, der über diese Frage stolpert. Mit diesen beiden Funktionen können Sie anrufen insertParam() mit einem Schlüssel und Wert als Argument. Es fügt entweder den URL-Parameter hinzu oder, wenn bereits ein Abfrageparameter mit demselben Schlüssel vorhanden ist, ändert es diesen Parameter auf den neuen Wert:
//function to remove query params from a URL
function removeURLParameter(url, parameter) {
//better to use l.search if you have a location/link object
var urlparts= url.split('?');
if (urlparts.length>=2) {
var prefix= encodeURIComponent(parameter)+'=';
var pars= urlparts[1].split(/[&;]/g);
//reverse iteration as may be destructive
for (var i= pars.length; i-- > 0;) {
//idiom for string.startsWith
if (pars[i].lastIndexOf(prefix, 0) !== -1) {
pars.splice(i, 1);
}
}
url= urlparts[0] + (pars.length > 0 ? '?' + pars.join('&') : "");
return url;
} else {
return url;
}
}
//function to add/update query params
function insertParam(key, value) {
if (history.pushState) {
// var newurl = window.location.protocol + "//" + window.location.host + search.pathname + '?myNewUrlQuery=1';
var currentUrlWithOutHash = window.location.origin + window.location.pathname + window.location.search;
var hash = window.location.hash
//remove any param for the same key
var currentUrlWithOutHash = removeURLParameter(currentUrlWithOutHash, key);
//figure out if we need to add the param with a ? or a &
var queryStart;
if(currentUrlWithOutHash.indexOf('?') !== -1){
queryStart="&";
} else {
queryStart="?";
}
var newurl = currentUrlWithOutHash + queryStart + key + '=' + value + hash
window.history.pushState({path:newurl},'',newurl);
}
}
wie Ihre Funktionen sind besser als new URLSearchParams() mit seinen nativen Methoden als einstellen und löschen? In beiden Fällen müssen wir es in die Geschichte mit einbeziehen history.pushState()
– Alexey Nikonov
5. November 19 um 8:50 Uhr
new URLSearchParams() wird von keiner Version des IE unterstützt
– jmona789
5. November 19 um 15:41 Uhr
Danke @jmona789, das hat perfekt für mich funktioniert und war genau das, wonach ich gesucht habe
– Knopf
18. Juni 2020 um 20:56 Uhr
Ian Newson
Ich habe die folgende JavaScript-Bibliothek mit großem Erfolg verwendet:
Es unterstützt die HTML5-Verlaufs-API sowie eine Fallback-Methode (mithilfe von #) für ältere Browser.
Diese Bibliothek ist im Wesentlichen ein Polyfill um `history.pushState’ herum.
Da jeder, der darauf antwortet, den Hash zu vergessen scheint, möchte ich den Code hinzufügen, den ich verwende, um ihn zu behalten alle URL-Parameter:
const urlParams = new URLSearchParams(window.location.search);
/// Change some part of the URL params
if (history.pushState) {
const newurl =
window.location.protocol +
"//" +
window.location.host +
window.location.pathname +
"?" +
urlParams.toString() +
window.location.hash;
window.history.replaceState({ path: newurl }, "", newurl);
} else {
window.location.search = urlParams.toString();
}
faul
Wenn wir einfach den Abfrageparameter aktualisieren möchten, ohne andere Teile der URL zu berühren, besteht keine Notwendigkeit, die URL erneut zu erstellen. Das verwende ich:
Können Sie einen Link zu einer Beispielsite posten, die ihre Abfragezeichenfolge dynamisch aktualisiert? Ich glaube nicht, dass es getan werden kann, aber Sie kann Ändern Sie den Hash-Wert und das könnte ausreichen, um das zu bekommen, was Sie wollen.
– Spitze
10. Juni 12 um 15:50 Uhr
mögliches Duplikat, wie man die URL mit Javascript/jquery manipuliert?
– QUentin
10. Juni 12 um 15:52 Uhr
mögliches Duplikat von Wie ändert GitHub die URL, aber nicht das Neuladen?
– QUentin
10. Juni 12 um 15:53 Uhr
mögliches Duplikat von Warum kann die neue Web-Dropbox die URL ohne Seitenaktualisierung ändern? und die drei Fragen, von denen es als Duplikat gekennzeichnet ist
– QUentin
10. Juni 12 um 15:54 Uhr
@QUentin. Sie können nur eine engere Abstimmung haben …
:)
– gdoron unterstützt Monica
10. Juni 12 um 15:56 Uhr