Javascript 如何在浏览器中检测“后退”按钮?

Javascript 如何在浏览器中检测“后退”按钮?,javascript,jquery,html,Javascript,Jquery,Html,我有一个名为back()的函数,它将用于ajax调用。实际上,我有一个数组堆栈,其中包含最后5个搜索结果,而back函数将切换到上一个结果集(根据该数组堆栈),当您单击back按钮时,它甚至会使用window.history.pushState()更改URL 我刚才提到的后退按钮是浏览器中的一个元素,它撤销了back()函数。现在,当用户单击浏览器的“后退”按钮时,我想撤销back()函数。大概是这样的: window.onhashchange = function() { back(); /

我有一个名为
back()
的函数,它将用于ajax调用。实际上,我有一个数组堆栈,其中包含最后5个搜索结果,而back函数将切换到上一个结果集(根据该数组堆栈),当您单击back按钮时,它甚至会使用
window.history.pushState()
更改URL

我刚才提到的后退按钮是浏览器中的一个元素,它撤销了
back()
函数。现在,当用户单击浏览器的“后退”按钮时,我想撤销
back()
函数。大概是这样的:

window.onhashchange = function() {
 back(); // this function also changes the url
}
但遗憾的是,当我点击浏览器背面时,window.onhashchange将被撤销两次。因为当您使用
window.history.pushState()
更改URL时,
window.onhashchange
将被撤销

无论如何,我怎样才能检测出URL发生了什么变化?我的JS代码或浏览器的后退按钮?

您可以使用

在任何给定点,例如在
document.onload
上,可以读取
类型的值,如果是:

  • 0
    通过链接、书签、表单提交、脚本或在地址栏中键入URL访问该页面
  • 1
    通过单击重新加载按钮或通过Location.Reload()方法访问页面
  • 2
    通过导航到历史记录来访问该页面
  • 255
    任何其他方式
请注意,根据兼容性表,支持是有限的。
然而,从表面上看,这张桌子似乎过时了。它说它在chrome上不受支持,我刚刚对它进行了测试,并在我的chrome版本(67.0)上正常工作。

解决方案之一是使用localstorage选项实现onunload事件。 这是我的想法,也许你需要纠正,但这是基础

var history = [];

window.onload = function(){

  var handler;

  if ( localStorage.getItem('history') == null ) {
   // FIRST TIME
   history[0] = window.location.href;
   localStorage.setItem("history", JSON.stringify(history));
  }
  else {
   handler = localStorage.getItem('history');
   handler = JSON.parse(handler);
   history = handler;
   // Just compare now 
   if (history[history.length-1] == window.location.href) {
       // no change
   } else {
      history.push(window.location.href);     
   }

  }

}

window.onunload = function(){

   localStorage.setItem('history', JSON.stringify(history));

}
注意:

自2011年5月25日起,HTML5规范规定 可以使用window.alert()、window.confirm()和window.prompt()方法 在此事件中被忽略。有关更多信息,请参见HTML5规范 细节


您可以尝试不依赖浏览器后退/前进按钮我不依赖,我只想调用浏览器后退按钮上的一个函数。@Adelin似乎正是我要找的,您知道使用它的任何示例吗?既然您说这就是您要找的,我刚刚发布了一个答案。用法很简单->读取任意给定点的值。它只写一次,并且是只读的。。向上投票。只有一个问题,为什么当我点击浏览器的后退按钮时,
window.onhashchange=function(){}
没有被触发?注意到
if(“窗口中的onhashchange”){}
true
。很可能哈希没有改变。它确实改变了。。我也看到了URL的变化。我一直在谷歌上搜索。可能是其他事件正在取消这一项。还有一个你可以用的。显然,对于后退按钮,
popstate
也有很多解决方案。但是它
performance.navigation.type
在这两种情况下都返回
1
(我的网站后退按钮和浏览器后退按钮)