Позвоночник.JS PushStates: запасной вариант для Internet Explorer не работает
Мой сайт только что реализовал pushstates в Backbone.js и весь сайт ломается для IE. Как создать запасной вариант для IE?
Чего я пытаюсь достичь
Основной URL: http://mydomain.com/explore
Другой URL: 'http://mydomain.com/explore/1234
Главной страницей сайта является http://mydomain.com/explore, которая запускает функцию маршрутизатора explore.
Когда пользователь посещает http://mydomain.com/explore/1234, маршрутизатор магистрали запускает функцию viewListing, которая является такой же, как функция explore, но также включает детали для идентификатора элемента 1234.
Позвоночник.JS Router
// 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: '/'
})
}
Проблема: Как вы можете видеть в приведенном выше коде, я попытался отключить pushstates с помощью pushState: false, если это несовместимый браузер.
Однако для IE, чтобы получить доступ к тому, что обычно работает для обычного браузера (http://mydomain.com/explore), IE нужно будет перейти к http://mydomain.com/explore/#explore, что делает вещи запутанными! Далее еще для доступа к http://mydomain.com/explore/1234 IE нужно перейти к http://mydomain.com/explore/#explore/1234
Как это должно быть исправлено?
1 ответ:
Если вы не хотите
http://mydomain.com/explore/#exploreurl, то вы должны перенаправить наhttp://mydomain.com/#exploreТак что вместо этого мы начнем с него.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', }
Comments