我目前正在设置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。我是否需要使用window.location的属性,例如pathname或href?我发现,只要我设置了一个属性,就会重新加载该位置,因此,例如,不能单独设置搜索和路径名属性。可以直接设置window.location吗?我只需要设置一个带参数的相对URL。
答案 0 :(得分:57)
pathname
以及location
和链接的许多其他属性仅反映网址的部分:
http: //www.example.com/path/to/example.html?param1=2¶m3=4#fragment
^protocol^hostname ^pathname ^search ^hash
如您所见,网址的?...
部分不属于pathname
;将包含?
的值写入location.pathname
是没有意义的,因为URL的该部分不能包含问号。 Chrome正在通过将字符编码为序列来纠正您的错误,该序列意味着文字问号,该问号不会终止pathname
。
这些属性非常适合将URL拆分为其组成部分供您处理,但在这种情况下您可能不想写入它们。而是写信给location.href
。这表示整个URL,但写一个相对URL是完全正常的;这将相对于当前值计算出来,因此实际上根本不需要阅读和分割pathname
:
location.href= 'myPage.xhtml?u='+encodeURIComponent(selected_user.Username);
请注意网址编码。如果用户名可以包含字母数字以外的字符,您可能需要这个来阻止那些破坏参数的字符。在将任意字符串放入URL的一部分之前,始终对其进行URL编码。
答案 1 :(得分:13)
尝试设置location.href
属性而不是window.location.pathname
。
答案 2 :(得分:7)
使用window.location.href
被认为是设置网址的最安全方式。我认为应该修复编码问题。
window.location.href = window.location.pathname.substring( 0, window.location.pathname.lastIndexOf( '/' ) + 1 ) + 'myPage.xhtml?u=' + selected_user.Username;
如果这没有帮助,请显示示例网址。