бит странный, и я немного озадачен...
У меня есть страница, на этой странице следующее (ну, с несколькими изменениями имени):
$(document).ready(function() {
var router = new App.Routers.ExampleRouter();
Backbone.history.start({pushState: true});
})
Маршрутизатор продолжает создавать экземпляры, просматривать и т.д. Все работает отлично в Chrome, Safari, Firefox и Opera. Но не в IE 8 или 9 (может быть, 10 тоже, я не тестировал).
В IE8 или 9, когда страница сначала запрашивается, она начинает загружаться, но как только документ будет готов (и, следовательно, создается экземпляр роутера и история началась), страница перенаправляется на корень сайта.
В консоли нет ничего, что я мог видеть до перенаправления. Нет никакого кода в другом месте, который мог бы как-то это сделать - я имею в виду, что у нас есть большая база кода, поэтому всегда это возможно, но нет ничего, что касается маршрутизации или API истории, которые могут быть противоречивыми.
Странная часть - это если опция pushState: true
удалена, страница не перенаправляется, она загружается полностью, как и должно быть - маршрутизатор не собирается делать что-либо, поскольку теперь он ожидает маршрутов стиля hashbang, но это, по крайней мере, не приведет вас к корню сайта. Добавьте параметр обратно, и он снова сломается...
Итак, моя первая мысль была явно "Ну... API истории не поддерживается в IE8 или 9... должно быть, это", но тогда Backbone.js должен вернуться к URL-адресам стиля hashbang для тех, кто старше браузеров, так что этого не может быть.
Что на самом деле заставляет IE переадресовывать обратно на главную страницу при работе с маршрутизатором Backbone.js?
ИЗМЕНИТЬ
(Ниже можно, вероятно, проигнорировать сейчас, поскольку EDIT 2 доказывает, что он ничего не сделал, хотя yay для удаления концевых запятых)
Хорошо, поэтому, после небольшой отладки и действительно сжимая соломинку, я обнаружил, что на самом деле маршрутизатор не был создан - никакой метод инициализации не вызван, нет возможности вызвать пользовательские методы на маршрутизаторе (я просто сделал глупый метод alert
и console.log
) и вызвал его сразу после var router = new App.Routers.ExampleRouter();
.
Вызов метода возвращал ошибку по строкам: "объект не поддерживает это свойство или метод" (все это снова IE, отлично в других браузерах). Однако это не было уникальным для маршрутизатора, я также применил новую модель и сделал то же самое, одно и то же... просто не был "замечен". Google об ошибке объекта предложил запятые. Правильно, в кодовой базе были некоторые, я удалил их все, и казалось, что все идет хорошо. Внезапно маршрутизатор (и модель) был там очень много - метод инициализации вызвал, вызванный специальный метод и т.д. Я понял, что запятые, возможно, остановили все анализируемые JS (мы конкатенируем несколько файлов).
Я, очевидно, делал все это с удаленной опцией pushState
. Затем я добавил pushState: true
обратно в искреннее мышление, которое исправило бы это, если бы это произошло. В то время я думал: "Ах, роутер никогда не существовал", поэтому, возможно, Backbone.History.Start({pushState: true})
был вызван, отправил его в поисках маршрута, и никто из них не существовал из-за того, что маршрутизатор не был создан, и откат на главную страницу был всего лишь своего рода побочным эффектом ", но, увы, нет, то же самое все еще происходит. Добавьте в опцию pushState: true
, и страница просто не загружается и возвращает вас на домашнюю страницу.
РЕДАКТИРОВАТЬ 2
Хорошо, поэтому я пробовал некоторые другие вещи безрезультатно. Я сделал совершенно отдельную пустую страницу, которая вытаскивает jQuery, Backbone.js и Underscore.js через CDN и содержит некоторые баребоны JavaScript для создания маршрутизатора, создания экземпляра и вызова Backbone.History.Start(). Код целиком для этой страницы:
<!DOCTYPE html>
<html>
<head>
<title>Test IE</title>
<script src="http://cdnjs.cloudflare.com/ajax/libs/jquery/1.8.0/jquery-1.8.0.min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.3.3/underscore-min.js"></script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/backbone.js/0.9.2/backbone-min.js"></script>
<script>
$(document).ready(function(){
App = {
Routers: {
}
};
App.Routers.RouterTest = Backbone.Router.extend({
routes: {
"ietest.html" : "helloWorld"
},
initialize: function() {
console.log("router init");
},
helloWorld: function() {
alert("helloWorld!")
}
});
router = new App.Routers.RouterTest();
Backbone.history.start({pushState: true});
});
</script>
</head>
<body>
</body>
</html>
То, что это, полностью баребоны, никакого влияния от других активов сайта и т.д. То же самое все же происходит. Все браузеры делают то, что ожидается, кроме IE (проверено на 8 и 9), который снова начинает загружать страницу, затем выполняет маршрут и внезапно перенаправляется на главную страницу. Если я отключу pushState и использую hashbangs, все будет работать так, как ожидалось, - поэтому маршрутизация "работает" для меня в IE, но не с pushState, установленным в true.
Я не вижу, что это больше похоже на интерфейс, поскольку я убрал все, что могу. Есть ли способ, связанный с сервером? Back-end - это Ruby on Rails, и проблема проявляется локально и на промежуточных серверах. Или я грубо неправильно понял, как Backbone.js деградирует pushState для hashbangs с IE?
РЕДАКТИРОВАТЬ 3