Backbone.js 和 pushState

IT技术 javascript backbone.js
2021-03-05 00:10:00

如果我在主干路由器中启用 pushState,是否需要在所有链接上使用 return false 或主干是否自动处理?是否有任何示例,包括 html 部分和脚本部分。

4个回答

这是 Tim Branyen 在他的样板文件中使用的模式

initializeRouter: function () {
  Backbone.history.start({ pushState: true });
  $(document).on('click', 'a:not([data-bypass])', function (evt) {

    var href = $(this).attr('href');
    var protocol = this.protocol + '//';

    if (href.slice(protocol.length) !== protocol) {
      evt.preventDefault();
      app.router.navigate(href, true);
    }
  });
}

使用它,而不是单独对链接执行 preventDefault ,您让路由器默认处理它们并通过具有data-bypass属性来进行例外处理根据我的经验,它可以很好地作为一种模式。我不知道周围有什么很好的例子,但自己尝试一下应该不会太难。Backbone 的美在于它的简单性 ;)

href.slice(protocol.length)其实应该href.slice(0, protocol.length)吗?
2021-04-25 00:10:00
提醒一下 - 我注意到 IE7 在某些我期望相对 URL 的情况下返回了绝对 URL。为了处理这种情况,您需要href在调用导航之前将 的值标准化为相对路径。
2021-04-27 00:10:00
我在样板项目的任何地方都找不到上面关于锚点处理的片段。项目被清空了吗?
2021-04-27 00:10:00
这个要点可能会有所帮助,它说“确保协议不是 URL 的一部分,这意味着它是相对的。” 话虽如此,似乎有更简单(也更不笨拙)的方法来做到这一点。
2021-05-02 00:10:00
只是好奇, (href.slice(protocol.length) !== protocol) 在做什么?
2021-05-17 00:10:00
 $(document.body).on('click', 'a', function(e){
   e.preventDefault();
   Backbone.history.navigate(e.currentTarget.pathname, {trigger: true});
 });

match()startsWith()(ES 6) 也可用于检查协议。如果您想按pathname属性支持绝对网址,请检查基本网址location.origin

function(evt) {
  var target = evt.currentTarget;
  var href = target.getAttribute('href');

  if (!href.match(/^https?:\/\//)) {
    Backbone.history.navigate(href, true);
    evt.preventDefault();
  }
  // or

  var protocol = target.protocol;

  if (!href.startsWith(protocol)) {
    // ...
  }
  // or

  // http://stackoverflow.com/a/25495161/531320
  if (!window.location.origin) {
    window.location.origin = window.location.protocol 
     + "//" + window.location.hostname
     + (window.location.port ? ':' + window.location.port: '');
  }

  var absolute_url = target.href;
  var base_url = location.origin;
  var pathname = target.pathname;

  if (absolute_url.startsWith(base_url)) {
    Backbone.history.navigate(pathname, true);
    evt.preventDefault();
  }
}

您可以防止<a>在 html中点击标签的默认行为只需在<script />标签内添加以下代码即可

<script>
$(document).on("click", "a", function(e)
{
    e.preventDefault();
    var href = $(e.currentTarget).attr('href');
    router.navigate(href, true);router
});
</script>