我陷入了一种非常奇怪的境地。我有以下设置:
父窗口有一个对象“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
出于某种原因抛出“权限被拒绝”。
我认为原因是某种程度上IE“记得”xml文档是在第一个子帧中创建的(可能是出于性能原因),当第二个子帧试图访问该对象时IE无法找到它(或将其存储在受限制的内存堆栈中)。
此外,当我尝试这种情况没有重定向时 - 只需将这两个子帧放在父框架中 - 第二个子框架访问父母的xml文档没有问题。
一个解决方法可能是在分配之前将这些xml文档克隆到“父母”中,但是我们有很多这样的场景,首先我想问一下是否有人有更好的想法?
感谢。
答案 0 :(得分:2)
一旦单独的页面被垃圾收集,Internet Explorer绝对不会让您使用在单独页面中分配的JavaScript对象。你可以传递原始值,但是我已经遇到了问题(很久以前,但仍然存在),帧之间传递了“Date”实例。
您可以提取的技巧是调用父页面中的函数以从原始值创建对象:
// in parent:
function newBar(what, ever) {
return new bar(what, ever);
}
// in the frame page:
parent.foo = parent.newBar("what", "ever");
我认为会使你与问题隔离,因为对象将在父页面上使用Object构造函数进行分配,而不是框架页面中的对象构造函数。在以前的生活中,我所使用的应用程序是一个庞大的庞大的事物,涉及数以万计的iframe(对话,警告,各种各样的东西)。我一直有这个问题,保持清洁是非常痛苦的,我已经用iframe为这种东西发誓。
答案 1 :(得分:0)
只是为了分享可以帮助他人的替代解决方案。
由于IE9中对iframe对象的新处理(在此处http://msdn.microsoft.com/en-us/library/gg622929%28v=VS.85%29.aspx?ppud=4),我在IE 9中获取了针对我们的Web应用程序的权限被拒绝问题
对于我在iframe(iframe A)中的页面被刷新的情况,存储在页面中的现有值被释放。当从另一个iframe(iframe B)进行javascript调用以访问iframe A中的对象时,它获得了#34;权限被拒绝&#34;错误和脚本停止执行。
最后我使用javascript try catch来捕获错误并让脚本继续运行而不是停止执行。
try {
var testObj = testObjArray['Object in iframe A'];
} catch(err) {
alert(err);
}
希望这种替代解决方案能够帮助他人。 :)