【问题标题】:Assigning to document.location.href without clobbering history在不破坏历史记录的情况下分配给 document.location.href
【发布时间】:2010-10-26 06:20:36
【问题描述】:

在测试 document.location.href 时,我观察到,当用户启动一个导致分配给 document.location.href 的 javascript 的操作时,新 URL 会添加到历史记录中。

但是,如果调用是由 javascript 发起的,例如 XMLHTTPRequest 的状态更改,则历史记录中当前页面的条目将被覆盖。我是否正确地描述了这一点?在后一种情况下,有没有办法让页面更改反映在历史记录中?

【问题讨论】:

  • 我不太确定你想做什么。是要将点击项从历史记录中删除,还是要将非点击地址更改推送到历史记录?
  • 第二个——我希望我的服务器能够告诉客户端导航到一个新页面——保留历史——作为对 XMLHttpRequest 的响应的结果

标签: javascript


【解决方案1】:

我遇到了同样的问题,发现这个解决方法对我有用

而不是

function onAjaxCallback(evt){
    location.href=newLocation;
}

我将 location.href 调用包裹在 setTimeout 周围。似乎可以解决问题。我的历史现在表现良好。希望有帮助

function onAjaxCallback(evt){
    setTimeout(function(){
        location.href=newLocation;
    },0)
}

【讨论】:

【解决方案2】:

您可以在不让浏览器显示返回按钮的情况下更改位置,如下所示:

window.location.replace(new_url);

但是,原始地址仍保留在浏览器的历史记录中,可以使用 CTRL+H

之类的方式访问

参考:

【讨论】:

    【解决方案3】:

    研究:window.location.replace() 和 window.location.assign()

    【讨论】:

      【解决方案4】:

      更仔细地阅读原始问题。问题不是关于由 XHR 加载的内容,而是关于由 XHR 加载的内容由脚本加载。我遇到了同样的问题,setTimeout 方法似乎运行良好。

      【讨论】:

        【解决方案5】:

        可以在重定向用户之前手动将 URL 添加到历史记录中。

        if (window.history) {
            history.pushState({}, window.location.href);
        }
        window.location.replace("/login/?next=" + window.location.pathname);
        

        【讨论】:

        • window.location.replace 替换当前历史记录项,因此您无法返回。如果使用window.location=...,则不需要pushState。
        【解决方案6】:

        唉,你的问题无法回答,AJAX 请求与浏览器历史无关,如果你用它们加载了一些动态内容,那么用户点击了浏览器的返回按钮,上一个 页面已加载(这是通过普通的 GET 或 POST 请求加载的),这会破坏您显示内容的顺序。

        Dmitri 的回答意味着您将使用 url 的片段部分(在 # 符号之后)维护自己的动态内容历史记录,也许您会提供自己的后退和前进按钮,但您仍然没有免受浏览器后退和前进按钮的影响。

        如果他们提供某种事件来处理用户对这些按钮的点击并能够取消。

        【讨论】:

          猜你喜欢
          • 2011-01-29
          • 1970-01-01
          • 1970-01-01
          • 2011-07-20
          • 2012-03-07
          • 1970-01-01
          • 2020-01-31
          • 1970-01-01
          • 2023-04-07
          相关资源
          最近更新 更多