IE9“权限被拒绝”在由不再存在的帧创建的xml文档上

时间:2011-07-17 15:23:18

标签: javascript internet-explorer-9 frames xmldocument permission-denied

我陷入了一种非常奇怪的境地。我有以下设置:

父窗口有一个对象“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文档克隆到“父母”中,但是我们有很多这样的场景,首先我想问一下是否有人有更好的想法?

感谢。

2 个答案:

答案 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);
  }

希望这种替代解决方案能够帮助他人。 :)