Backbone.js PushStates:Internet Explorer的后备无法正常工作

我的网站刚刚在Backbone.js中实现了pushstates,并且IE的整个站点都已中断。 我该如何为IE创建一个后备?

我想要实现的目标

主要url: http://mydomain.com/explorehttp://mydomain.com/explore

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

该网站的主页是http://mydomain.com/explore ,它触发路由器functionexplore

当用户访问http://mydomain.com/explore/1234 ,Backbone的路由器将触发functionviewListing ,这与functionexplore相同,但也包括项目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禁用pushstates pushState: false如果它是不兼容的浏览器,则为pushState: false

然而,对于IE来访问通常适用于普通浏览器的内容( http://mydomain.com/explore将需要访问http://mydomain.com/explore/#explore ,这让人感到困惑! 更多访问http://mydomain.com/explore/1234 IE需要访问http://mydomain.com/explore/#explore/1234

该如何修复?

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

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

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

UPD2:如果你想/explore/成为你的骨干路由的根,那么你必须将它从路由中排除并设置为History.start({root: "/explore/"})的根History.start({root: "/explore/"})

 routes: { '': 'explore', ':id': 'viewListing', }