私は本当に奇妙な状況に陥りました。私は次の設定をしています:
親ウィンドウには、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ドキュメントを「親」内に複製することですが、このようなシナリオは多数あります。まず、誰かがより良いアイデアを持っているかどうかを尋ねたいと思います。
ありがとう。