【问题标题】:Problem with history.pushState when using AJAX使用 AJAX 时 history.pushState 的问题
【发布时间】:2019-04-23 09:01:04
【问题描述】:

我对 javascript 和历史 API 很陌生。

我正在发出 AJAX GET 请求以加载网站上的下一页或上一页。

function ajax_get_update(url)
    {
    $.ajax({
        async: true,
        type: "GET",
        url: url,
        cache: true,
        success: function(result){
              sessionStorage.setItem("result", result);
              update_content(result);
            }
    });
    history.pushState(url, url, url)
}

AJAX 部分和更改页面内容工作得非常好。如您所见,我正在使用history.pushState(url, url, url) 将下一页添加到历史记录中,因此我可以使用后退按钮返回该页面。

url 看起来像这样 http://127.0.0.1:8000/?page=2

问题是如果我从page2 继续page3 然后再到page3 等等,那么历史将包含所有这些转换,当我点击返回按钮时,我会不断改变在我最终到达page1 之前,在page2page3 之间来回几次。我要的是page3 -> page2 -> page1等等。

你会如何解决这个问题?

【问题讨论】:

  • 这就是历史记录的工作方式:) 您可以尝试将您的history.pushState() 移动到成功处理程序中,并仅在某些情况下更新历史记录。我还建议仅在 ajax 请求成功的情况下更新您的历史记录,否则您的应用程序可能会出现无效状态。
  • @gearsdigital 好电话。关于如何在后退按钮上实现此行为page3 -> page2 -> page1 的任何想法?而不是page3->page2->page3->page2...
  • 您有关于当前页面的任何信息吗?除了url?
  • @gearsdigital 不是真的...虽然内容是独一无二的
  • 但是参数总是?page?

标签: javascript url url-rewriting html5-history


【解决方案1】:

这是未经测试的,但应该符合您的需求。这里的想法是只为新添加的 url 更新 window.history

对于每个成功的请求,我们都会检查当前的 url 是否存在于 myState 中。如果没有,我们可以假设一个新页面并更新历史记录并将 url 放入我们的私有缓存 myState

这将使您的网址井井有条并防止重复的历史条目。

请注意,此代码使用的是 ES2015。你可以在网上搜索 polyfills :)

// it is probably not a good idea to keep your own history
let myState = [];

function ajax_get_update(url) {
  $.ajax({
    async: true,
    type: "GET",
    url: url,
    cache: true,
    success: function(result) {
      sessionStorage.setItem("result", result);
      update_content(result);
      update_history(url);
    }
  });
}

function update_history(url) {
  // window.history is only updated when the current url is not
  // saved in our private history
  if (!myState.includes(url)) {
    history.pushState(url, url, url);
    myState.push(url);
  }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
相关资源
最近更新 更多