6

我的网站刚刚在 Backbone.js 中实现了 pushstates,整个网站都因 IE 而中断。我应该如何为 IE 创建后备?

我想要达到的目标

主要网址:http://mydomain.com/explore

另一个网址:'http://mydomain.com/explore/1234

该站点的主页是http://mydomain.com/explore触发路由器功能的explore

当用户访问http://mydomain.com/explore/1234时,Backbone 的路由器会触发该函数viewListing,该函数与函数相同explore,但还包括 item id 的详细信息1234

Backbone.js 路由器

// Router
var AppRouter = Backbone.Router.extend({
    routes: {
        'explore': 'explore',
        'explore/:id': 'viewListing',
    },

    explore: function() {
        this.listingList    = new ListingCollection();
        // More code here
    },

    viewListing: function(listing_id) {
        this.featuredListingId = listing_id;    // Sent along with fetch() in this.explore()
        this.explore();
    }
});

App = new AppRouter();

// Enable pushState for compatible browsers
var enablePushState = true;  

// Disable for older browsers (IE8, IE9 etc)
var pushState = !!(enablePushState && window.history && window.history.pushState);

if(pushState) {
    Backbone.history.start({
        pushState: true,
        root: '/'
    })
} else {
    Backbone.history.start({
        pushState: false,
        root: '/'
    })
}

问题:pushState: false正如您在上面的代码中看到的,如果它是不兼容的浏览器,我尝试禁用推送状态 。

但是,对于 IE 来说,要访问正常浏览器 ( ) 正常工作的内容http://mydomain.com/explore,IE 将需要访问http://mydomain.com/explore/#explore这让事情变得混乱!更多访问http://mydomain.com/explore/1234IE需要去http://mydomain.com/explore/#explore/1234

这应该如何解决?

4

1 回答 1

2

如果您不想要http://mydomain.com/explore/#exploreurl,那么您必须重定向到, http://mydomain.com/#explore以便 Backbone 将从它开始。

if(!pushState && window.location.pathname != "/") {
  window.location.replace("/#" + window.location.pathname)
}

UPD:将路径设置为哈希时,您可能必须删除前导斜杠window.location.pathname.substr(1)

UPD2:如果您想/explore/成为主干路由的根,则必须将其从路由中排除并设置为根History.start({root: "/explore/"})

routes: {
    '': 'explore',
    ':id': 'viewListing',
}
于 2012-11-06T15:11:00.713 回答