我遇到了一个非常奇怪的情况。我有以下设置:
父窗口有一个对象“bar”,其中包括一个 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”变量中。
然后它输出这些属性(成功)并重定向到第二个子框架。
第二个子框架尝试访问父框架中的“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 个属性触发了两次:一次在 _child1 中,第二次在 _child2 中。然而,在 IE9 中,我们只看到 5 个警报!
其原因是parent.foo.doc
由于某种原因抛出“Permission denied”。
我相信原因是 IE 以某种方式“记住”xml 文档是在第一个子框架中创建的(可能是出于性能原因),而当第二个子框架尝试访问该对象时,IE 无法找到它(或将其存储在受限制的内存堆栈中)。
此外,当我在没有重定向的情况下尝试这种情况时——只是将这两个子框架放在父框架中——第二个子框架访问父框架的 xml 文档没有问题。
一种解决方法可能是在分配之前在“父母”中克隆那些 xml 文档,但是我们有很多这样的场景,首先我想问一下是否有人有更好的主意?
谢谢。