IE中的骨干路由器

时间:2012-12-05 06:41:36

标签: internet-explorer backbone.js backbone-routing

当用户点击某些URL路由时,我正在使用Backbone.js路由器触发某些初始化方法。因此,通过vanilla anchor标记转到/posts/1应触发与Backbone路由器中/posts/:id相关的任何回调。当设置Backbone.history.start({ pushState : true })时,这在现代浏览器中工作正常。但是,在IE 中,尝试点击/posts/1的用户将被重定向到/#posts/1,这只是我的主页,其中包含无意义的哈希字符串。

要清楚,我不需要pushState。我不是要推送网址到浏览器历史记录。我只是想读取它们,然后触发一个回调,这在任何浏览器中都是可行的。

看起来像简单的功能,但我很难过。

谢谢!

3 个答案:

答案 0 :(得分:7)

我可以在这里回答我自己的问题。我需要的功能类型可以通过以下方式实现:

var suffix_pattern = new RegExp('\/?' + config.history_root + '\/?','i');

// if IE
if (!Modernizr.history) {

    // initialize router/Backbone.history, but turn off route parsing,
    // since non-window.history parsing will look for a hash, and not finding one,
    // will break our shit.
    Backbone.history.start({ silent: true, hashChange: true });

    // convert any post-# elements to a standard URL to be parsed by our router
    var subroute = window.location.hash.replace('#', '/').split('?')[0],
           route = window.location.pathname.replace(suffix_pattern, '') + subroute;

    Backbone.history.loadUrl(route);
} else {
    Backbone.history.start({ pushState: true, silent: true });
    Backbone.history.loadUrl(Backbone.history.getFragment().replace(suffix_pattern, '').split('?')[0]);
}

答案 1 :(得分:0)

这对我有用:Backbone.history.start({root:' / my_app_dir_here /'});

答案 2 :(得分:0)

如果您不关心不支持pushState的浏览器中的ajax页面加载,请使用选项{hashChange: false}。每次路由更改时都会导致硬页面加载。

e.g。

Backbone.history.start({ pushState: true, hashChange:false });

来自Backbone.js文档:

  

如果您想使用pushState,但有不支持它的浏览器本身使用完整页面刷新,则可以将{hashChange:false}添加到选项中。