history.back() 在同一域上导航时不起作用?

Posted

技术标签:

【中文标题】history.back() 在同一域上导航时不起作用?【英文标题】:history.back() Not Working When Navigating Back on Same Domain? 【发布时间】:2020-12-27 02:10:44 【问题描述】:

我想实现一个功能,以确保在所有浏览器上提示返回以保持在给定域内,并避免在历史记录中跳回太远。

这是我目前的进度:

<script type="text/javascript">   
window.addEventListener("load", function(event)
    if (document.referrer.indexOf(window.location.host) !== -1) 
        history.back();
    
);
</script>

这是我之前实现的:

<script type="text/javascript">

window.addEventListener("load",function(event)
    var historyTraversal=event.persisted||
    (typeof window.performance!=="undefined"&&
    window.performance.navigation.type===2);
    if(historyTraversal)
        window.history.back();
    
);

</script>

这两个脚本有什么明显的区别吗?

【问题讨论】:

它们看起来一点也不相似,它们有很大的不同。您需要指定您尝试过的和没有工作的内容以及任何顾虑。仅针对改进代码的一般性请求对于关于 SO 的问题来说过于宽泛 在第一个脚本中,我尝试创建第二个脚本的更新版本,其中包含不推荐使用的内容。 【参考方案1】:

我想实现一个功能,以确保在所有浏览器上提示返回以保持在给定域内,并避免在历史记录中跳回太远。

您所写的似乎是窗口加载时的事件侦听器。你想什么时候使用你说的功能?

现在,您提供的第一个脚本执行一个函数on window load。该函数检查the referrer(链接到当前页面的页面的URL),如果当前主机名在该引荐来源URL中(即indexOf返回的值不是-1,表示匹配),然后浏览器返回。

假设存在此加载处理程序,则在每次页面加载时,浏览器都会返回,直到引荐来源网址不包含当前主机名。

但是,我不能说这完全符合您的要求 - 这取决于您返回到定义负载处理程序函数的每个页面。

回答你的第二个问题:

这两个脚本有什么明显的区别吗?

在您列出的第二个脚本中,您还有一个用于窗口加载事件的事件处理程序,但是第二个处理程序不是将主机名与引用者进行比较,而是依赖于已弃用的功能。检查PerformanceNavigation type,如果是2(表示通过历史“返回”导航到当前页面),则返回。

这两种方法的主要区别:

第一个函数基于域返回,而第二个函数根本不查看域 第二个函数依赖于已弃用的功能,而第一个函数更直接 只要通过返回到达当前页面,第二个函数就会返回,而第一个函数只有在前一个页面与当前页面位于同一域时才会返回

似乎第一个功能更符合您所说的您想要的,但似乎都不是特别好的方法,考虑到如果用户使用书签或键入链接访问链接,则引用者将为空直接在浏览器中(即不是通过链接指向该页面)。

相反,如果您可以在 cookie 或其他基于会话的存储中跟踪,跟踪用户从您想要返回的初始页面转发了多少页面,然后使用 @987654329 可能会更好@回到你一直跟踪的那么多页面n。 (参见:JavaScript going back multiple times in history)。

这当然会引入它自己的问题,特别是如果用户离开您的域然后又返回时会发生什么 - 弄清楚如何保持准确的计数,以便它始终返回到 URL 的最新初始实例您的域将是下一步。

【讨论】:

感谢您的广泛而深入的回答。我尝试实现此类代码的主要原因是第三方网站(Tumblr)的框架问题,该网站有一个错误,在移动浏览器上提示时不会加载上一页,而是重新加载当前页面一遍又一遍。我正在尝试覆盖它,第二个脚本确实解决了移动问题,但我试图在没有弃用内容的情况下实现某些东西,所以我有点陷入困境...... 没问题 - 很高兴为您提供帮助!当用户尝试返回时,是 Tumblr 上的用户(并且 Tumblr 只是重新加载而不是返回),还是您网站上的用户并尝试返回 Tumblr 并且历史记录不再有效,因此它重新加载了您的页面?我不清楚这里的实际用例。在我看来,你很难覆盖 Tumblr 所做的事情,因为你无法将代码注入他们的页面。你在使用 iframe 或嵌入式 Tumblr 页面或其他东西吗? 我之前发布了一个问题,它描述了手头的基本相同问题。这是一个链接:***.com/questions/63783447/…。我有一个演示站点,显示问题已部分解决,但 Firefox(桌面浏览器)仍然存在一些功能问题。 我无法访问 your demo site,因为您遇到了阻止我的 SSL 错误:SSL_ERROR_BAD_CERT_DOMAIN:“网站通过证书证明其身份。Firefox 不信任此站点,因为它使用证书不适用于 www.testblog123098.tumblr.com。证书仅对以下名称有效:*.tumblr.com、tumblr.com"

以上是关于history.back() 在同一域上导航时不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

history.back() 在 iOS 上的 Safari 中不起作用

JSF 中的取消按钮导航

onclick="history.back() 在 Safari 和 IE 中不起作用

window.history.back();不适用于共享点页面布局

如果 cookie 设置为同一域上的所有子域,则删​​除 cookie 不起作用

反应本机抽屉导航在按钮单击时不起作用