これはトリッキーな問題で、数日間頭を悩ませてきました。
私は、10年前のWebアプリケーションを取得し、それを1ページのアプリケーションとして作り直すプロジェクトに取り組んでいます。アプリケーションは巨大です-私たちが作業しなければならない時間は非常にタイトなので、いくつかのショートカットを作成する必要がありました。
しかし、全体として、いくつかの興味深い技術的ハードルを克服しなければならなかったので、私は私たちがどれだけ遠くまで来たかに非常に感銘を受けました。
1つは、すべてのカスタムウィンドウ変数をクリアすることでした。アプリケーションのさまざまなページを動的に再読み込みするため、競合が発生しないように、すべてのカスタム変数をクリアする必要があります。まず、アプリケーションのベースブートストラップをロードし、ウィンドウオブジェクトのすべてのプロパティを配列に保存します。
次に、新しい各ページをロードする前に、ウィンドウのプロパティをループして、保存された配列にないすべてのオブジェクトをクリアします(ページがロードされる前のウィンドウの状態に戻ります)。
これで、IE7とIE8(どちらもサポートする必要があります)を除いて、テストしたすべてのブラウザーで正常に機能します。問題は、グローバル変数が常にウィンドウオブジェクトに登録されているとは限らないことです。
誰かがこの問題について何か洞察を持っていますか?このIE7に取り組む方法はありますか?
任意の情報をいただければ幸いです。
編集:ブートストラップのロード時にこれを行います:
for (i in window) {
this.globalVars[i] = 1;
}
そして、(AJAXを介して)新しいページをロードするとき、次のことを行います。
for (i in window) {
if (!this.globalVars[i]){
window[i] = undefined;
}
}
最終的解決:
結局、限られた時間で最も簡単な修正は、varxとして定義されたすべての変数を変更することでした。var x=nullへ;
しかし、私が見つけた別の解決策がありました。ここに、別のソリューションの開始点として使用した小さなライブラリがありました:http ://www.thomasfrank.se/global_namespace.html
完全ではありません(たとえば、クロスドメインスクリプトがクラッシュしないように、AJAX呼び出しの周りにtry-catchブロックを追加するなど、もう少し安定させるために微調整が必要になる場合があります)。それが機能する方法は、すべての外部スクリプトファイルと内部スクリプトが解析され、ウィンドウオブジェクトからプロパティをクリアするために使用できる大量の単語を抽出することです。
私たちは実際に非常に奇妙なことを経験しました-このスクリプトは多くの変数を適切に取得していませんでした...それはdocument.scriptsを使用して、ページにロードされたすべてのスクリプトをループして解析できるようにします彼ら。問題は、jQueryがその方法でページ上の外部ページをロードしないことです。それが行うことは、私が知っていることからexecにコードを渡すことです。そのため、スクリプトタグは実際にはページに追加されません。
これに対する修正は、生のAJAX応答を解析し、すべてのスクリプトタグへの参照を保存し(そして、おそらくインラインスクリプトを抽出します)、これらのファイルを処理できるようにライブラリを変更することです。これは機能するはずですが、速度の理由から、この処理はすべて怖すぎました。すべての変数定義を検索して置換するだけで、ページの読み込みごとに大量の作業を必要とせずにほとんどの作業を実行できることがわかりました。どの道をたどるべきかは明らかです。