Backbone.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, маршрутизатор Backbone запускает функцию viewListing, которая аналогична функции explore, но также включает сведения об идентификаторе элемента 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: '/'
    })
}

Проблема. Как видно из приведенного выше кода, я пытался отключить 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

Как это исправить?


person Nyxynyx    schedule 06.11.2012    source источник


Ответы (1)


Если вам не нужен URL-адрес http://mydomain.com/explore/#explore, вам нужно перенаправить на 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',
}
person Andrey Kuzmin    schedule 06.11.2012
comment
Спасибо, я попробовал это, и он перенаправляет (как и ожидалось) с http://mydomain.com/explore на http://mydomain.com/#/explore. Однако http://mydomain.com — это страница приветствия/заставки, а не страница приложения (http://mydomain.com/explore) - person Nyxynyx; 06.11.2012
comment
Тогда вам, вероятно, придется удалить /explore/ из маршрутов Backbone, установить его как корень в Backbone.history.start({root: '/explore/'}). - person Andrey Kuzmin; 06.11.2012