少し奇妙で、私は少し困惑しています...
私はページを持っています。そのページには次のものがあります(まあ、いくつかの名前が変更されています):
$(document).ready(function() {
var router = new App.Routers.ExampleRouter();
Backbone.history.start({pushState: true});
})
ルーターは、いくつかのコレクション、ビューなどをインスタンス化するために進みます。Chrome、Safari、Firefox、および Opera では、すべてが完全に正常に機能しています。しかし、IE 8 または 9 にはありません (おそらく 10 も、テストしていません)。
IE8 または 9 では、ページが最初に要求されたときにロードが開始されますが、ドキュメントの準備が整うと (したがってルーターがインスタンス化され、履歴が開始されると)、ページはサイトのルートにリダイレクトされます。
リダイレクトの前にコンソールに何も表示されません。どういうわけかそれを実行できるコードは他にありません。つまり、私たちは大きなコードベースを持っているので、常に可能性がありますが、競合する可能性のあるルーティングや History API を扱うものは何もありません.
奇妙な部分は、pushState: true
オプションが削除された場合、ページがリダイレクトされず、必要に応じて完全に読み込まれることです-ルーターはハッシュバンスタイルのルートを期待しているため、何もしませんが、少なくともそうではありません'サイトのルートに戻りません。オプションを再度追加すると、再び壊れます...
したがって、私の最初の考えは明らかに「まあ... History API は IE8 または 9 ではサポートされていない... に違いない」というものでしたが、Backbone.js はこれらの古いブラウザのハッシュバン スタイルの URL に戻すことになっているので、それはあり得ません。
Backbone.js ルーターを処理しているときに、IE だけがホームページにリダイレクトされる原因は何ですか?
編集
(EDIT 2が何もしなかったことを証明しているため、以下はおそらく無視できますが、末尾のコンマを削除することはできます)
さて、少しデバッグして本当にストローを握りしめた後、ルーターが実際にはインスタンス化されていないことがわかりました-初期化メソッドが呼び出されておらず、ルーターでカスタムメソッドを呼び出す機能がありません(私は愚かなメソッドを作っalert
てconsole.log
) の直後に呼び出しvar router = new App.Routers.ExampleRouter();
ます。
メソッドを呼び出すと、「オブジェクトはそのプロパティまたはメソッドをサポートしていません」という行に沿ってエラーが返されました (これはすべて IE であり、他のブラウザーでは問題ありません)。これはルーターに固有のものではありませんでしたが、私も新しいモデルを呼び出して、同じことをしました。オブジェクト エラーの Google は、末尾のカンマを提案しました。コードベースにいくつかありましたが、それらをすべて削除したところ、うまくいっているように見えました。突然、ルーター (およびモデル) が非常に多く存在しました - 初期化メソッドが呼び出され、カスタム メソッドが呼び出されました。カンマが解析中のすべての JS を停止した可能性があると考えました (複数のファイルを連結します)。
私は明らかに、pushState
オプションを削除してこれらすべてを行っていました。pushState: true
次に、上記のことが起こった場合にそれを修正することを真剣に考えて追加しました. 当時私は「ああ、ルーターは実際には存在しなかったのでBackbone.History.Start({pushState: true})
、呼び出されてルートを探して送信されたのかもしれませんが、ルーターがインスタンス化されていないために存在せず、ホームページへのキックバックはほんの少しでした」と考えていました一種の副作用」ですが、残念ながら、まったく同じことがまだ起こっています. オプションを追加するpushState: true
と、ページが読み込まれず、ホームページに戻ります。
編集2
わかりましたので、さらにいくつかのことを試しましたが、役に立ちませんでした。CDN 経由で jQuery、Backbone.js、および Underscore.js を取り込み、ルーターを作成してインスタンス化し、Backbone.History.Start() を呼び出すための最低限の JavaScript を含む、完全に別の空白のページを作成しました。そのページのコード全体は次のとおりです。
<!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 でテスト済み) を除いて、すべてのブラウザーは期待どおりの動作をします。IE は再びページの読み込みを開始し、ルートを実行し、突然ホームページにリダイレクトされます。pushState をオフにして hashbangs を使用すると、すべてが期待どおりに機能するため、pushState を true に設定していないだけで、IE でルーティングが「機能」します。
できる限りすべてを取り除いたので、これがフロントエンドのものであることがわかりませんか?これがサーバー関連のものである方法はありますか?バックエンドは Ruby on Rails で、問題はローカルおよびステージング/ライブ サーバーで発生します。それとも、Backbone.js が pushState を IE で hashbang に分解する方法をひどく誤解していますか?
編集3
問題の動画をアップしました