Backback中的Backbone.js斜杠 - 历史pushState

时间:2011-12-11 01:45:01

标签: javascript html5 backbone.js

我正在使用Backbone.js's routing。 它会为这样的浏览器生成网址:

http://my-app.com/help

对于Internet Explorers(IE10除外)和旧的非HTML5浏览器:

http://my-app.com/#help

如何配置Backbone.js以生成带有其他斜杠的后备网址,如下所示?:

http://my-app.com/#/help

3 个答案:

答案 0 :(得分:6)

我知道这有点旧,但由于接受的答案在较新版本的Backbone中不再适用,我想我会分享我的发现。

我找到了一种方法可以让它在IE8和Chrome中运行(没有测试任何其他浏览器) - 如果你使用Backbone.history进行导航。

如果你在导航调用中使用两个前面的斜杠,它会像你想要的那样创建Url。

Backbone.history.navigate('//help');

我根本没有改变路线 - 它们不是以斜线开头的。在那里放一个斜线似乎打破了它。

我还应该注意到,我正在使用带有Backbone的Marionette,因为它可能会有所作为。

我希望这有助于某人。

答案 1 :(得分:2)

我相信你的第二个代码块与第三个完全不同。前面的斜杠在属性名称上设置。

routes: {
    "help":                 "help",    // #help
    "search/:query":        "search",  // #search/kiwis
    "search/:query/p:page": "search"   // #search/kiwis/p7
  }

不同于:

routes: {
    "/help":                 "help",    // #/help
    "/search/:query":        "search",  // #/search/kiwis
    "/search/:query/p:page": "search"   // #/search/kiwis/p7
  }

答案 2 :(得分:1)

这是一个丑陋的黑客攻击它:覆盖getHash()。这是原始代码:

getHash: function(windowOverride) {
  var loc = windowOverride ? windowOverride.location : window.location;
  var match = loc.href.match(/#(.*)$/);
  return match ? match[1] : '';
},

在向正则表达式添加额外的斜杠之后似乎有效:

Backbone.History.prototype.getHash = function(windowOverride) {
  var loc = windowOverride ? windowOverride.location : window.location;
  var match = loc.href.match(/#\/(.*)$/);
  return match ? match[1] : '';
}

此后导航可能无法正常工作,但可能会通过类似的黑客修复。