我正在构建一个单页 Dart Web 应用程序,它基本上由 1 个 Dart 文件(交叉编译为 JS)和 1 个具有多个“ View ”(屏幕、页面等)的 HTML 文件组成。在里面。根据用户当前所在的“ View ”,我将隐藏/启用此 HTML 文件中定义的不同 DOM 元素。这样,用户可以在 View 之间导航,而不会触发多个页面加载。
我还是想使用每个浏览器的原生历史跟踪机制,这样用户点击就可以在浏览器中的后退和前进按钮,我会有一个 Dart Historian
对象根据浏览器历史记录中的 URL 确定要加载的 View (同样只是隐藏/启用 DOM 元素)。
我几乎想通了一切,除了一个异常(exception):
假设用户当前在“查看”#3,其 URL 为 http://myapp.example.com/#view3
.然后他们单击一个按钮,该按钮应将他们带到 View #4,例如 http://myapp.example.com/#view4
。 .在 Dart 中,我需要一种方法来告诉浏览器:
http://myapp.example.com/#view4
在浏览器网址栏中http://myapp.example.com/#view4
浏览器历史我相信我可以像这样完成上面的#1:
window.location.href = "http://myapp.example.com/#view3";
...但也许不是。无论哪种方式,我怎样才能做到这一点(Dart 代码与浏览器的历史 API 通信)?
最佳答案
查看 route图书馆。
angular.dart它也有自己的路由机制,但它是更大框架的一部分,所以除非你打算使用它的其余部分,否则我会推荐独立的路由库。
如果您想构建自己的解决方案,可以查看路线的client.dart寻找灵感。
支持两种历史导航方式:
window.location.assign(newPathWithPageFragment)
.这样做会自动将一个新项目添加到浏览器历史记录中(然后将启用后退按钮)。 http://myapp.example.com/view3
。您可以使用 window.history 来控制历史记录。History API 仅由较新的浏览器支持,因此这可能是一个问题(尽管考虑到 dart2js 也只支持较新的浏览器,可能没有太多 dart2js 支持的浏览器实例不支持 History API)。如果您支持 History API,您必须处理的一个问题是初始页面加载。当用户导航到
http://myapp.example.com/view3
,浏览器希望在该位置找到资源。您必须设置您的服务器以通过为您的 Dart 应用程序提供服务来响应任何页面请求,然后导航到客户端上的正确 View 。无论您使用 route、angular.dart 还是构建自己的解决方案,此问题都将适用,因为这是一般的服务器端问题,以上都是客户端库。
关于html - 在 Dart 中管理浏览器历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20909089/