我试图找到一个干净的解决方案,以最有效的方式使用浏览器历史记录。 (我使用GWT,但这个问题确实是比这更普遍)浏览器历史记录管理
这里是我的情况(我认为这是非常标准):
我有了几个不同的页/地方的Web应用程序/位置(无论您想要调用它),我将显示这些位置以响应浏览器历史记录的更改。除了通常的“首页”,“功能”,“联系人”等大多是静态HTML页面之外,还有一个“用户”部分,用户可以登录他们的用户帐户(我们称之为)“项目”部分,用户可以在其中进行项目工作。
所以,现在我只需使用一个名为#Home,#Features,#Contact等,以及#User,#工程才能到不同的页面本地链接。并且一切都很好,除了以下场景:
如果有人打开链接#项目,例如,该人员会显示一个项目登录对话框。此登录对话框有一个取消按钮,我希望通过简单地调用浏览器的返回按钮从我的应用程序(很简单)实现。我想这样做的原因,有两个方面:
- 你可以从在应用几个不同的位置,以及你的书签此登录对话框,并用这种方法,我就不需要跟踪用户来自哪里。
- 更重要的是:如果我不是没有记住用户从(如#Home)来和链接用户“前进”回到那个地方,我得到以下效果:
- 比方说,用户访问#家庭,然后#功能,然后单击项目登录。
- 如果用户点击取消按钮,我送他“前进”到#Features,在浏览器上的回按钮,点击之后会带回的登录对话框,然后再次#Features最后#首页。不是你所期望的。
- 相反,你会想回到#Home立即,只是你会得到什么,如果我简单地实现通过浏览器的后退功能取消。
此时一切都很好,除了当用户通过直接书签链接到#工程最初进入这个登录对话框。因为如果我只是有取消 = 返回,用户将被从网页发回到他的浏览器的开始页面或他以前的任何位置。所以,在这种情况下,我确实需要链接“转发”到#家电。
现在,我试图想几种方法来解决这个问题,并想出了一个解决方案夫妇的,但没有一个在我看来非常可取的,但让我反正分享他们或许炒作一些创造力:
- 当页面第一次打开时,抓取历史令牌。如果是#工程或#User或其他任何触发取消对话框,将下面的项目到历史堆栈:#Home,#工程,其中最后一个是保存的初始令牌。那么,这可以让我取消按钮的功能正确......一旦...但是,如果用户点击回事后,他将获得再次登录对话框(因为原来的历史令牌仍处于历史堆栈我不知道如何清除它)。点击取消然后会将他从页面中移除(不一致的行为)。
- 我可以改为放置#+++,#Home,#工程到堆栈中,那么这将让我赶上回点击,将通过检测需要用户在页面#+++链接,并简单地重新添加#主页令牌到堆栈上。这样就解决了问题,整体工作很漂亮,但我不喜欢的网站,不要让你背出他们不迅速锤击后退按钮足够了...
- 最干净的解决办法是,如果我能以某种方式跟踪历史堆栈的长度与我应用中的位置有关。在开始时足够简单:它上面有一个项目。但是如果我得到这样的一系列地点:#家庭,#特色,#家庭?用户是否点击返回回到#家庭,即历史现在在浏览器中是长度1,或者他点击了#家庭链接,即历史是长度3?我检测,这将是想法:
- 定义,即#Home相同#home。
- 使页面中的所有链接仅链接到链接的大写版本。
- 每当您收到以 大写字母开头的历史更改通知时,请立即向历史记录添加两个项目,第一个以小写字母开头,第二个以大写字母开头。即#Home变成#Home,#home,#Home。
- 如果你有机会与一个小写字母开头的历史变化,你知道用户只需点击回,而不是一个链接,你只需点击回两次为他真正得到回上一页。
- 现在您可以区分“后退”和“前进”链接,并在代码中保留精确的历史记录模型。
- 但是,不幸的是,有两个问题:第一,浏览器历史杂乱无章(不是很优雅),第二,系统开始崩溃,如果用户点击回足够快您的应用没有时间对消息做出反应。
看起来这应该是一个非常普遍的问题,我希望你们可以点我更有用的方向上比我的想法至今。
您是否考虑过使用客户端路由系统(如angularjs提供的路由系统)? http://angularjs.org它可以使用html5的推送权益来跟踪后退和前进,并为您提供处理直接到达路线的客户的工具。 – SuitedSloth
@thatjuan angularjs似乎功能非常丰富,可能需要一段时间才能筛选出来。你是否足够了解它在几句话中总结了与我的问题相关的部分?这将是非常有益的,谢谢。 –
你看过活动和地方吗? https://developers.google.com/web-toolkit/doc/latest/DevGuideMvpActivitiesAndPlaces你试图发明自己的解决方案的任何理由? –