【问题标题】:Page history - back button exists?页面历史记录 - 后退按钮是否存在?
【发布时间】:2023-04-08 10:41:01
【问题描述】:

是否可以检查 history.go(-1) 是否有值?我知道你不能直接访问 history.previous。

我试图远离 document.referrer,因为我知道它在某些情况下可能会被阻止。

这就是我想要做的。我有一个错误页面,在这个页面上我想要一个返回按钮(如果它不是历史上唯一的项目)或一个关闭按钮(如果它是)。

【问题讨论】:

标签: javascript


【解决方案1】:
if (history.length) {
    //There is history to go back to
    history.go(-1);
}    

【讨论】:

  • 哈,哈!有时这是最简单的答案。
  • 有没有办法检查前进按钮是否存在?
  • 是否检查上一页是否为about:newtab ;)
  • 这是不正确的,因为history.length 不仅包括后页,还包括前页。因此,如果您打开浏览器选项卡,点击链接,单击“返回”,历史长度将大于零,而您无法再次返回。
  • @Finesse 我真的不知道这个答案怎么能这么投票
【解决方案2】:

没有跨浏览器的方法来实现这一点。即使不存在历史记录条目,也可以设置 Document.Referrer。

我想出了以下“hack”。它利用 onbeforeunload 事件来检测浏览器是否开始离开页面。如果它不在某个时间跨度内,它只会重定向到后备。

window.goBack = function goBack(fallback){
  var useFallback = true;
  window.onbeforeunload = function(){
    useFallback = false;
  }
  window.history.back();

  setTimeout(function(){
    if (useFallback){ window.location.href = fallback; }
  }, 100); 
}

您可以使用goBack("fallback.example.org") 调用此函数。

其中一个用例是,您可能希望向任何页面添加后退按钮,并且还希望确保即使用户直接进入此页面(例如通过书签、直接链接等),此后退按钮也能正常工作.

所以它要么执行 history.back() 要么如果没有条目,它会重定向到回退。

【讨论】:

    【解决方案3】:

    实际上,history.length 总是一个或多个,因为当前页面很重要。此外,如果您有前进历史记录(即您使用了后退按钮),这些页面也算在内。所以你需要一个更复杂的检查:

    if( (1 < history.length) && document.referrer ) {
    

    【讨论】:

    • 有没有办法检查前进按钮是否存在?
    • 如果点击target="_blank"链接,则通过Referrer,并且您不能在新标签中“返回”,因此该解决方案并不完美。
    • @Finesse 是对的,所以我做了这个stackoverflow.com/a/68161306/1348517
    【解决方案4】:
     function test() {
            document.URL = document.referrer;            
        }
    

    【讨论】:

      【解决方案5】:

      如果历史的长度大于 0,那么它至少包含一个历史点。

      if (history.length)
      

      【讨论】:

      • 是的,那个历史点也可能是about:newtab 对吗?
      猜你喜欢
      • 1970-01-01
      • 2015-10-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-23
      • 1970-01-01
      • 2015-05-18
      • 1970-01-01
      • 2011-11-15
      相关资源
      最近更新 更多