html - 在 Dart 中管理浏览器历史记录

标签 html dart single-page-application browser-history

我正在构建一个单页 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) .这样做会自动将一个新项目添加到浏览器历史记录中(然后将启用后退按钮)。
  • 较新的 History API,它允许没有片段的常规 URL(例如 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/

    相关文章:

    html - 阻止 Firefox 中圆形按钮在圆外可点击

    java - 解密字符串时出现 InvalidCipherTextException "Pad block corrupt"

    google-maps - flutter google_maps捏以缩放

    javascript - Backbone.js View 的 render 方法中声明的变量似乎不存在?

    node.js - 使用 Node.js/Express 提供 HTML 来构建简单的 SPA

    jquery - 结合使用 jQuery 和 AngularJS?

    javascript - 固定顶部 div 后的可滚动 div

    css - 外部 div (当不 float 时)丢弃内部 <p> 边距

    javascript - 获取 iframe 中点击的元素的类?

    android - 尝试在 Flutter 中调试应用程序时显示此错误