如何检查用户是否可以返回浏览器历史logging

我想用JavaScript来查看是否有历史logging,我的意思是如果后退button在浏览器上可用。

简短的回答:你不能。

从技术上讲,有一个准确的方法,这将是检查属性:

history.previous 

但是,它不会工作。 这个问题是,在大多数浏览器中,这被认为是一个安全违规,通常只是返回undefined

 history.length 

是别人build议的财产…
然而 ,这个长度并不是完全可行的,因为它并不表示你在哪里 。 另外,它并不总是以相同的数字开始。 例如,浏览器未设置login页面,则从0开始,而另一个使用朗读页面的浏览器将从1开始。

替代文字

大多数时候添加一个链接,调用:

 history.back(); 

要么

  history.go(-1); 

只是预计,如果你不能回去,那么点击链接什么也不做。

还有另一种方法来检查 – 检查推荐人。 第一页通常会有一个空的推荐人…

 if (document.referrer == "") { window.close() } else { history.back() } 

我的代码让浏览器返回一页,如果失败,它会加载一个后备url。 它也检测标签变化。

当后退button不可用时,后备url将在500毫秒后加载,因此浏览器有足够的时间加载前一页。 在window.history.go(-1);之后加载后备urlwindow.history.go(-1); 会导致浏览器使用回退url,因为js脚本还没有停止。

 function historyBackWFallback(fallbackUrl) { fallbackUrl = fallbackUrl || '/'; var prevPage = window.location.href; window.history.go(-1); setTimeout(function(){ if (window.location.href == prevPage) { window.location.href = fallbackUrl; } }, 500); } 

这似乎是诀窍:

 function goBackOrClose() { window.history.back(); window.close(); //or if you are not interested in closing the window, do something else here //eg theBrowserCantGoBack(); } 

调用history.back()然后window.close()。 如果浏览器能够回到历史中,将无法进入下一个语句。 如果不能返回,它会closures窗口。

不过,请注意,如果通过键入一个url已经到达页面,那么firefox将不允许脚本closures窗口。

您不能直接检查后退button是否可用。 你可以看看history.length>0 ,但是如果当前页面还有页面的话,那么这个结果也是一样的。 只有当history.length===0时,才能确保后退button不可用。

如果这还不够好,所有你可以做的就是调用history.back() ,如果你的页面仍然被加载,后退button是不可用的! 当然,这意味着如果后退button可用,则您刚刚从页面导航。 你不能在onunload取消导航,所以你可以做的所有事情都是从onbeforeunload返回一些东西,这会导致一个恼人的提示出现。 这不值得。

事实上,对于历史来说,这是一个非常糟糕的想法。 历史导航是为浏览器铬,而不是网页。 添加“返回”链接通常会导致更多的用户困惑,而不是价值。

这是我如何做到的。

我用'beforeunload'事件来设置一个布尔值。 然后我设置一个超时时间来观察'beforeunload'是否被触发。

 var $window = $(window), $trigger = $('.select_your_link'), fallback = 'your_fallback_url'; hasHistory = false; $window.on('beforeunload', function(){ hasHistory = true; }); $trigger.on('click', function(){ window.history.go(-1); setTimeout(function(){ if (!hasHistory){ window.location.href = fallback; } }, 200); return false; }); 

似乎在主stream浏览器(到目前为止testingFF,Chrome,IE11)工作。

 function back(url) { if (history.length > 2 || document.referrer.length > 0) { // go back: window.History.back(); } else if (url) { // go to specified fallback url: window.History.replaceState(null, null, url); } } 

history.length和用户的行为几乎没有可能:

  • 用户在浏览器中打开新的空标签 ,然后运行一个页面。 history.length = 2 ,我们希望在这种情况下禁用back() ,因为用户将转到空标签。
  • 用户通过单击之前的某个链接打开新标签中的页面。 history.length = 1 ,我们又想禁用back()方法。
  • 最后,用户在重新载入几页之后登陆当前页面history.length > 2 ,现在可以启用back()

在我的函数中,当history.length大于2或者document.referrer不为空时,启用back()方法。


注意:在点击外部网站的链接而没有target="_blank"之后,用户login当前页面时省略了大小写。

history.length是无用的,因为它不显示用户是否可以回顾历史。 另外不同的浏览器使用初始值0或1 – 这取决于浏览器。

工作的解决scheme是使用$(window).on('beforeunload'事件,但我不确定如果页面通过ajax加载,并使用pushState更改窗口历史logging将工作。

所以我使用了下一个解决scheme:

 var currentUrl = window.location.href; window.history.back(); setTimeout(function(){ // if location was not changed in 100 ms, then there is no history back if(currentUrl === window.location.href){ // redirect to site root window.location.href = '/'; } }, 100); 

要小心window.history.length因为它也包括window.history.forward()

所以你可能有可能有多于1个条目的window.history.length ,但没有历史logging条目。 这意味着如果你触发window.history.back()

我想出了以下的方法。 它利用onbeforeunload事件来检测浏览器是否开始离开页面。 如果它不在特定的时间范围内,它只会redirect到后备。

 var goBack = function goBack(fallback){ var useFallback = true; window.addEventListener("beforeunload", function(){ useFallback = false; }); window.history.back(); setTimeout(function(){ if (useFallback){ window.location.href = fallback; } }, 100); } 

你可以使用goBack("fallback.example.org")来调用这个函数。

浏览器有后退和前进button。 我就这个问题提出了一个解决scheme。 但是会影响浏览器的正向行为,导致一些浏览器的bug。

它的工作原理是这样的:如果浏览器打开一个从未打开过的新url,history.length将会增长。

所以你可以改变哈希像

  location.href = '#__transfer__' + new Date().getTime() 

得到一个从未显示的url,那么history.length将获得真正的长度。

  var realHistoryLength = history.length - 1 

但是,它并不总是工作得很好,我不知道为什么,尤其是当url自动跳转的时候。

还有另一个接近完美的解决scheme,从另一个SO回答 :

 if( (1 < history.length) && document.referrer ) { history.back(); } else { // If you can't go back in history, you could perhaps close the window ? window.close(); } 

有人报告说,使用target="_blank"它不起作用,但似乎在Chrome上工作。

 var fallbackUrl = "home.php"; if(history.back() === undefined) window.location.href = fallbackUrl; 

我不确定这是否可行,而且完全没有经过testing,但试试这个:

 <script type="text/javascript"> function goBack() { history.back(); } if (history.length > 0) { //if there is a history... document.getElementsByTagName('button')[].onclick="goBack()"; //assign function "goBack()" to all buttons onClick } else { die(); } </script> 

而在HTML的某处:

 <button value="Button1"> //These buttons have no action <button value="Button2"> 

编辑:

你还可以做什么是研究哪些浏览器支持后台function(我认为他们都这样做),并使用标准的JavaScript浏览器检测对象,并在本页面进行了详细描述。 然后你可以有两个不同的页面:一个用于与后退button兼容的“好浏览器”,另一个用于“不良浏览器”告诉他们更新浏览器

检查window.history.length是否等于0。