Backbone.js вызывает ошибку только в IE7

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

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

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

Кто-нибудь уже сталкивался с этой странной ошибкой и знает, как ее решить?


person Dominic Mercier    schedule 11.02.2011    source источник


Ответы (4)


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

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

person Dominic Mercier    schedule 15.02.2011
comment
Backbone.history.start() работает корректно, кроме IE7. Кажется, что IE7 не вызывает событие hashchange. В моем случае я использовал Modernizr.hashchange, чтобы сначала проверить, поддерживается ли он. Если нет, я буду использовать .saveLocation() и .loadUrl(). - person Shiki; 08.03.2011

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

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

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

person Kyle Buchanan    schedule 31.05.2011

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

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

person jashkenas    schedule 14.02.2011
comment
К сожалению, saveLocation в Backbone не запускает событие hashchange, и все мое приложение нуждается в этой функции. У меня есть эта ошибка в консоли отладки IE SCRIPT1014: Invalid character javascript:0,line 1 character 2;, которая, похоже, связана с невидимым IFRAME IE. Есть идеи, как это исправить? - person Dominic Mercier; 14.02.2011
comment
Я протестировал другой учебник по Backbone.js, в котором используется история Backbone, и та же проблема возникла в IE7. Вот URL демонстрации, сделанной Эльфом Штернбергом ссылка. Как вы можете видеть, когда вы нажимаете на элемент, хэш меняется на #item/c1 и снова меняется на # через 50 мс (это кадр интервала, проверяющий изменение хэша). Может быть, мы оба используем неправильную историю Backbone? Можете ли вы предоставить какое-то реальное использование случая? - person Dominic Mercier; 14.02.2011
comment
Проблема в том, что поведение в ie7 полностью отличается от другого браузера. Хештег не загружается при загрузке страницы, хештег не сохраняется в истории автоматически после изменения, как в других браузерах. Думаю, это нужно будет решить в будущем, чтобы все браузеры вели себя одинаково. - person Julien; 18.03.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 ‹ & /> - здесь это не разрешено :))

person Robert Muehsig    schedule 28.04.2011