Javascript Chrome 35在点击后退按钮后触发popstate

Javascript Chrome 35在点击后退按钮后触发popstate,javascript,jquery,google-chrome,popstate,Javascript,Jquery,Google Chrome,Popstate,我知道有很多主题与chrome和popstate事件有关,但在将chrome升级到35版后,我遇到了一个新的主题 情况就是这样: 我有一个带有类别和过滤器的列表页面,在您选择类别、页面等之后。内容通过ajax重新加载,所有内容都由history API处理,该API运行良好 但当你们进入列表中项目的详细页面-标准请求,整个页面被重新加载-然后按下浏览器上的后退按钮,你们可以看到一个列表页面,在你们上次点击一个项目的位置,但随后popstate被触发(我在这里不讨论初始页面加载时的chrome p

我知道有很多主题与chrome和popstate事件有关,但在将chrome升级到35版后,我遇到了一个新的主题

情况就是这样:

我有一个带有类别和过滤器的列表页面,在您选择类别、页面等之后。内容通过ajax重新加载,所有内容都由history API处理,该API运行良好

但当你们进入列表中项目的详细页面-标准请求,整个页面被重新加载-然后按下浏览器上的后退按钮,你们可以看到一个列表页面,在你们上次点击一个项目的位置,但随后popstate被触发(我在这里不讨论初始页面加载时的chrome popstate,因为在版本34中,popstate不再在init上触发),并且由于我前面提到的处理类别的代码,整个页面被重新加载

所以问题是chrome 35在我们按下后退按钮后触发popstate事件,我的问题是:

如何检测在用户从详细信息页面返回到我的列表页面而不重新加载此事件后触发此事件。


我尝试使用document object Referer等。但当它第一次看起来像解决方案时,总是会出现它不起作用的情况。

我遇到了这个问题。我的解决方案有点麻烦,但在其他方面似乎效果很好。我发现在设置onpopstate处理程序之前等待150毫秒就足够了Chrome将运行其初始onpopstate处理程序,您可以使用该处理程序发挥“优势”。例如,检测初始onpopstate是否已运行:

// wait for page to load
$(function() {
  var no_initial_onpopstate = true;
  var enabled = true;

  window.onpopstate = function() {
    if(!enabled) return;
    console.log("detected initial onpopstate");
    no_initial_onpopstate = false;
  }

  setTimeout(function() {
    enabled = false;
    console.log("No initial onpopstate: ", no_initial_onpopstate);

    // no_initial_onpopstate indicates if the browser emitted an initial
    // onpopstate event. Do with that information what you will

    // 150ms delay seems to be the "magic number" to wait for Chrome to
    // run all of its initial onpopstate handlers (in my tests on localhost, at least)
  }, 150);
});
因此,我由此推断,在浏览器DOM就绪事件150毫秒后设置“onpopstate”回调将跳过chrome的初始onpopstate