Backbone.js PushStates:Internet Explorer的后备无法正常工作
我的网站刚刚在Backbone.js中实现了pushstates,并且IE的整个站点都已中断。 我该如何为IE创建一个后备?
我想要实现的目标
主要url: http://mydomain.com/explore
: http://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', }