2010-09-04 23 views
37

Ich setze derzeit die Eigenschaft window.location.pathname, um den Benutzer auf eine relative URL umzuleiten. Die neue URL hat Parameter, so dass die Zeile JavaScript sieht wie folgt aus:Einstellen von JavaScript window.location

window.location.pathname = window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/') + 1) + 'myPage.xhtml?u=' + selected_user.Username; 

Dies ist erfolgreich in Firefox, aber Chrome codiert die Fragezeichen mit '% 3F und die Anforderung anschließend fehlschlägt.

Ich bin mir nicht sicher, ob ich window.location richtig verwende. Muss ich Eigenschaften von window.location wie Pfadname oder href verwenden? Ich habe festgestellt, dass der Speicherort neu geladen wird, sobald ich eine Eigenschaft festgelegt habe. So können beispielsweise die Such- und Pfadnameneigenschaften nicht separat festgelegt werden. Kann window.location direkt eingestellt werden? Ich muss nur eine relative URL mit einem Parameter festlegen.

Antwort

56

pathname und viele andere Eigenschaften von location und Links spiegeln nur Teil der URL:

http: //www.example.com/path/to/example.html?param1=2&param3=4#fragment 
^protocol^hostname  ^pathname   ^search   ^hash 

Wie Sie sehen können, der ?... Teil der URL ist nicht Teil der pathname; Es macht keinen Sinn, einen Wert zu schreiben, der ? zu location.pathname enthält, da dieser Teil einer URL kein Fragezeichen enthalten kann. Chrome korrigiert Ihren Fehler, indem das Zeichen in eine Sequenz codiert wird, die ein literales Fragezeichen bedeutet, das nicht pathname beendet.

Diese Eigenschaften eignen sich hervorragend zum Aufteilen einer URL in ihre Bestandteile, die Sie verarbeiten müssen. In diesem Fall möchten Sie jedoch wahrscheinlich nicht in sie schreiben. Schreiben Sie stattdessen an location.href. Dies stellt die gesamte URL dar, aber es ist vollkommen in Ordnung, eine relative URL zu schreiben; dies wird auf den aktuellen Wert relativ werden, ausgearbeitet, so gibt es keine Notwendigkeit, in der Tat zu lesen und teilen Sie die pathname überhaupt:

location.href= 'myPage.xhtml?u='+encodeURIComponent(selected_user.Username); 

Beachten Sie die URL-Codierung. Wenn ein Benutzername andere Zeichen als alphanumerische Zeichen enthalten kann, benötigen Sie diese Funktion, um zu verhindern, dass diese Zeichen den Parameter verletzen. URL-codieren Sie immer beliebige Zeichenfolgen, bevor Sie sie in einen Teil einer URL einfügen.

+1

Danke für die detaillierte Erklärung. Ich habe meinen Code geändert, um die Eigenschaft href zu verwenden und auch encodeURIComponent() aufzurufen. – Mark

+1

Bitte beachten Sie, dass [in den meisten Fällen] (http://stackoverflow.com/questions/6725890/window-location-host-vs-window-location-hostname-and-cross-browser-compatibility) '' verwendet werden soll location.host' anstelle von 'location.hostname'. Kurz gesagt, das ist, weil Ihr Code irgendwann in einem Server auf einem anderen Port als 80 laufen kann. –

+0

Beachten Sie, dass in seltenen Fällen, wenn die Quelle ein Iframe ist, sie window.parent.location ausführen muss. ... –

11

Versuchen Sie, die location.href Eigenschaft anstelle von window.location.pathname zu setzen.

+0

nur 'window.location = ...' ist genug – vsync

+0

Das Zuweisen eines Werts zu 'window.location' verursacht einen Fehler in TypeScript. Ich denke, die Zuweisung zu 'window.location.href' ist die bessere Option. – mvermand

7

Die Verwendung von window.location.href gilt als der sicherste Weg zu eine URL festgelegt. Ich denke, diese sollte das Codierungsproblem beheben.

Wenn das nicht hilft, zeigen Sie bitte eine Beispiel-URL.

Verwandte Themen