History.js pushState(数据、标题、url)将url连接(而不是替换)到地址栏(如果有尾随斜杠)

History.js pushState(数据、标题、url)将url连接(而不是替换)到地址栏(如果有尾随斜杠),history.js,History.js,比如说, 如果我使用“www.site.com”中的搜索栏,我会看到“www.site.com/search”,这很好 如果我使用“www.site.com/events/”中的搜索栏,我会看到“www.site.com/events/search”,这很愚蠢 为什么会这样?这是behavior还是history.js bug还是my bug?请举例说明您正在做什么 如果地址栏中的当前URL的格式为:http://somesite.com/path/ 然后传递pushState(null,nul

比如说,

如果我使用“www.site.com”中的搜索栏,我会看到“www.site.com/search”,这很好

如果我使用“www.site.com/events/”中的搜索栏,我会看到“www.site.com/events/search”,这很愚蠢


为什么会这样?这是behavior还是history.js bug还是my bug?

请举例说明您正在做什么

如果地址栏中的当前URL的格式为:
http://somesite.com/path/
然后传递
pushState(null,null,'newpath')
在这种情况下,链接看起来像
http://somesite.com/path/newpath
但如果将参数传递为:
pushState(null,null,/newpath')
,则在本例中如下所示:
http://somesite.com/newpath

如果您的应用程序没有部署在根目录下(例如使用虚拟目录,或者只是部署在更深层的层次结构中),那么如果您执行
history.pushState({},/newpath'),那么您最终会弄乱URL

有两种选择:

1) 在javascript变量中获取根路径,您只需将URL添加到该变量即可。在本例中,
window.ViewModel.rootPath
只是一个任意位置-只需修改它即可,无论您希望如何存储全局变量

您必须在脚本中设置
rootPath
(这里是.NET的示例)

如果当前URL是
/preview/store/yourcount
,则它将成为
。/yourcount/ManageClub/123

如果当前URL是
/preview/store/yourcount/
,则它将成为
yourcount/ManageClub/123


这两个URL都是相同的。

如果您的应用程序永远不会部署在服务器的根目录中,这将是非常危险的!请参阅我的答案以了解解决方法
<script>
    window.ViewModel.rootPath = "@Request.ApplicationPath";
</script>

history.pushState({}, window.ViewModel.rootPath + '/newpath');
history.pushState({ mode: 'Club' }, '',
     (window.location.href.endsWith('/') ? '../' : '') +
      'YourAccount/ManageClub/' + id );