Backbone.js вызывает ошибку только в IE7 - PullRequest
8 голосов
/ 11 февраля 2011

Я разрабатываю веб-приложение с помощью CodeIgniter на сервере и Backbone.js на сервере. Я также использую HTML5 Boilerplate в качестве моего начального шаблона.

Я использую контроллер и историю Backbone в качестве основной навигации по моему приложению. Я сделал это один раз в прошлом, и все работает нормально. Проблема в том, что когда я запускаю захват события hashchange с помощью Backbone.History.start () и нажимаю на ссылку example.com/#home, изменение хеша в URL, событие запускается, но через 2 секунды хеш очищается из URL-адреса и ошибка JavaScript бросить только в ie7.

Я взглянул на исходный код и событие hashchange достигается в IE7 путем создания IFRAME, выполняющего интервал для проверки изменения значения хеш-функции.

Кто-нибудь имел эту странную ошибку раньше и знает, как ее решить?

Ответы [ 4 ]

4 голосов
/ 15 февраля 2011

Правильный способ обработки базового приложения #hash с помощью Backbone - это Backbone.history.saveLocation (hash) и после Backbone.history.loadUrl () для включения маршрутизации контроллера.

Что я знал об этом раньше... Веселитесь с этой удивительной библиотекой MVC:)

3 голосов
/ 01 июня 2011

Решением, которое я нашел, было использование плагина hashchange Бена Алмана .Перейдите к функции запуска в Backbone.History и замените код функции запуска на этот.

start : function() {
    $(window).hashchange(this.checkUrl);
    return this.loadUrl();
}

И обязательно включите файл плагина hashchange в свой код.

2 голосов
/ 14 февраля 2011

Нажатие на хеш-URL фактически не сохраняет запись истории в IE - используйте функцию saveLocation Backbone, чтобы убрать маркер местоположения, к которому вы хотите вернуться.Для полного совка см .:

http://documentcloud.github.com/backbone/#Controller-saveLocation

1 голос
/ 28 апреля 2011

Я нашел решение этой проблемы от Джона Лейтона в официальном списке ошибок: https://github.com/documentcloud/backbone/issues/228

Пока официальное исправление не добавит его в backbone.js (строка 689 в Backbone 0.3.3)

this.iframe.document.open().close(); 
this.iframe.location.hash = window.location.hash;

после следующей строки:

this.iframe = $('iframe src="javascript:0" tabindex="-1" ').hide().appendTo('body')[0].contentWindow;

(я не могу написать полный тег i-frame <& /> - здесь это запрещено:))

...