web-dev-qa-db-ja.com

JavaScript window.locationの設定

現在、window.location.pathnameプロパティを設定して、ユーザーを相対URLにリダイレクトしています。新しいURLにはパラメーターがあるため、JavaScriptの行は次のようになります。

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

これはFirefoxで成功しますが、Chromeは '%3F'で疑問符をエンコードし、その後リクエストは失敗します。

Window.locationを適切に使用しているかどうかはわかりません。パス名やhrefなどのwindow.locationのプロパティを使用する必要がありますか? 1つのプロパティを設定するとすぐに場所がリロードされるため、たとえば、検索プロパティとパス名プロパティを個別に設定することはできません。 window.locationを直接設定できますか?パラメータで相対URLを設定するだけです。

40
Mark

pathnameおよびlocationのその他の多くのプロパティとリンクは、URLのpartのみを反映します。

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

ご覧のとおり、URLの?...部分はpathnameの一部ではありません。 URLの一部に疑問符を含めることはできないため、?を含む値をlocation.pathnameに書き込むことは意味がありません。 Chromeは、pathnameを終わらせないリテラルの疑問符を意味するシーケンスに文字をエンコードすることにより、間違いを修正しています。

これらのプロパティは、処理するためにURLを構成部分に分割するのに最適ですが、この場合はおそらく書き込みたくないでしょう。代わりに、location.hrefに書き込みます。これはURL全体を表しますが、相対URLを記述することはまったく問題ありません。これは現在の値に関連して解決されるため、実際にはpathnameを読み取って分割する必要はありません。

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

URLエンコードに注意してください。ユーザー名に英数字以外の文字を含めることができる場合、パラメーターを壊すそれらの文字を止めるためにおそらくこれが必要になるでしょう。任意の文字列をURLの一部に入れる前に、常にURLエンコードします。

59
bobince

location.hrefの代わりにwindow.location.pathnameプロパティを設定してみてください。

13
Chris Laplante

window.location.hrefを使用することは、set URLへの最も安全な方法と見なされます。これはshouldエンコードの問題を修正すると思います。

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

それでも解決しない場合は、URLの例を示してください。

7
Pekka 웃