将历史状态替换到同一路径后,Javascript使用哈希重定向

将历史状态替换到同一路径后,Javascript使用哈希重定向,javascript,redirect,backbone.js,Javascript,Redirect,Backbone.js,我有两个主干模型更改事件同时发生: change:path替换当前历史状态并修补某些链接 在页面上 change:language应重定向到带有附加哈希的新路径 重定向应该取代替换状态,但如果提供哈希,则不会发生这种情况。我正在努力让它在Chrome中工作 此代码不重定向: // in change:path event window.history.replaceState({state: 1}, "", "/new_path"); // in change:language event w

我有两个主干模型更改事件同时发生:

  • change:path
    替换当前历史状态并修补某些链接 在页面上
  • change:language
    应重定向到带有附加哈希的新路径
  • 重定向应该取代替换状态,但如果提供哈希,则不会发生这种情况。我正在努力让它在Chrome中工作

    此代码不重定向:

    // in change:path event
    window.history.replaceState({state: 1}, "", "/new_path");
    
    // in change:language event
    window.location.replace("/new_path#hash");
    
    但如果没有散列,它将按预期工作:

    // in change:path event
    window.history.replaceState({state: 1}, "", "/new_path");
    
    // in change:language event
    window.location.replace("/new_path");
    

    有没有办法让它和哈希一起工作?我知道我可以添加一些时间戳以使新url完全不同,但我希望url是干净的。

    我已经设法以一种不那么干净的方式解决了它,但我仍在寻找更好的解决方案:

    // change:path event
    window.history.replaceState({state: 1}, "", "/new_path");
    
    // change:language event
    setTimeout(function(){
      // make sure it runs after replaceState in change:path
      window.history.replaceState({}, "", "/"); 
      window.location.replace("/new_path#hash");
    }, 10);
    

    看起来最好的方法不是使用
    replace
    方法,而是将位置作为一个整体进行设置。像这样:

    window.location.href = 'http://www.sitename.com/new_path#hash';
    

    您是否尝试过将#符号编码为%23?我刚刚尝试过,将#符号编码为%23使其成为路径的一部分。而不是
    window.location.replace(“/new#path#yourHash”)
    ,您可以这样更改哈希值:
    window.location.hash=“yourHash”在调用replaceState后不会重定向。您可以自己尝试,打开控制台并运行以下代码:
    window.history.replaceState({state:1},“,”/new_path”);window.location.href=window.location.origin+“/new_path#hash”它不会重定向。我重定向了,它确实有效。你使用的是什么版本的Chrome?我问这个问题的原因是,不久前有一个版本的哈希有点奇怪,我正在使用最新的Chrome for OS X,这段代码只替换位置,不重定向页面。
    replaceState
    使用
    window.location.href
    重定向后。由于您试图用要访问的url替换历史状态,因此您应该能够在页面加载的下一页上获取“当前”url,并用它替换历史状态。