1

iframe内で、ユーザーが多くの異なるページに移動することを期待しているページがありiframeます。それらはすべて、親ページと同じドメインにあります。

トップレベルのウィンドウに永続オブジェクトがあります。それを呼び出しましょうappData。そしてiframeでは私はしばしば次のような行を持っています

parent.appData[someProperty] = {a : 1, b : 2};

解放されたスクリプトエラーの一般的な問題を認識しており、元のドキュメントがアンロードされている可能性があるため、そのようなオブジェクトで任意のメソッドを呼び出そうとすべきではないことを理解していますが、確かhasOwnPropertyにそのようなメソッドであってはなりません。後続の子ページで、次のように言うことができます。

if (parent.appData[someProperty].hasOwnProperty('a'))

私はいけませんか?そして、これが奇妙なことです。MSIE10を除いて、テストしたすべてのブラウザーで期待どおりに機能します。hasOwnProperty()を呼び出すと、IE9の「解放されたスクリプトからコードを実行できません」に対する最近の回答が表示されましたin私の場合は問題ありませんが、ずっと「不正行為」をしているのか、それともMSIE10のバグなのか疑問に思っています。

jsFiddleはiframeを処理しないため、例を使用してこれを示す最善の方法がわかりません。申し訳ありません。

4

1 に答える 1

1

個人的には、などの組み込み関数を含め、解放されたスクリプトの問題が心配な場合は、すべての関数を同じように処理しますhasOwnProperty。その特定のケースでは、技術的にはオブジェクトの関数として解釈される可能性があり、一部のブラウザーはそれをそのように扱い(IE10)、他のブラウザーはまだアクセス可能な特別なケースとして扱います(他のブラウザーは言及します)。それがすべてのブラウザで機能したとしても、私はそれについてまだ間違っていると感じます。

したがって、正確なケースについてはわかりませんが、代わりに次のようなことを行うことができます。

var appData = parent.appData || {};
var someProperty = appData[someProperty] || {};
if(someProperty[a] !== undefined){
    ..
}

それ以外の場合は、常にそれを囲むことができますtry..catch

更新
そしてもちろんin、リンクされた質問で述べたように、あなたも使うことができます。

于 2013-01-22T15:14:43.173 に答える