设置 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】:

pathnamelocation 的许多其他属性和链接仅反映 URL 的 部分

http:  //www.example.com/path/to/example.html?param1=2&param3=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的主要内容,如果未能解决你的问题,请参考以下文章

js基础之Window Location(BOM)

js基础之Window Location(BOM)

用jquery延迟自动url重定向?

如何使用 vueJS 在内部数组中显示 JSON 数据?

修改正则表达式以突出显示当前菜单项

Node.js-在确认框中单击确定时如何删除条目