Wie aktualisieren wir URLs oder Abfragezeichenfolgen mit Javascript / jQuery, ohne die Seite neu zu laden?

76

Gibt es eine Möglichkeit, die URL programmgesteuert zu aktualisieren, ohne die Seite neu zu laden?

BEARBEITEN: Ich habe dem Titel im Beitrag etwas hinzugefügt. Ich möchte nur klarstellen, dass ich die Seite nicht neu laden möchte

Developarvin
quelle
Geben Sie ein Beispiel dafür, was Sie erreichen möchten.
Konstantin Dinev
Möchten Sie die sichtbare URL (in der Adressleiste) oder die Dokument-URL-Zeichenfolge im DOM ändern?
Maurice
@ Maurice Ich möchte nur die sichtbare URL ändern
Developarvin
Verwenden Sie window.history.replaceState () wie in diesem Beispiel
Prasad De Silva

Antworten:

40

Ja - document.location = "http://my.new.url.com"

Sie können es auch auf die gleiche Weise abrufen, z.

var myURL = document.location;
document.location = myURL + "?a=parameter";

Das Standortobjekt hat auch eine Reihe nützlicher Eigenschaften:

hash            Returns the anchor portion of a URL
host            Returns the hostname and port of a URL
hostname        Returns the hostname of a URL
href            Returns the entire URL
pathname        Returns the path name of a URL
port            Returns the port number the server uses for a URL
protocol        Returns the protocol of a URL
search          Returns the query portion of a URL

BEARBEITEN: Wenn Sie den Hash des Dokuments festlegen, sollte die Seite nicht neu geladen werden. Ändern Sie einfach, wo auf der Seite der Fokus liegt. Wenn Sie also auf aktualisieren, #myIdwird mit zu dem Element gescrollt id="myId". Wenn das idnicht existiert, glaube ich, wird nichts passieren? (Muss jedoch in verschiedenen Browsern bestätigt werden)

EDIT2: Um es klar zu machen, nicht nur in einem Kommentar: Sie können nicht die gesamte URL mit Javascript aktualisieren, ohne die Seite zu ändern. Dies ist eine Sicherheitsbeschränkung. Andernfalls können Sie auf einen Link zu einer zufälligen Seite klicken, die so gestaltet ist, dass sie wie Google Mail aussieht, und die URL sofort in www.gmail.com ändern und die Anmeldedaten von Personen stehlen.
Sie können den Teil nach der Domain in einigen Browsern ändern, um mit Dingen im AJAX-Stil fertig zu werden, aber das wurde bereits von Osiris verlinkt. Darüber hinaus sollten Sie dies wahrscheinlich nicht tun, selbst wenn Sie könnten. Die URL teilt dem Benutzer mit, wo er sich auf Ihrer Website befindet. Wenn Sie es ändern, ohne den Seiteninhalt zu ändern, wird es etwas verwirrend.

Matt Fellows
quelle
1
Ich möchte die gesamte URL aktualisieren, nicht nur Hashes
Developarvin
4
Sie können nicht die gesamte URL mit Javascript aktualisieren, ohne die Seite zu ändern. Dies ist eine Sicherheitsbeschränkung. Andernfalls können Sie auf einen Link zu einer zufälligen Seite klicken und die URL sofort www.gmail.com anzeigen lassen und die Anmeldungen von Personen stehlen.
Matt Fellows
21
Durch das Einstellen document.locationwird die Seite neu geladen.
Alain Tiemblo
Danke @AlainTiemblo - wenn Sie die ganze Antwort lesen, werden Sie sehen, dass ich das mit den bereits erwähnten Vorbehalten anerkenne.
Matt Fellows
Gute tiefe Erklärung.
MH
93

Ja und nein. Alle gängigen Webbrowser verfügen über eine Sicherheitsmaßnahme, um dies zu verhindern. Ziel ist es, zu verhindern, dass Personen Replikate von Websites erstellen, die URL so ändern, dass sie korrekt aussieht, und dann in der Lage zu sein, Personen auszutricksen und ihre Informationen abzurufen.

Einige HTML5-kompatible Webbrowser haben jedoch eine Verlaufs-API implementiert, die für ähnliche Aufgaben verwendet werden kann:

if (history.pushState) {
    var newurl = window.location.protocol + "//" + window.location.host + window.location.pathname + '?myNewUrlQuery=1';
    window.history.pushState({path:newurl},'',newurl);
}

Ich habe getestet und es hat gut funktioniert. Die Seite wird nicht neu geladen, sondern Sie können nur die URL-Abfrage ändern. Sie können das Protokoll oder die Hostwerte nicht ändern.

Für mehr Informationen:

http://diveintohtml5.info/history.html

https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Manipulating_the_browser_history

Fabio Nolasco
quelle
Wenn Sie auf "Zurück" klicken, werden die Änderungen entfernt, aber die Idee gefällt mir.
Alain Tiemblo
Dieser Ansatz funktioniert in einigen Browsern nicht, da er window.location.pathnameeinen Schrägstrich enthält /und der Ergebniswert http://my.domain.com/?myNewUrlQuery=1stattdessen sein könnte http://my.domain.com?myNewUrlQuery=1.
pto3
7

Sie können verwenden:

window.history.pushState('obj', 'newtitle', newUrlWithQueryString)
Sud
quelle
oder window.history.replaceState ('obj', 'newtitle', newUrlWithQueryString), wenn die URL-Änderung nicht im Verlauf gespeichert werden soll.
TamusJRoyce
4

Verwenden

window.history.replaceState ({}, document.title, updatedUri);

So aktualisieren Sie die URL, ohne die Seite neu zu laden

 var url = window.location.href;
 var urlParts = url.split('?');
 if (urlParts.length > 0) {
     var baseUrl = urlParts[0];
     var queryString = urlParts[1];

     //update queryString in here...I have added a new string at the end in this example
     var updatedQueryString = queryString + 'this_is_the_new_url' 

     var updatedUri = baseUrl + '?' + updatedQueryString;
     window.history.replaceState({}, document.title, updatedUri);
 }

So entfernen Sie die Abfragezeichenfolge, ohne die Seite neu zu laden

var url = window.location.href;
if (url.indexOf("?") > 0) {
     var updatedUri = url.substring(0, url.indexOf("?"));
     window.history.replaceState({}, document.title, updatedUri);
}
Prasad De Silva
quelle
Ich habe mir gerade die Dokumentation von Mozilla angesehen, weil window.history.replaceState()ich nicht sicher bin, was die drei Parameter bewirken. Können Sie das erklären? Der zweite document.titlescheint speziell nichts zu tun.
Tfantina
replaceState()funktioniert genau pushState()so, überprüfen Sie die Beschreibungen der Parameter für die pushState()Methode . titleParameter wird vorerst ignoriert, wird aber möglicherweise in Zukunft verwendet.
Prasad De Silva
2

Definieren Sie ein neues URL-Objekt, weisen Sie ihm die aktuelle URL zu, hängen Sie Ihre Parameter an dieses URL-Objekt an und verschieben Sie es schließlich in den Status Ihres Browsers.

var url = new URL(window.location.href);
//var url = new URL(window.location.origin + window.location.pathname) <- flush existing parameters
url.searchParams.append("order", orderId);
window.history.pushState(null, null, url);
Ronnie Royston
quelle
1

Die Präfix-URL ändert sich mit einem Hashtag, um eine Umleitung zu vermeiden.

Dies leitet um

location.href += '&test='true';

Dies leitet nicht um

location.href += '#&test='true';
Timothy Gonzalez
quelle
0

Einfaches Javascript: document.location = 'http://www.google.com';

Dies führt jedoch zu einer Aktualisierung des Browsers. Verwenden Sie möglicherweise Hashes, wenn die URL aktualisiert werden muss, um einen Browserverlauf zu implementieren, ohne die Seite neu zu laden. In diesem Fall sollten Sie sich jQuery.hashchange ansehen.

Claus
quelle
1
Ja, es verursacht eine Browseraktualisierung. War auf der Suche nach etwas, das nicht neu geladen werden kann.
Developarvin
Es sollte möglich sein, auf Seitenaktualisierungen zu verzichten, aber es wird meines Wissens nur in neueren Browsern unterstützt. Sie sollten stattdessen die Hash-URL ändern.
Claus
0

Sie müssen genauer sein. Was meinst du mit "URL aktualisieren"? Es könnte bedeuten, automatisch zu einer anderen Seite zu navigieren, was sicherlich möglich ist.

Wenn Sie nur den Inhalt der Adressleiste aktualisieren möchten, ohne die Seite neu zu laden , lesen Sie Ändern der URL, ohne die Seite neu zu laden

Osiris
quelle
Danke für den Link! Ich schaue auf die Antworten
Developarvin
-3

Ja - document.location.hashfür Fragen

römisch
quelle
1
Es lädt die Seite neu. Ich suche nach einer Lösung, die die Seite nicht entfernt.
Developarvin
Ja, natürlich wird die Seite neu geladen. Sie müssen dies mit Ajax kombinieren, um eine neue Seite zu erhalten und deren Inhalt einzufügen.
Roman
Die Person, die die Frage stellt, möchte die Seite nicht neu laden.
Chewie The Chorkie