设置 JavaScript window.location
Posted
技术标签:
【中文标题】设置 JavaScript window.location【英文标题】:Setting JavaScript window.location 【发布时间】:2011-04-08 06:25:17 【问题描述】:我目前正在设置 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 的属性,例如路径名或 href?我发现一旦我设置了一个属性,就会重新加载位置,例如,不能单独设置搜索和路径名属性。可以直接设置window.location吗?我只需要设置一个带参数的相对URL。
【问题讨论】:
【参考方案1】:pathname
和 location
的许多其他属性和链接仅反映 URL 的 部分:
http: //www.example.com/path/to/example.html?param1=2¶m3=4#fragment
^protocol^hostname ^pathname ^search ^hash
如您所见,URL 的?...
部分不是pathname
的一部分;将包含?
的值写入location.pathname
是没有意义的,因为URL 的该部分不能包含问号。 Chrome 正在通过将字符编码为表示文字问号的序列来纠正您的错误,该序列不会终止 pathname
。
这些属性非常适合将 URL 分解为它们的组成部分以供您处理,但在这种情况下您可能不想写入它们。相反,写信给location.href
。这代表了整个 URL,但是写一个相对 URL 是完全可以的;这将相对于当前值计算出来,因此实际上根本不需要读取和拆分pathname
:
location.href= 'myPage.xhtml?u='+encodeURIComponent(selected_user.Username);
注意 URL 编码。如果用户名可以包含字母数字以外的字符,您可能需要它来阻止这些字符破坏参数。始终对任意字符串进行 URL 编码,然后再将它们放入 URL 的一部分。
【讨论】:
感谢您的详细解释。我已将代码更改为使用 href 属性并调用 encodeURIComponent()。 请注意for most cases,您要使用location.host
而不是location.hostname
。简而言之,这是因为您的代码在某些时候可能会在服务器上的 80 端口以外的端口上运行。
请注意,在(极少数)源是 iframe 的情况下,它需要执行 window.parent.location .....【参考方案2】:
尝试设置location.href
属性而不是window.location.pathname
。
【讨论】:
window.location = ...
就够了
为 window.location
赋值会导致 TypeScript 出错。我想分配给window.location.href
是更好的选择。【参考方案3】:
使用window.location.href
被认为是设置 URL 的最安全方法。我认为这应该解决编码问题。
window.location.href = window.location.pathname.substring( 0, window.location.pathname.lastIndexOf( '/' ) + 1 ) + 'myPage.xhtml?u=' + selected_user.Username;
如果这没有帮助,请显示一个示例 URL。
【讨论】:
以上是关于设置 JavaScript window.location的主要内容,如果未能解决你的问题,请参考以下文章