在我的单页网络应用程序中,我希望在某些页面上有一个后退按钮,用户可以将用户带回浏览器历史记录中的特定点:不一定是上一页。
请注意,我不是在谈论浏览器的后退按钮,它应该照常工作。
例如,请考虑使用gmail Web应用程序。有一个文件夹视图,可能带有搜索过滤器或其他参数,然后是一个显示单个消息的消息视图。在消息视图中,有一个后退按钮,不会将您带到上一页:即使您已经点击阅读多个消息,后退按钮将返回到您最初来自的文件夹视图,然后单击任何消息。
在gmail的情况下,这是通过简单地编码URL末尾的先前状态来实现的。例如,如果你通过搜索得到这个消息,它将是:
#search/stuff/<MESSAGE_ID>
由此,应用程序知道后退按钮应指向包含以下内容的页面:
#search/stuff
但是,在我的应用程序中,在URL中对所有内容进行编码的状态太多。而不是两个视图(文件夹+消息),有三个视图,让我们称之为A,B和细节,A和B都有一大堆可能的过滤器和URL中编码的选项,我想保留在例如从B返回到A或从详细信息返回到B.在详细信息页面的URL中编码A,B和详细信息的所有参数会使URL非常难以处理。
我认为使用html5历史记录API可以很容易地实现这一点。但是,据我所知,历史API不支持阅读历史记录中的URL:您只能盲目地返回或转发。
history.js可以访问过去的州,如相关问题所述:
History API: Javascript Pushstate, get previous URL
但是,我使用的angularjs与history.js不兼容,因为它直接与历史api对话而不是通过history.js,因此由角度$ location服务引起的转换状态不显示在history.js'历史对象。
似乎我需要做以下其中一项:
我还考虑使用document.referrer查看历史记录中的上一个值,但这不起作用,因为在单页应用程序中导航时没有设置它。
答案 0 :(得分:0)
我从未使用过angular.js,但是如果你想要保证工作的话,大概就是window.history.pushState。请仔细阅读http://spoiledmilk.com/blog/html5-changing-the-browser-url-without-refreshing-page/,了解宝宝可以做些什么的详细信息。
答案 1 :(得分:0)
回答我自己的问题,我选择了@MaxArt在评论中提出的更简单的解决方案。
采用这种方法构建过去网址历史记录的更一般方法的基本原理:
(1)How do I retrieve if the popstate event comes from back or forward actions with the HTML5 pushstate?