Backbone.js: обходной путь для реализации URL-адреса на основе слеша с помощью pushstate в Internet Explorer - PullRequest
4 голосов
/ 24 февраля 2012

Я сделал полный беспорядок прямо сейчас.Я обновил до Backbone.js 0.9.1, обновил до URL-адресов с косой чертой и начал использовать pushstate:true.Спустя 5 дней я тестирую свое приложение на IE9, и URL-адреса просто не привязываются к странице, на которую они ссылаются.

Я сделал что-то вроде этого:

main.html

<a href="/signup">Do Signup</a>

Браузер переходит к mydomain.com/signup на секунду, затем возвращается к main.html с URL mydomain.com/#signup.

Возвращение к pushstate:true действительно решает проблему простых ссылок, но разбиваетвещи, в которых я определил, что маршрутизатор должен иметь такие маршруты, как ...

SignupRouter = Backbone.Router.extend({
  routes: {
    'signup': 'signup',
    'signup/:key': 'confirm'
  }, initialize: function() {
    // do some stuff here
  }, signup: function() {
    // signup view
  }, confirm: function() {
    // confirm view
  }
});

Если я не использую pushstate, мне придется вернуться к стратегии создания отдельного маршрута для каждой страницы и загрузки на основе маршрутизатора.на серверной переменной (я знаю, очень примитивно):

SignupRouter = Backbone.Router.extend({
  initialize: function() {
    // signup view
  }
});

ConfirmSignupRouter = Backbone.Router.extend({
  initialize: function() {
    // confirm view
  }
});

Есть ли какой-нибудь дружественный для IE способ сделать это (IE7 ~ 9)?Какой-то обходной путь на стороне сервера?Что-нибудь?

1 Ответ

7 голосов
/ 28 февраля 2012

Если отключение pushState заставляет его работать в браузерах, которые его не поддерживают, попробуйте использовать тест BackState для магистральной сети, чтобы предварительно отключить его (этот код основан на переменной _hasPushState в источнике Backbone):

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

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

Backbone.history.start({ pushState: pushState });
...