Backbone 路由器导航并锚href

hsgswve4  于 2022-11-10  发布在  其他
关注(0)|答案(4)|浏览(163)

在支持 Backbone.js 的应用程序中,我看到代码继续使用<a href="#foo"></a>,而锚单击由 Backbone.js 事件处理程序处理。
或者,导航到#foo可以通过以下方式处理:

Router.history.navigate("foo");

我相信后者是上级的方法,因为它允许轻松地移植到HTML5的pushState功能,如果我们使用pushState,对于不支持pushState的浏览器,Backbone将能够优雅地降级为#foo。
由于我还是新来的 Backbone ,有人能更有经验和知识证实这是事实吗?

k97glaaz

k97glaaz1#

我个人启用了pushState,并使用Tim Branyen的 Backbone.js 样板文件中的方法,即添加一个单击处理程序,该处理程序将所有链接单击发送到navigate,除非它们具有data-bypass属性:

$(document).on("click", "a:not([data-bypass])", function(evt) {
  var href = { prop: $(this).prop("href"), attr: $(this).attr("href") };
  var root = location.protocol + "//" + location.host + Backbone.history.options.root;

  if (href.prop && href.prop.slice(0, root.length) === root) {
    evt.preventDefault();
    Backbone.history.navigate(href.attr, true);
  }
});

这很好用,正如@nickf提到的,它的优点是你不必使用hash/hashbang黑客,即使是对于不支持pushState的浏览器。

jyztefdp

jyztefdp2#

你应该把你的链接写成它们的“正确”地址,也就是说,不要用hash来写,这只是一个绕过特定浏览器的一些缺陷的技巧。为了让它正常工作,附加一个点击处理程序来捕捉对这些项目的点击,并将url传递给Backbone.history,然后它可以使用pushState或在需要时转换成hashbang的url。例如:

$(document).on('click', 'a[href^="/"]', function (event) {
    // here, ensure that it was a left-mouse-button click. middle click should be
    // allowed to pass through
    event.preventDefault();
    Backbone.history.navigate(this.href);
});
clj7thdc

clj7thdc3#

Chris的答案很棒,但是有一个额外的东西使它更好。Backbone.history.navigate()实际上返回true或false,告诉我们它是否可以在内部路由到它。因此,我们可以跳过data-bypass属性,改为执行以下操作:

$(document).on("click", "a", function(evt) {
  var href = { prop: $(this).prop("href"), attr: $(this).attr("href") };
  var root = location.protocol + "//" + location.host + Backbone.history.options.root;

  if (href.prop && href.prop.slice(0, root.length) === root) {
    if (Backbone.history.navigate(href.attr, true)) {
      evt.preventDefault();
    }
  }
});
vyu0f0g1

vyu0f0g14#

是的,我尽量在我的Backbone应用程序中使用Router.history.navigate。这也有一个好处,如果用户在浏览器中输入URL“/foo”,Backbone会正确地路由它。显然,如果它是一个外部链接或你不想用Backbone处理的东西,那么你就不应该包含它。

相关问题