4

トップフレームとこのトップフレーム内に2つのフレームセットがあるアプリがあります。他のページに移動している間、上部のフレームは同じままで、フレームセットのみが変更されます。一部のデータを保存するためにlocalStorageを使用しています(サーバーにも保存されていますが、クライアント上にある場合は毎回往復しません)、この機能はIE7では使用できないため、localStorageをシミュレートすることにしました。 IE7。

アイデアは、変数localStorageをトップフレームに格納することでした(localStorageが利用できない場合のみ)。トップフレームでlocalStorageが利用できない場合は常に、_data、getItem()、setItem()、removeItem()を使用してダミーのlocalStorageオブジェクトを作成します。このオブジェクトの寿命はトップフレームの寿命と同じくらい長くなります。これにより、サーバーへのラウンドトリップが大幅に節約され、IE7のパフォーマンスが大幅に向上します。

私が抱えている問題は、フレーム(トップフレームではなく)を変更し、トップフレームからlocalStorageを取得し、window.top.localStorage.getItem('…');を使用してアイテムを取得しようとするたびに発生することです。解放されたスクリプトからコードを実行できないというエラーメッセージが表示されます。

なぜ私がこれを手に入れるのか、何か考えはありますか?

4

3 に答える 3

4

、または古いまたはuserDataの動作に共通のインターフェイスを提供するjStorageを確認することをお勧めします。おそらく、jStorageを直接使用して(ここを参照)、対応するコードを書く時間を節約するか、同じアイデアを独自の実装に使用することができます。古いuserDataの動作の詳細については、たとえばここを参照してください。localStorageglobalStorage

于 2012-05-29T13:33:40.077 に答える
3

ブリリアンがすでに共有したことを繰り返すかもしれませんが、彼の答えを完全には理解していないので、いくつかのアイデア/アドバイスも共有します。

  • まず、関連するすべてのフレームが同じドメインでホストされていることを確認します(www.domain.comでトップフレームセットを開いたり、「www」のない内部リンクを設定したりするなど)。
  • クロスドメインスクリプティングが必要な場合は、それを達成するためのいくつかの関連するトリックについてインターネットをチェックしてください(理論)。
  • ローカルストレージへのすべてのアクセスをトップフレームのいくつかの関数内にラップすることを試みる価値があるかもしれません(トップフレームのオブジェクトへの直接アクセスで理論的に問題を引き起こす可能性があるいくつかの理由を考えることができます...これはこれまでのところはずですが私が仕事を知っているように)。
  • サブフレームへのすべての参照を再初期化してみてください。たとえば、window.frames参照の前に「var」を追加するのを忘れて、ナビゲーション後に再初期化しない場合があります(エラーメッセージについて説明しますが、間違いはほとんどありません)。
  • また、子フレーム内にそれ自体への参照を保持しないようにすることも価値があるかもしれませんtop.localStorage(ただし、これも問題を引き起こさないはずです)。
  • クロスプラットフォームのローカルストレージラッパーの使用を検討することをお勧めします。これらはIEの独自機能で動作する傾向があり、IEのlocalStorageのような機能も可能にします(最大1MBですが、それで十分です)。このようなライブラリの例はstore.jsです。
于 2012-05-29T13:34:07.840 に答える
2

「解放されたスクリプトからコードを実行できません」というエラーの原因を参照してください。

このエラーメッセージは、子フレーム(その後閉じられている)によって作成されたコードにアクセスしたときに発生します。これは、少なくとも、元のウィンドウが閉じられた後はJavaScript関数を保持できないことを意味します。これがデータオブジェクトにも当てはまるかどうかはわかりませんが、当てはまる可能性があります。その場合、トップウィンドウでのJavaScriptオブジェクトの単純な保存は機能しません。

データを保存する前に子ウィンドウからデータを完全に切り離すことで、この問題を回避できるはずです。これは、ストレージ関数(親ウィンドウのみで作成する必要があります)JSONでそのデータをエンコードし、エンコードされた文字列を保存することで実行できます。取得されたオブジェクトは、それを取得した子ウィンドウよりも長く保持する必要がないため、取得はそれほど面倒ではありません。

于 2012-05-25T08:48:10.860 に答える