好问题。
在 PageProof,我们使用 angular.js 作为我们的框架,但是我已经在我们的网站上整合了一个完全原生的 JavaScript 版本的组件。
https://gist.github.com/jacobmarshall/bf94443c2294c555154b.
我们的应用是所谓的单页应用,我们选择使用 popstate 事件 (history api) 作为我们的 URL,而不是使用 hashchange 事件 (hashchange api)。
这样做的方式是,您必须拦截(并阻止)通常会导致浏览器刷新/重定向到另一个页面的任何事件。而是调用history.pushState,您可以在script.js 的第50 行看到它。执行此操作时,您还需要将更新的内容加载到页面上的元素中。我们实现这一点的方法是使用一个名为 ngAnimate 的模块,该模块复制视图元素,并在页面上为旧元素设置动画,并在页面上为副本设置动画。
ngAnimate 允许我们添加我们自己的动画,方法是根据每个元素是被删除还是被添加到页面来添加类。一旦动画完成,旧元素就会从页面中完全移除。
当您单击浏览器后退/前进按钮时,这一切都起作用的原因是,每当 url 更改时,window 对象上就会触发 popstate 事件。同样,当这种情况发生时,我们会将内容重新加载到页面中(就像我们拦截其他事件时一样)。
只是一个简短的说明;我为您创建的示例可能仅适用于 Chrome,如您所知。就这样,我只隔离了使这一切发生的零零碎碎的东西,没有额外的臃肿。
我们选择popstate 而不是hashchange 的原因之一是因为我们可以使用popstate 完全控制整个URL,而hashchange 只允许您更改哈希后的URL 段。所以我们得到了像 pageproof.com/dashboard 这样漂亮的 URL,而不是像 pageproof.com/#/dashboard 这样的 URL。
我注意到您没有将您的问题标记为angularjs,但如果您确实想查看它,我们使用$locationProvider.html5Mode(true) 来启用所有popstate 的东西。