3

私は本当に奇妙な状況に陥りました。私は次の設定をしています:

親ウィンドウには、xmlドキュメントと他のいくつかのプロパティを含むオブジェクト「バー」があります。

<html>
<head>
<script type="text/javascript">
var foo=null; //used in most report pages
var bar=function(document, boo){
    this.doc=document;
    this.boo=boo;
    this.baz="serge";
};
</script>
<head>  
<body>
    <iframe src="_child1.html"></iframe>
</body>
</html>

最初の子フレームは、ajaxによって単純なxmlファイルをロードします。

<html>
<head>
<script src="../lib/jquery.min.js"></script>
<script type="text/javascript">
$.ajax({
        url: "books.xml",
        type: "get",
        dataType: "xml",        
        success: function(data) {
            var boo = {
                name: "boo"
            };
            parent.foo = new parent.bar(data, boo);         
            alert(parent.foo.boo.name);
            alert(parent.foo.baz);
            alert(parent.foo.doc.firstChild.nodeName);
            window.location = "_child2.html";
        }
    });
</script>
</head>

<body>
    child1
</body>
</html>

XMLは次のとおりです。

<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
    Vaidyanathan Nagarajan
</bookstore>

成功すると、親ウィンドウに「bar」インスタンスを作成し、それを「foo」変数に格納します。この変数は、親ウィンドウに再び存在します。

次に、それらのプロパティを(正常に)出力し、2番目の子フレームにリダイレクトします。

2番目の子フレームは、親フレームの「foo」オブジェクトにアクセスして、そのプロパティを出力しようとします。

<html>
<head>
<script src="../lib/jquery.min.js"></script>
<script type="text/javascript">
alert(parent.foo.boo.name);
alert(parent.foo.baz);
alert(parent.foo.doc.firstChild.nodeName);
</script>
</head>

<body>
    child2
</body>
</html>

そして今、興味深いことが起こります。FFとChromeでは、3つのプロパティが2回起動します。1回は_child1で、2回目は_child2です。ただし、IE9では5つのアラートしか表示されません。

そして、その理由はparent.foo.doc、何らかの理由で「許可が拒否されました」をスローするためです。

その理由は、どういうわけかIEがxmlドキュメントが最初の子フレームで作成されたことを「記憶」していて(おそらくパフォーマンス上の理由で)、2番目の子フレームがそのオブジェクトにアクセスしようとしたときにIEがそれを見つけられない(または制限されたメモリスタックに保存します)。

さらに、リダイレクトせずにこのシナリオを試した場合(親フレーム内の2つの子フレームをまとめるだけ)、2番目の子フレームは親のxmlドキュメントに問題なくアクセスできました。

回避策の1つは、割り当てる前にこれらのxmlドキュメントを「親」内に複製することですが、このようなシナリオは多数あります。まず、誰かがより良いアイデアを持っているかどうかを尋ねたいと思います。

ありがとう。

4

2 に答える 2

2

Internet Explorerでは、別のページがガベージコレクションされると、別のページに割り当てられたJavaScriptオブジェクトを使用する必要がなくなります。プリミティブ値を渡すことはできますが、フレーム間で渡される「日付」インスタンスに問題があります(ずっと前ですが、それでも)。

プルできるトリックは、親ページで関数を呼び出して、プリミティブ値からオブジェクトを作成することです。

// in parent:

function newBar(what, ever) {
  return new bar(what, ever);
}

// in the frame page:

parent.foo = parent.newBar("what", "ever");

オブジェクトは、フレームページではなく、親ページのObjectコンストラクターで割り当てられるため、問題から保護されると思います。以前の生活では、私が取り組んだアプリケーションは、無数のiframe(ダイアログ、警告、あらゆる種類のもの)を含む広大なものでした。私はいつもこの問題を抱えていました、そして物事をきれいに保つことは私がその種のもののためにiframeを使うことを誓ったほど苦痛でした。

于 2011-07-17T15:32:43.370 に答える
0

他の人を助けることができる代替ソリューションを共有するだけです。

IE9でのiframeオブジェクトの新しい処理が原因で、IE 9でWebアプリケーションのアクセス許可が拒否される問題が発生していました(ここに記載されていますhttp://msdn.microsoft.com/en-us/library/gg622929%28v=VS.85 %29.aspx?ppud = 4

iframe(iframe A)内のページが更新された私の場合、ページに保存されていた既存の値が解放されました。別のiframe(iframe B)からiframe Aのオブジェクトにアクセスするためにjavascript呼び出しが行われると、「許可が拒否されました」というエラーが発生し、スクリプトの実行が停止していました。

最後に、javascript try catchを使用してエラーをキャプチャし、実行を停止する代わりにスクリプトをさらに実行させます。

  try {
      var testObj = testObjArray['Object in iframe A'];
  } catch(err) {
      alert(err);
  }

この代替ソリューションが他の人を助けることができることを願っています。:)

于 2014-08-14T07:33:56.867 に答える