我试图找到一种干净的解决方案,以最有效的方式使用浏览器历史记录。 (我使用GWT,但这个问题确实比这更普遍。)
这是我的情况(我认为这很标准):
我有一个Web应用程序,它有几个不同的页面/位置/位置(无论你想叫它),我会根据浏览器历史记录的变化显示它。除了通常的" Home"," Features"," Contact"等等,这些都是静态HTML页面,还有一个" User"部分,人们可以登录他们的用户帐户并(让我们称之为)"项目"用户可以在其中处理项目的部分。
所以,现在我只使用名为 #Home , #Features , #Contact 等的本地链接,以及 #User , #Project 以访问不同的页面。一切都很好,除了以下情况:
例如,如果有人打开链接 #Project ,则会向该人显示项目登录对话框。这个登录对话框有一个 cancel 按钮,我想通过从我的应用程序调用浏览器的 back 按钮来实现它(很简单)。我想这样做的原因有两方面:
此时一切都很棒,除非用户最初通过指向 #Project 的直接书签链接进入此登录对话框。因为那时,如果我只是取消 = 返回,用户就会被完全从页面发送回浏览器的起始页面或者之前的任何地方。所以,在这种情况下,我确实需要链接"转发"到 #Home 。
现在,我已经尝试了几种方法来解决这个问题,并提出了几个解决方案,但似乎没有一个对我来说非常可取,但是让我分享它们可能会激起一些创造力:
这似乎应该是一个非常普遍的问题,我希望你们中的一个能指出一个比我的想法更有用的方向。
答案 0 :(得分:1)
window.history
具有length
属性,该属性将显示当前标签的历史记录中有多少条目。遗憾的是不可过滤(因此无法说出window.history.localURLs.length
)。
如果您几乎完全在客户端执行此操作(即部分更新,极少数整页加载,使用哈希或history.(push|pop)State
API),那么您可能需要考虑合并客户端路由框架进入你的应用程序,以避免重新发明轮子。
答案 1 :(得分:1)
在用户访问#LOGIN对话框之前,将执行您的入口点类。在本课程中,您可以记住最后一个已知页面。在Login activity / presenter中,您可以添加浏览器历史事件处理程序,该处理程序检查上一个已知位置是否为null。如果为null,则将用户发送到#HOME页面。
您无需向浏览器询问用户访问过的应用中的哪些位置。如果您愿意,您可以记住每个会话的完整历史记录:ie [#HOME,#LOGIN,#FEATURES,#Home]。
答案 2 :(得分:0)
你有一个Queue<String> historyQueue;
第一次加载页面时,即onModuleLoad()
,您可以Queue
初始化。
捕获历史事件时,请检查其是后退还是新的历史记录标记。
如果是后退,则将其从队列中弹出,如果是新的,则将其添加到队列中。这样,取消按钮只是token = historyQueue.pop()
并检查令牌是否为空。如果是,那就像你说的那样back = cancel
,那么就做适当的事情。